package com.mattrixwv.raidbuilder.service; import java.time.ZonedDateTime; import java.util.List; import java.util.UUID; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.mattrixwv.raidbuilder.entity.RaidInstance; import com.mattrixwv.raidbuilder.repository.raid_instance.RaidInstanceRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class RaidInstanceService{ private final RaidInstanceRepository raidInstanceRepository; private final RaidInstancePersonCharacterXrefService ripcXrefService; //Write public RaidInstance createRaidInstance(RaidInstance raidInstance){ return raidInstanceRepository.save(raidInstance); } public RaidInstance updateRaidInstance(RaidInstance raidInstance){ RaidInstance existingRaidInstance = raidInstanceRepository.findById(raidInstance.getRaidInstanceId()).orElseThrow(); raidInstance.setCreatedBy(existingRaidInstance.getCreatedBy()); raidInstance.setCreatedDate(existingRaidInstance.getCreatedDate()); return raidInstanceRepository.save(raidInstance); } public void deleteById(UUID raidInstanceId){ ripcXrefService.deleteByRaidInstanceId(raidInstanceId); raidInstanceRepository.deleteById(raidInstanceId); } public void deleteByRaidGroupId(UUID raidGroupId){ List raidInstances = raidInstanceRepository.findAllByRaidGroupId(raidGroupId); ripcXrefService.deleteByRaidInstanceIds(raidInstances.stream().map(RaidInstance::getRaidInstanceId).toList()); raidInstanceRepository.deleteAllByRaidGroupId(raidGroupId); } public void deleteByRaidGroupIds(Iterable raidGroupIds){ List raidInstances = raidInstanceRepository.findAllByRaidGroupIdIn(raidGroupIds); ripcXrefService.deleteByRaidInstanceIds(raidInstances.stream().map(RaidInstance::getRaidInstanceId).toList()); raidInstanceRepository.deleteAllByRaidGroupIdIn(raidGroupIds); } public void deleteByRaidLayoutId(UUID raidLayoutId){ raidInstanceRepository.clearRaidLayoutId(raidLayoutId); } public void deleteByRaidLayoutIds(Iterable raidLayoutIds){ raidInstanceRepository.clearRaidLayoutIdIn(raidLayoutIds); } //Read public RaidInstance findById(UUID raidInstanceId){ return raidInstanceRepository.findById(raidInstanceId).orElse(null); } public List findAllByRaidGroupId(UUID raidGroupId){ return raidInstanceRepository.findAllByRaidGroupId(raidGroupId); } public List findAllByRaidGroupId(UUID raidGroupId, int page, int pageSize){ return raidInstanceRepository.findAllByRaidGroupId(raidGroupId, PageRequest.of(page, pageSize, Sort.by("raidInstanceName").ascending())); } public List findAllByRaidGroupId(UUID raidGroupId, int page, int pageSize, String searchTerm){ return raidInstanceRepository.findAllByRaidGroupIdAndRaidInstanceNameContainingIgnoreCase(raidGroupId, searchTerm, PageRequest.of(page, pageSize, Sort.by("raidInstanceName").ascending())); } public List findAllByRaidGroupIdAndEndDate(UUID raidGroupId, ZonedDateTime endDate, int page, int pageSize){ return raidInstanceRepository.findAllByRaidGroupIdAndRaidEndDateAfter(raidGroupId, endDate, PageRequest.of(page, pageSize, Sort.by("raidEndDate").descending())); } public List findAllByRaidGroupIdAndEndDate(UUID raidGroupId, ZonedDateTime endDate, int page, int pageSize, String searchTerm){ return raidInstanceRepository.findAllByRaidGroupIdAndRaidEndDateAfterAndRaidInstanceNameContainingIgnoreCase(raidGroupId, endDate, searchTerm, PageRequest.of(page, pageSize, Sort.by("raidEndDate").descending())); } public long countByRaidGroupId(UUID raidGroupId){ return raidInstanceRepository.countByRaidGroupId(raidGroupId); } public long countByRaidGroupId(UUID raidGroupId, String searchTerm){ return raidInstanceRepository.countByRaidGroupIdAndRaidInstanceNameContainingIgnoreCase(raidGroupId, searchTerm); } public long countByRaidGroupIdAndEndDate(UUID raidGroupId, ZonedDateTime endDate){ return raidInstanceRepository.countByRaidGroupIdAndRaidEndDateAfter(raidGroupId, endDate); } public long countByRaidGroupIdAndEndDate(UUID raidGroupId, ZonedDateTime endDate, String searchTerm){ return raidInstanceRepository.countByRaidGroupIdAndRaidEndDateAfterAndRaidInstanceNameContainingIgnoreCase(raidGroupId, endDate, searchTerm); } }