Files
RaidBuilderAPI/src/main/java/com/mattrixwv/raidbuilder/service/GameClassService.java
2025-03-16 11:32:18 -04:00

146 lines
4.9 KiB
Java

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<GameClass> 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<GameClass> getByGameId(UUID gameId, int page, int pageSize){
return gameClassRepository.findAllByGameId(gameId, PageRequest.of(page, pageSize, Sort.by("gameClassName").ascending()));
}
public List<GameClass> getByGameId(UUID gameId, int page, int pageSize, String searchTerm){
return gameClassRepository.findAllByGameIdAndGameClassNameContainingIgnoreCase(gameId, searchTerm, PageRequest.of(page, pageSize, Sort.by("gameClassName").ascending()));
}
public List<GameClass> 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);
}
}