package com.mattrixwv.raidbuilder.service; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.UUID; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import com.mattrixwv.raidbuilder.entity.GameClass; import com.mattrixwv.raidbuilder.repository.class_group_game_class_xref.ClassGroupGameClassXrefRepository; import com.mattrixwv.raidbuilder.repository.game_class.GameClassRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class GameClassService{ private final GameClassRepository gameClassRepository; private final ClassGroupGameClassXrefRepository cggcXrefRepository; //Values @Value("${uploadFileDirectory}") private String uploadFileDirectory; //Write public GameClass createGameClass(GameClass gameClass, MultipartFile file){ if(file != null){ String fileName = UUID.randomUUID().toString() + "--" + file.getOriginalFilename(); Path filePath = Paths.get(uploadFileDirectory + "/gameClassIcons").resolve(fileName); try{ //file.transferTo(filePath); Files.copy(file.getInputStream(), filePath); gameClass.setGameClassIcon(fileName); } catch(Exception error){ log.error("Error uploading file: " + error.getMessage(), error); throw new RuntimeException("Error uploading file: " + error.getMessage(), error); } } return gameClassRepository.save(gameClass); } public GameClass updateGameClass(GameClass gameClass, MultipartFile file){ GameClass existingGameClass = gameClassRepository.findById(gameClass.getGameClassId()).orElse(null); //Delete the old file if one exists if((existingGameClass != null) && (existingGameClass.getGameClassIcon() != null) && (gameClass.getGameClassIcon() == null)){ log.debug("Deleting old file: {}", existingGameClass.getGameClassIcon()); File existingFile = new File(uploadFileDirectory + "/gameClassIcons/" + existingGameClass.getGameClassIcon()); if(existingFile.exists()){ existingFile.delete(); } } if(file != null){ //Upload the new file String fileName = UUID.randomUUID().toString() + "--" + file.getOriginalFilename(); Path filePath = Paths.get(uploadFileDirectory + "/gameClassIcons").resolve(fileName); try{ //file.transferTo(filePath); Files.copy(file.getInputStream(), filePath); gameClass.setGameClassIcon(fileName); } catch(Exception error){ log.error("Error uploading file: " + error.getMessage(), error); throw new RuntimeException("Error uploading file: " + error.getMessage(), error); } } return gameClassRepository.save(gameClass); } public void deleteById(UUID gameClassId){ GameClass gameClass = gameClassRepository.findById(gameClassId).orElse(null); if(gameClass != null){ if(gameClass.getGameClassIcon() != null){ File existingFile = new File(uploadFileDirectory + "/gameClassIcons/" + gameClass.getGameClassIcon()); if(existingFile.exists()){ existingFile.delete(); } } } cggcXrefRepository.deleteAllByGameClassId(gameClassId); gameClassRepository.deleteById(gameClassId); } public void deleteByGameId(UUID gameId){ List gameClasses = gameClassRepository.findAllByGameId(gameId); for(GameClass gameClass : gameClasses){ if(gameClass.getGameClassIcon() != null){ File existingFile = new File(uploadFileDirectory + "/gameClassIcons/" + gameClass.getGameClassIcon()); if(existingFile.exists()){ existingFile.delete(); } } } cggcXrefRepository.deleteAllByGameClassIdIn(gameClasses.stream().map(GameClass::getGameClassId).toList()); gameClassRepository.deleteByGameId(gameId); } //Read public GameClass getById(UUID gameClassId){ return gameClassRepository.findById(gameClassId).orElse(null); } public List getByGameId(UUID gameId, int page, int pageSize){ return gameClassRepository.findAllByGameId(gameId, PageRequest.of(page, pageSize, Sort.by("gameClassName").ascending())); } public List getByGameId(UUID gameId, int page, int pageSize, String searchTerm){ return gameClassRepository.findAllByGameIdAndGameClassNameContainingIgnoreCase(gameId, searchTerm, PageRequest.of(page, pageSize, Sort.by("gameClassName").ascending())); } public List getByClassGroupId(UUID classGroupId){ return gameClassRepository.findAllByClassGroupId(classGroupId); } public long countByGameId(UUID gameId){ return gameClassRepository.countByGameId(gameId); } public long countByGameId(UUID gameId, String searchTerm){ return gameClassRepository.countByGameIdAndGameClassNameContainingIgnoreCase(gameId, searchTerm); } }