dev add
Test Workflow / test (push) Successful in 4s

This commit is contained in:
vladp
2026-02-04 11:47:43 +07:00
parent 06a6196a26
commit 7a809e6b8c
11 changed files with 152 additions and 17 deletions
@@ -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<List<UserDTO>> getAllUsers() {
List<UserDTO> 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());
@@ -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;
}
@@ -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<TariffDTO> tariffs;
private TariffInfo tariffInfo;
private TariffInfoDTO tariffInfo;
}
@@ -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;
@@ -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);
@@ -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(
@@ -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<FileEntity> userFiles = fileEntityRepository.findByUserId(userId);
return calculateStats(userFiles);
@@ -49,6 +58,47 @@ public class FileStatsService {
.build();
}
public Long calculateUserFileSize(Long userId) {
List<FileEntity> userFiles = fileEntityRepository.findByUserId(userId);
return calculateTotalSize(userFiles);
}
public Long calculateCompanyFileSize(Long userId) {
User user = userRepository.findById(userId).orElseThrow();
List<User> companyUsers = companyService.getCompanyUsers(user.getCompany().getId());
List<FileEntity> userFiles = new ArrayList<>();
for (User companyUser : companyUsers) {
userFiles.addAll(fileEntityRepository.findByUserId(companyUser.getId()));
}
return calculateTotalSize(userFiles);
}
public Integer filesUserCount(Long userId) {
List<FileEntity> userFiles = fileEntityRepository.findByUserId(userId);
return calculateTotalCount(userFiles);
}
public Integer filesCompanyCount(Long userId) {
User user = userRepository.findById(userId).orElseThrow();
List<User> companyUsers = companyService.getCompanyUsers(user.getCompany().getId());
List<FileEntity> userFiles = new ArrayList<>();
for (User companyUser : companyUsers) {
userFiles.addAll(fileEntityRepository.findByUserId(companyUser.getId()));
}
return calculateTotalCount(userFiles);
}
private Long protectedUserFiles(List<FileEntity> files) {
return files.stream().filter(file -> file.getProtectionStatus() == ProtectionStatus.PROTECTED).count();
}
@@ -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);
}
@@ -158,7 +158,6 @@ public class AuthService {
tariffInfoService.addTariffInfo(companyTariff);
user.setCompany(company);
user.setPersonalTariffInfo(companyTariff);
user.grantPermission(Permission.COMPANY_ADMIN_PERMISSIONS);
}
@@ -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;
}
@@ -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) {