This commit is contained in:
2026-01-06 21:44:36 +09:00
parent ceec1ad7a9
commit 716cf63f73
98 changed files with 6997 additions and 538 deletions

View File

@@ -0,0 +1,162 @@
package research.loghunter.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import research.loghunter.dto.ServerDto;
import research.loghunter.dto.ServerLogPathDto;
import research.loghunter.entity.Server;
import research.loghunter.entity.ServerLogPath;
import research.loghunter.repository.ServerRepository;
import research.loghunter.util.CryptoUtil;
import java.util.List;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ServerService {
private final ServerRepository serverRepository;
private final CryptoUtil cryptoUtil;
public List<ServerDto> findAll() {
return serverRepository.findAll().stream()
.map(this::toDto)
.collect(Collectors.toList());
}
public List<ServerDto> findAllActive() {
return serverRepository.findByActiveTrueOrderByNameAsc().stream()
.map(this::toDto)
.collect(Collectors.toList());
}
public ServerDto findById(Long id) {
return serverRepository.findById(id)
.map(this::toDto)
.orElseThrow(() -> new RuntimeException("Server not found: " + id));
}
@Transactional
public ServerDto create(ServerDto dto) {
Server server = toEntity(dto);
server = serverRepository.save(server);
return toDto(server);
}
@Transactional
public ServerDto update(Long id, ServerDto dto) {
Server server = serverRepository.findById(id)
.orElseThrow(() -> new RuntimeException("Server not found: " + id));
server.setName(dto.getName());
server.setHost(dto.getHost());
server.setPort(dto.getPort());
server.setUsername(dto.getUsername());
server.setAuthType(dto.getAuthType());
server.setActive(dto.getActive());
if ("PASSWORD".equals(dto.getAuthType())) {
if (dto.getPassword() != null && !dto.getPassword().isEmpty()) {
server.setEncryptedPassword(cryptoUtil.encrypt(dto.getPassword()));
}
server.setKeyFilePath(null);
server.setEncryptedPassphrase(null);
} else if ("KEY_FILE".equals(dto.getAuthType())) {
server.setKeyFilePath(dto.getKeyFilePath());
if (dto.getPassphrase() != null && !dto.getPassphrase().isEmpty()) {
server.setEncryptedPassphrase(cryptoUtil.encrypt(dto.getPassphrase()));
}
server.setEncryptedPassword(null);
}
return toDto(serverRepository.save(server));
}
@Transactional
public void delete(Long id) {
serverRepository.deleteById(id);
}
@Transactional
public void updateLastScanAt(Long id) {
serverRepository.findById(id).ifPresent(server -> {
server.setLastScanAt(java.time.LocalDateTime.now());
serverRepository.save(server);
});
}
@Transactional
public void updateLastErrorAt(Long id) {
serverRepository.findById(id).ifPresent(server -> {
server.setLastErrorAt(java.time.LocalDateTime.now());
serverRepository.save(server);
});
}
public String getDecryptedPassword(Long id) {
Server server = serverRepository.findById(id)
.orElseThrow(() -> new RuntimeException("Server not found: " + id));
return cryptoUtil.decrypt(server.getEncryptedPassword());
}
public String getDecryptedPassphrase(Long id) {
Server server = serverRepository.findById(id)
.orElseThrow(() -> new RuntimeException("Server not found: " + id));
return cryptoUtil.decrypt(server.getEncryptedPassphrase());
}
private ServerDto toDto(Server server) {
return ServerDto.builder()
.id(server.getId())
.name(server.getName())
.host(server.getHost())
.port(server.getPort())
.username(server.getUsername())
.authType(server.getAuthType())
.keyFilePath(server.getKeyFilePath())
.active(server.getActive())
.lastScanAt(server.getLastScanAt())
.lastErrorAt(server.getLastErrorAt())
.createdAt(server.getCreatedAt())
.logPaths(server.getLogPaths().stream()
.map(this::toLogPathDto)
.collect(Collectors.toList()))
.build();
}
private ServerLogPathDto toLogPathDto(ServerLogPath logPath) {
return ServerLogPathDto.builder()
.id(logPath.getId())
.serverId(logPath.getServer().getId())
.path(logPath.getPath())
.filePattern(logPath.getFilePattern())
.description(logPath.getDescription())
.active(logPath.getActive())
.build();
}
private Server toEntity(ServerDto dto) {
Server server = Server.builder()
.name(dto.getName())
.host(dto.getHost())
.port(dto.getPort() != null ? dto.getPort() : 22)
.username(dto.getUsername())
.authType(dto.getAuthType())
.active(dto.getActive() != null ? dto.getActive() : true)
.build();
if ("PASSWORD".equals(dto.getAuthType()) && dto.getPassword() != null) {
server.setEncryptedPassword(cryptoUtil.encrypt(dto.getPassword()));
} else if ("KEY_FILE".equals(dto.getAuthType())) {
server.setKeyFilePath(dto.getKeyFilePath());
if (dto.getPassphrase() != null) {
server.setEncryptedPassphrase(cryptoUtil.encrypt(dto.getPassphrase()));
}
}
return server;
}
}