2026-01-30 12:52:16 +07:00
|
|
|
package ru.soune.nocopy.service.tariff;
|
|
|
|
|
|
|
|
|
|
import lombok.AllArgsConstructor;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import ru.soune.nocopy.dto.tarriff.TariffInfoDTO;
|
|
|
|
|
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-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;
|
|
|
|
|
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-01-30 12:52:16 +07:00
|
|
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
@AllArgsConstructor
|
|
|
|
|
public class TariffInfoService {
|
|
|
|
|
|
|
|
|
|
private TariffInfoRepository tariffInfoRepository;
|
|
|
|
|
|
|
|
|
|
private TariffRepository tariffRepository;
|
|
|
|
|
|
2026-02-04 11:47:43 +07:00
|
|
|
private UserRepository userRepository;
|
|
|
|
|
|
|
|
|
|
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-02-04 11:47:43 +07:00
|
|
|
|
|
|
|
|
@Transactional
|
2026-02-05 17:25:50 +07:00
|
|
|
public void writeOffTokens(long userId, Integer value) {
|
2026-02-04 11:47:43 +07:00
|
|
|
User user = userRepository.findById(userId).orElseThrow();
|
|
|
|
|
|
|
|
|
|
TariffInfo activeTariffInfo;
|
|
|
|
|
|
|
|
|
|
if (user.getCompany() == null) {
|
|
|
|
|
activeTariffInfo = user.getPersonalTariffInfo();
|
|
|
|
|
} else {
|
|
|
|
|
activeTariffInfo = user.getCompany().getTariffInfo();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 {
|
|
|
|
|
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
|
|
|
|
|
|
|
|
TariffInfo tariffInfo = createTariffInfo(LocalDateTime.now(), LocalDateTime.now().plusDays(30),
|
2026-02-04 11:47:43 +07:00
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
userRepository.save(user);
|
|
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|