diff --git a/src/main/java/ru/soune/nocopy/controller/UserController.java b/src/main/java/ru/soune/nocopy/controller/UserController.java index 8029073..6e3c463 100644 --- a/src/main/java/ru/soune/nocopy/controller/UserController.java +++ b/src/main/java/ru/soune/nocopy/controller/UserController.java @@ -9,8 +9,10 @@ import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.register.ChangePasswordRequest; import ru.soune.nocopy.dto.register.RegAnswer; import ru.soune.nocopy.dto.register.RegRequest; +import ru.soune.nocopy.dto.tarriff.TariffInfoDTO; import ru.soune.nocopy.dto.user.UserDTO; import ru.soune.nocopy.dto.user.UserRequest; +import ru.soune.nocopy.entity.tarif.Tariff; import ru.soune.nocopy.entity.tarif.TariffInfo; import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.user.User; @@ -20,8 +22,8 @@ import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.mapper.UserMapper; import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.UserRepository; +import ru.soune.nocopy.service.file.FileStatsService; import ru.soune.nocopy.service.register.AuthService; -import ru.soune.nocopy.service.tariff.TariffInfoService; import ru.soune.nocopy.service.tariff.TariffService; import ru.soune.nocopy.service.user.UserService; @@ -49,12 +51,15 @@ public class UserController { private final TariffService tariffService; + private final FileStatsService fileStatsService; + @GetMapping("/all") public ResponseEntity> getAllUsers() { List allUsers = userRepository.findAll().stream() .map(u -> new UserDTO(u.getFullName(), u.getCompanyName(), u.getEmail(), u.isActive(), u.getPhone(), u.getGenderType(), - u.getBirthday(), u.getCreatedAt(), u.getSubscriptionType(), tariffService.getAllTariffs(), u.getPersonalTariffInfo())) + u.getBirthday(), u.getCreatedAt(), u.getSubscriptionType(), tariffService.getAllTariffs(), + null)) .toList(); return ResponseEntity.ok(allUsers); @@ -82,9 +87,32 @@ public class UserController { if (user.canManageCompanySettings() || user.canLogin() && user.getCompany() == null) { userDTO.setTariffs(tariffService.getAllTariffs()); + Long fileOnDisk = user.canManageCompanySettings() ? + fileStatsService.calculateCompanyFileSize(user.getId()): + fileStatsService.calculateUserFileSize(user.getId()); + + Integer filesCount = user.canManageCompanySettings() ? + fileStatsService.filesCompanyCount(user.getId()): + fileStatsService.filesUserCount(user.getId()); + TariffInfo personalTariffInfo = user.getPersonalTariffInfo(); + Tariff tariff = personalTariffInfo.getTariff(); + + TariffInfoDTO infoDTO = TariffInfoDTO.builder().tokens(personalTariffInfo.getTokens()) + .id(personalTariffInfo.getId()) + .tariffName(tariff.getName()) + .status(personalTariffInfo.getStatus().name()) + .tariffId(tariff.getId()) + .currentFileCounts(filesCount) + .maxFileCounts(tariff.getMaxFilesCount()) + .currentFileOnDisk(fileOnDisk) + .maxFileOnDisk(tariff.getDiskSize()) + .startTariff(personalTariffInfo.getStartTariff()) + .endTariff(personalTariffInfo.getEndTariff()) + .build(); + + userDTO.setTariffInfo(infoDTO); - userDTO.setTariffInfo(personalTariffInfo); } userDTO.setPhone(user.getPhone()); diff --git a/src/main/java/ru/soune/nocopy/dto/tarriff/TariffInfoDTO.java b/src/main/java/ru/soune/nocopy/dto/tarriff/TariffInfoDTO.java index 64a4461..dc93c75 100644 --- a/src/main/java/ru/soune/nocopy/dto/tarriff/TariffInfoDTO.java +++ b/src/main/java/ru/soune/nocopy/dto/tarriff/TariffInfoDTO.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.dto.tarriff; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -9,6 +10,7 @@ import java.time.LocalDateTime; @Data @NoArgsConstructor @AllArgsConstructor +@Builder public class TariffInfoDTO { private String id; private String status; @@ -16,4 +18,9 @@ public class TariffInfoDTO { private LocalDateTime endTariff; private Long tariffId; private String tariffName; + private Integer tokens; + private Long maxFileOnDisk; + private Long currentFileOnDisk; + private Integer currentFileCounts; + private Integer maxFileCounts; } \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/dto/user/UserDTO.java b/src/main/java/ru/soune/nocopy/dto/user/UserDTO.java index 3bbeb8e..c6346ac 100644 --- a/src/main/java/ru/soune/nocopy/dto/user/UserDTO.java +++ b/src/main/java/ru/soune/nocopy/dto/user/UserDTO.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import ru.soune.nocopy.dto.tarriff.TariffDTO; -import ru.soune.nocopy.entity.tarif.TariffInfo; +import ru.soune.nocopy.dto.tarriff.TariffInfoDTO; import ru.soune.nocopy.entity.user.GenderType; import ru.soune.nocopy.entity.user.SubscriptionType; @@ -28,5 +28,5 @@ public class UserDTO { private LocalDateTime createdAt; private SubscriptionType subscriptionType; private List tariffs; - private TariffInfo tariffInfo; + private TariffInfoDTO tariffInfo; } diff --git a/src/main/java/ru/soune/nocopy/entity/tarif/TariffInfo.java b/src/main/java/ru/soune/nocopy/entity/tarif/TariffInfo.java index 9900595..18504d0 100644 --- a/src/main/java/ru/soune/nocopy/entity/tarif/TariffInfo.java +++ b/src/main/java/ru/soune/nocopy/entity/tarif/TariffInfo.java @@ -28,6 +28,9 @@ public class TariffInfo { @Column(name = "end_tariff") private LocalDateTime endTariff; + @Column(name = "tokens") + private Integer tokens; + @ManyToOne @JoinColumn(name = "tariff_id") private Tariff tariff; diff --git a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java index 5ef7dd9..1ad624b 100644 --- a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java @@ -52,7 +52,7 @@ public class ImageFoundRequestHandler implements RequestHandler { //TODO uncommited when add billing // GoogleVisionSearchResponse googleVisionSearchResponse = googleVisionSearchService.searchByFileEntity(fileId); - checkCounterService.incrementCheckCount(fileEntity.getUserId()); +// checkCounterService.incrementCheckCount(fileEntity.getUserId()); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), response); diff --git a/src/main/java/ru/soune/nocopy/handler/TariffInfoHandler.java b/src/main/java/ru/soune/nocopy/handler/TariffInfoHandler.java index 1b39027..7c53c9f 100644 --- a/src/main/java/ru/soune/nocopy/handler/TariffInfoHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/TariffInfoHandler.java @@ -10,13 +10,16 @@ import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.tarriff.TariffInfoDTO; import ru.soune.nocopy.dto.tarriff.TariffInfoRequest; import ru.soune.nocopy.dto.tarriff.TariffInfoResponse; +import ru.soune.nocopy.entity.tarif.Tariff; import ru.soune.nocopy.entity.tarif.TariffStatus; import ru.soune.nocopy.entity.tarif.TariffType; +import ru.soune.nocopy.repository.TariffRepository; import ru.soune.nocopy.service.tariff.TariffInfoService; import java.time.LocalDateTime; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @Component @@ -28,6 +31,8 @@ public class TariffInfoHandler implements RequestHandler { private final TariffInfoService tariffInfoService; + private final TariffRepository tariffRepository; + @Override public BaseResponse handle(BaseRequest request) throws Exception { try { @@ -68,14 +73,15 @@ public class TariffInfoHandler implements RequestHandler { private BaseResponse handleCreateTariffInfo(BaseRequest request, TariffInfoRequest tariffInfoRequest) { try { - TariffInfoDTO tariffInfoDTO = new TariffInfoDTO( - null, + Long tariffId = tariffInfoRequest.getTariffId(); + Tariff tariff= tariffRepository.findById(tariffId).orElseThrow(); + + TariffInfoDTO tariffInfoDTO = new TariffInfoDTO(null, tariffInfoRequest.getStatus() != null ? tariffInfoRequest.getStatus() : TariffStatus.ACTIVE.name(), tariffInfoRequest.getStartTariff() != null ? tariffInfoRequest.getStartTariff() : LocalDateTime.now(), tariffInfoRequest.getEndTariff() != null ? tariffInfoRequest.getEndTariff() : LocalDateTime.now().plusDays(30), - tariffInfoRequest.getTariffId(), - null - ); + tariffInfoRequest.getTariffId(), tariff.getName(), tariff.getTokens(), tariff.getDiskSize(), 0L, + 0, tariff.getMaxFilesCount()); TariffInfoDTO createdTariffInfo = tariffInfoService.createTariffInfo(tariffInfoDTO); @@ -154,6 +160,8 @@ public class TariffInfoHandler implements RequestHandler { null ); } + Long tariffId = tariffInfoRequest.getTariffId(); + Tariff tariff = tariffRepository.findById(tariffId).orElseThrow(); TariffInfoDTO tariffInfoDTO = new TariffInfoDTO( tariffInfoRequest.getId(), @@ -161,7 +169,7 @@ public class TariffInfoHandler implements RequestHandler { tariffInfoRequest.getStartTariff(), tariffInfoRequest.getEndTariff(), tariffInfoRequest.getTariffId(), - null + tariff.getName(), null, tariff.getDiskSize(), null, null, tariff.getMaxFilesCount() ); TariffInfoDTO updatedTariffInfo = tariffInfoService.updateTariffInfo( diff --git a/src/main/java/ru/soune/nocopy/service/file/FileStatsService.java b/src/main/java/ru/soune/nocopy/service/file/FileStatsService.java index 10f23e4..aafeebf 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileStatsService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileStatsService.java @@ -7,15 +7,24 @@ import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.FileStatus; import ru.soune.nocopy.entity.file.FileType; import ru.soune.nocopy.entity.file.ProtectionStatus; +import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.repository.FileEntityRepository; +import ru.soune.nocopy.repository.UserRepository; +import ru.soune.nocopy.service.CompanyService; +import java.util.ArrayList; import java.util.List; @Service @RequiredArgsConstructor public class FileStatsService { + private final FileEntityRepository fileEntityRepository; + private final CompanyService companyService; + + private final UserRepository userRepository; + public FileInfoUserResponse getUserFileStats(Long userId) { List userFiles = fileEntityRepository.findByUserId(userId); return calculateStats(userFiles); @@ -49,6 +58,47 @@ public class FileStatsService { .build(); } + public Long calculateUserFileSize(Long userId) { + List userFiles = fileEntityRepository.findByUserId(userId); + + return calculateTotalSize(userFiles); + } + + public Long calculateCompanyFileSize(Long userId) { + User user = userRepository.findById(userId).orElseThrow(); + + List companyUsers = companyService.getCompanyUsers(user.getCompany().getId()); + + List userFiles = new ArrayList<>(); + + for (User companyUser : companyUsers) { + userFiles.addAll(fileEntityRepository.findByUserId(companyUser.getId())); + } + + return calculateTotalSize(userFiles); + } + + public Integer filesUserCount(Long userId) { + List userFiles = fileEntityRepository.findByUserId(userId); + + return calculateTotalCount(userFiles); + } + + + public Integer filesCompanyCount(Long userId) { + User user = userRepository.findById(userId).orElseThrow(); + + List companyUsers = companyService.getCompanyUsers(user.getCompany().getId()); + + List userFiles = new ArrayList<>(); + + for (User companyUser : companyUsers) { + userFiles.addAll(fileEntityRepository.findByUserId(companyUser.getId())); + } + + return calculateTotalCount(userFiles); + } + private Long protectedUserFiles(List files) { return files.stream().filter(file -> file.getProtectionStatus() == ProtectionStatus.PROTECTED).count(); } diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java index 26c97a3..39d83a1 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java @@ -24,6 +24,7 @@ import ru.soune.nocopy.service.FileSimilarityService; import ru.soune.nocopy.service.ImageHashService; import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileUploadService; +import ru.soune.nocopy.service.tariff.TariffInfoService; import ru.soune.nocopy.util.FileUtil; import java.io.*; @@ -79,6 +80,8 @@ public class FileUploadServiceImpl implements FileUploadService { private final FileUtil fileUtil; + private final TariffInfoService tariffInfoService; + @PostConstruct public void init() { try { @@ -325,6 +328,9 @@ public class FileUploadServiceImpl implements FileUploadService { completeFileProcessingAsync(session, status); + if (status != FileStatus.TEMP) { + tariffInfoService.writeOffTokens(session.getUserId()); + } } else { sessionRepository.save(session); } diff --git a/src/main/java/ru/soune/nocopy/service/register/AuthService.java b/src/main/java/ru/soune/nocopy/service/register/AuthService.java index 6f38f56..e6e50bf 100644 --- a/src/main/java/ru/soune/nocopy/service/register/AuthService.java +++ b/src/main/java/ru/soune/nocopy/service/register/AuthService.java @@ -158,7 +158,6 @@ public class AuthService { tariffInfoService.addTariffInfo(companyTariff); user.setCompany(company); - user.setPersonalTariffInfo(companyTariff); user.grantPermission(Permission.COMPANY_ADMIN_PERMISSIONS); } diff --git a/src/main/java/ru/soune/nocopy/service/tariff/TariffConstants.java b/src/main/java/ru/soune/nocopy/service/tariff/TariffConstants.java index c2c27dd..4f429e7 100644 --- a/src/main/java/ru/soune/nocopy/service/tariff/TariffConstants.java +++ b/src/main/java/ru/soune/nocopy/service/tariff/TariffConstants.java @@ -12,4 +12,6 @@ public class TariffConstants { public static final Integer START_TOKENS = 200; public static final Integer PRO_TOKENS = 300; public static final Integer ENTERPRISE_TOKENS = 400; + + public static final Integer TOKEN_VALUE = 3; } diff --git a/src/main/java/ru/soune/nocopy/service/tariff/TariffInfoService.java b/src/main/java/ru/soune/nocopy/service/tariff/TariffInfoService.java index 6c95763..cb73174 100644 --- a/src/main/java/ru/soune/nocopy/service/tariff/TariffInfoService.java +++ b/src/main/java/ru/soune/nocopy/service/tariff/TariffInfoService.java @@ -8,9 +8,11 @@ import ru.soune.nocopy.entity.tarif.Tariff; import ru.soune.nocopy.entity.tarif.TariffInfo; import ru.soune.nocopy.entity.tarif.TariffStatus; import ru.soune.nocopy.entity.tarif.TariffType; +import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.exception.TariffNotFoundException; import ru.soune.nocopy.repository.TariffInfoRepository; import ru.soune.nocopy.repository.TariffRepository; +import ru.soune.nocopy.repository.UserRepository; import java.time.LocalDateTime; import java.util.List; @@ -24,20 +26,47 @@ public class TariffInfoService { private TariffRepository tariffRepository; - public TariffInfo createTariffInfo(LocalDateTime startTariff, LocalDateTime endTariff, TariffStatus tariffStatus) { + private UserRepository userRepository; + + public TariffInfo createTariffInfo(LocalDateTime startTariff, LocalDateTime endTariff, TariffStatus tariffStatus, + Integer tokens) { TariffInfo tariffInfo = new TariffInfo(); tariffInfo.setStartTariff(startTariff); tariffInfo.setStatus(tariffStatus); tariffInfo.setEndTariff(endTariff); + tariffInfo.setTokens(tokens); return tariffInfoRepository.save(tariffInfo); } + + @Transactional + public void writeOffTokens(long userId) { + User user = userRepository.findById(userId).orElseThrow(); + + TariffInfo activeTariffInfo; + + if (user.getCompany() == null) { + activeTariffInfo = user.getPersonalTariffInfo(); + } else { + activeTariffInfo = user.getCompany().getTariffInfo(); + } + + Integer tokens = activeTariffInfo.getTokens(); + + if (tokens > 0 && (tokens - TariffConstants.TOKEN_VALUE) > 0) { + activeTariffInfo.setTokens(activeTariffInfo.getTokens() - TariffConstants.TOKEN_VALUE); + + tariffInfoRepository.save(activeTariffInfo); + } else { + throw new TariffNotFoundException("User not have tokens for protect"); + } + } public TariffInfo createTariffInfo(TariffType tariffType) { Tariff tariff = tariffRepository.findByType(tariffType.toString()).orElseThrow(); TariffInfo tariffInfo = createTariffInfo(LocalDateTime.now(), LocalDateTime.now().plusDays(30), - TariffStatus.ACTIVE); + TariffStatus.ACTIVE, tariff.getTokens()); tariffInfo.setTariff(tariff); return tariffInfoRepository.save(tariffInfo); @@ -71,7 +100,9 @@ public class TariffInfoService { public TariffInfoDTO updateTariffInfo(String id, TariffInfoDTO tariffInfoDTO) { TariffInfo tariffInfo = tariffInfoRepository.findById(id) .orElseThrow(() -> new TariffNotFoundException("Tariff not found")); + updateTariffInfoFromDTO(tariffInfo, tariffInfoDTO); + return convertToInfoDTO(tariffInfoRepository.save(tariffInfo)); } @@ -87,8 +118,9 @@ public class TariffInfoService { tariffInfo.getStartTariff(), tariffInfo.getEndTariff(), tariffInfo.getTariff() != null ? tariffInfo.getTariff().getId() : null, - tariffInfo.getTariff() != null ? tariffInfo.getTariff().getName() : null - ); + tariffInfo.getTariff() != null ? tariffInfo.getTariff().getName() : null, tariffInfo.getTokens(), + tariffInfo.getTariff().getDiskSize(), 0L, 0, + tariffInfo.getTariff().getMaxFilesCount()); } private void updateTariffInfoFromDTO(TariffInfo tariffInfo, TariffInfoDTO dto) {