Files
no-copy/src/main/java/ru/soune/nocopy/service/tariff/TariffInfoService.java
T

200 lines
7.4 KiB
Java
Raw Normal View History

2026-01-30 12:52:16 +07:00
package ru.soune.nocopy.service.tariff;
2026-03-30 14:28:56 +07:00
import jakarta.mail.MessagingException;
2026-01-30 12:52:16 +07:00
import lombok.AllArgsConstructor;
2026-03-30 14:42:51 +07:00
import lombok.extern.slf4j.Slf4j;
2026-01-30 12:52:16 +07:00
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.soune.nocopy.dto.tarriff.TariffInfoDTO;
2026-05-13 16:31:55 +07:00
import ru.soune.nocopy.entity.company.Company;
2026-01-30 12:52:16 +07:00
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;
2026-04-10 20:13:59 +07:00
import ru.soune.nocopy.entity.tokenoperation.OperationType;
2026-02-04 11:47:43 +07:00
import ru.soune.nocopy.entity.user.User;
2026-01-30 12:52:16 +07:00
import ru.soune.nocopy.exception.TariffNotFoundException;
2026-05-19 15:45:40 +07:00
import ru.soune.nocopy.repository.CompanyRepository;
2026-01-30 12:52:16 +07:00
import ru.soune.nocopy.repository.TariffInfoRepository;
import ru.soune.nocopy.repository.TariffRepository;
2026-02-04 11:47:43 +07:00
import ru.soune.nocopy.repository.UserRepository;
2026-03-30 14:28:56 +07:00
import ru.soune.nocopy.service.mail.EmailService;
2026-04-10 20:13:59 +07:00
import ru.soune.nocopy.service.tokenoperation.TokenOperationService;
2026-01-30 12:52:16 +07:00
2026-03-30 14:28:56 +07:00
import java.io.IOException;
2026-01-30 12:52:16 +07:00
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@Service
@AllArgsConstructor
2026-03-30 14:42:51 +07:00
@Slf4j
2026-01-30 12:52:16 +07:00
public class TariffInfoService {
private TariffInfoRepository tariffInfoRepository;
private TariffRepository tariffRepository;
2026-02-04 11:47:43 +07:00
private UserRepository userRepository;
2026-03-30 14:28:56 +07:00
private EmailService emailService;
2026-04-10 20:13:59 +07:00
private TokenOperationService tokenOperationService;
2026-05-19 15:45:40 +07:00
private CompanyRepository companyRepository;
2026-02-04 11:47:43 +07:00
public TariffInfo createTariffInfo(LocalDateTime startTariff, LocalDateTime endTariff, TariffStatus tariffStatus,
Integer tokens) {
2026-01-30 12:52:16 +07:00
TariffInfo tariffInfo = new TariffInfo();
tariffInfo.setStartTariff(startTariff);
tariffInfo.setStatus(tariffStatus);
tariffInfo.setEndTariff(endTariff);
2026-02-04 11:47:43 +07:00
tariffInfo.setTokens(tokens);
2026-02-09 17:25:06 +07:00
tariffInfo.setBoughtTokens(0);
2026-01-30 12:52:16 +07:00
return tariffInfoRepository.save(tariffInfo);
}
2026-03-05 14:27:14 +07:00
2026-05-13 16:31:55 +07:00
@Transactional
2026-04-10 20:13:59 +07:00
public void writeOffTokens(long userId, Integer value, OperationType operationType) throws MessagingException, IOException {
2026-02-04 11:47:43 +07:00
User user = userRepository.findById(userId).orElseThrow();
2026-05-13 16:31:55 +07:00
Company company = user.getCompany();
2026-02-04 11:47:43 +07:00
TariffInfo activeTariffInfo;
2026-05-13 16:31:55 +07:00
if (company == null) {
2026-02-04 11:47:43 +07:00
activeTariffInfo = user.getPersonalTariffInfo();
} else {
2026-05-13 16:31:55 +07:00
activeTariffInfo = company.getTariffInfo();
2026-02-04 11:47:43 +07:00
}
2026-03-05 14:27:14 +07:00
writeOffTokensForTariff(activeTariffInfo, value);
2026-04-10 20:13:59 +07:00
tokenOperationService.create(operationType, userId, Long.valueOf(value));
2026-03-05 14:27:14 +07:00
}
2026-03-30 14:28:56 +07:00
public void writeOffTokensForTariff(TariffInfo activeTariffInfo, Integer value) throws MessagingException, IOException {
2026-02-04 11:47:43 +07:00
Integer tokens = activeTariffInfo.getTokens();
2026-02-09 17:25:06 +07:00
Integer boughtTokens = activeTariffInfo.getBoughtTokens();
2026-02-04 11:47:43 +07:00
2026-02-05 20:23:33 +07:00
if (tokens - value >= 0) {
2026-02-05 18:55:54 +07:00
activeTariffInfo.setTokens(activeTariffInfo.getTokens() - value);
2026-02-04 11:47:43 +07:00
2026-02-09 17:25:06 +07:00
tariffInfoRepository.save(activeTariffInfo);
} else if (boughtTokens - value >= 0) {
activeTariffInfo.setTokens(activeTariffInfo.getBoughtTokens() - value);
2026-02-04 11:47:43 +07:00
tariffInfoRepository.save(activeTariffInfo);
} else {
2026-03-30 14:28:56 +07:00
int needTokens = boughtTokens - value;
User user = userRepository.findByPersonalTariffInfo(activeTariffInfo);
emailService.sendTokensNotFoundEmail(user, tokens, Math.abs(needTokens));
2026-03-30 14:42:51 +07:00
log.error("User:" + user.getId() + " not have tokens for protect");
2026-03-30 14:28:56 +07:00
2026-02-04 11:47:43 +07:00
throw new TariffNotFoundException("User not have tokens for protect");
}
}
2026-01-30 12:52:16 +07:00
public TariffInfo createTariffInfo(TariffType tariffType) {
2026-01-30 22:30:27 +07:00
Tariff tariff = tariffRepository.findByType(tariffType.toString()).orElseThrow();
2026-01-30 12:52:16 +07:00
2026-03-25 12:46:33 +07:00
TariffInfo tariffInfo = createTariffInfo(LocalDateTime.now(),
LocalDateTime.now().plusDays(tariff.getTariffTerm().getDays()), TariffStatus.ACTIVE, tariff.getTokens());
2026-01-30 12:52:16 +07:00
tariffInfo.setTariff(tariff);
return tariffInfoRepository.save(tariffInfo);
}
2026-02-18 16:14:17 +07:00
public TariffInfo addTariffInfo(TariffInfo tariffInfo) {
return tariffInfoRepository.save(tariffInfo);
2026-01-30 12:52:16 +07:00
}
public List<TariffInfoDTO> getAllTariffInfos() {
return tariffInfoRepository.findAll()
.stream()
.map(this::convertToInfoDTO)
.collect(Collectors.toList());
}
public TariffInfoDTO getTariffInfoById(String id) {
return tariffInfoRepository.findById(id)
.map(this::convertToInfoDTO)
.orElseThrow(() -> new TariffNotFoundException("Tariff info not found"));
}
@Transactional
public TariffInfoDTO createTariffInfo(TariffInfoDTO tariffInfoDTO) {
TariffInfo tariffInfo = new TariffInfo();
updateTariffInfoFromDTO(tariffInfo, tariffInfoDTO);
return convertToInfoDTO(tariffInfoRepository.save(tariffInfo));
}
@Transactional
public TariffInfoDTO updateTariffInfo(String id, TariffInfoDTO tariffInfoDTO) {
TariffInfo tariffInfo = tariffInfoRepository.findById(id)
.orElseThrow(() -> new TariffNotFoundException("Tariff not found"));
2026-02-04 11:47:43 +07:00
2026-01-30 12:52:16 +07:00
updateTariffInfoFromDTO(tariffInfo, tariffInfoDTO);
2026-02-04 11:47:43 +07:00
2026-01-30 12:52:16 +07:00
return convertToInfoDTO(tariffInfoRepository.save(tariffInfo));
}
@Transactional
public void deleteTariffInfo(String id) {
tariffInfoRepository.deleteById(id);
}
private TariffInfoDTO convertToInfoDTO(TariffInfo tariffInfo) {
return new TariffInfoDTO(
tariffInfo.getId(),
tariffInfo.getStatus().name(),
tariffInfo.getStartTariff(),
tariffInfo.getEndTariff(),
tariffInfo.getTariff() != null ? tariffInfo.getTariff().getId() : null,
2026-02-09 17:25:06 +07:00
tariffInfo.getTariff() != null ? tariffInfo.getTariff().getName() : null,
tariffInfo.getTokens() + tariffInfo.getBoughtTokens(),
2026-02-04 11:47:43 +07:00
tariffInfo.getTariff().getDiskSize(), 0L, 0,
tariffInfo.getTariff().getMaxFilesCount());
2026-01-30 12:52:16 +07:00
}
2026-02-18 16:14:17 +07:00
@Transactional
public void linkUserTariffInfo(User user, TariffInfo tariffInfo) {
user.setPersonalTariffInfo(tariffInfo);
2026-05-19 15:45:40 +07:00
userRepository.save(user);
}
@Transactional
2026-05-19 16:22:22 +07:00
public void linkCompanyTariffInfo(Long userId, TariffInfo tariffInfo) {
User user = userRepository.findById(userId).orElse(null);
2026-05-19 16:34:16 +07:00
log.info("user: " + user);
log.info("user: " + user);
log.info("user: " + user);
log.info("user: " + user);
log.info("Company: " + user.getCompany());
log.info("Company: " + user.getCompany());
log.info("Company: " + user.getCompany());
log.info("Company: " + user.getCompany());
2026-05-19 15:36:55 +07:00
2026-05-19 16:34:16 +07:00
if (user.getCompany() != null) {
2026-05-19 16:22:22 +07:00
Company company = user.getCompany();
2026-05-19 15:36:55 +07:00
company.setTariffInfo(tariffInfo);
2026-05-19 15:54:29 +07:00
2026-05-19 15:45:40 +07:00
companyRepository.save(company);
2026-05-19 15:36:55 +07:00
}
2026-02-18 16:14:17 +07:00
}
2026-01-30 12:52:16 +07:00
private void updateTariffInfoFromDTO(TariffInfo tariffInfo, TariffInfoDTO dto) {
tariffInfo.setStatus(TariffStatus.valueOf(dto.getStatus()));
tariffInfo.setStartTariff(dto.getStartTariff());
tariffInfo.setEndTariff(dto.getEndTariff());
if (dto.getTariffId() != null) {
Tariff tariff = tariffRepository.findById(dto.getTariffId())
.orElseThrow(() -> new TariffNotFoundException("Tariff not found"));
tariffInfo.setTariff(tariff);
}
}
}