From 714b3e33194618698ffbb45bda5fa48c6cdf6987 Mon Sep 17 00:00:00 2001
From: Paul Reichmuth
Date: Wed, 8 Oct 2025 18:03:16 +0200
Subject: [PATCH] begin service structure
---
.run/TimekeepBackendApplication.run.xml | 2 +-
build.gradle.kts | 2 +
.../controllers/TeamRestController.java | 15 +++--
.../exceptions/RacerNotFoundException.java | 14 +++++
.../exceptions/TeamExistsException.java | 15 +++++
.../exceptions/TeamNotFoundException.java | 14 +++++
.../repositories/RacerRepository.java | 3 +-
.../repositories/StationRepository.java | 7 ++-
.../repositories/TeamRepository.java | 4 +-
.../services/RacerService.java | 61 +++++++++++++++++++
.../services/TeamService.java | 18 ++++--
11 files changed, 136 insertions(+), 19 deletions(-)
create mode 100644 src/main/java/de/pnreichmuth/timekeep_backend/exceptions/RacerNotFoundException.java
create mode 100644 src/main/java/de/pnreichmuth/timekeep_backend/exceptions/TeamExistsException.java
create mode 100644 src/main/java/de/pnreichmuth/timekeep_backend/exceptions/TeamNotFoundException.java
create mode 100644 src/main/java/de/pnreichmuth/timekeep_backend/services/RacerService.java
diff --git a/.run/TimekeepBackendApplication.run.xml b/.run/TimekeepBackendApplication.run.xml
index b51b764..d3f8d12 100644
--- a/.run/TimekeepBackendApplication.run.xml
+++ b/.run/TimekeepBackendApplication.run.xml
@@ -11,7 +11,7 @@
-
+
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index 92ce243..d3ad6d3 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -6,6 +6,7 @@ plugins {
id("java-library")
`maven-publish`
id("io.freefair.lombok") version "9.0.0"
+ id("io.spring.dependency-management") version "1.1.7"
}
repositories {
@@ -14,6 +15,7 @@ repositories {
maven {
url = uri("https://repo.maven.apache.org/maven2/")
}
+ maven { url = uri("https://repo.spring.io/snapshot") }
}
dependencies {
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/controllers/TeamRestController.java b/src/main/java/de/pnreichmuth/timekeep_backend/controllers/TeamRestController.java
index f15b694..488ce47 100644
--- a/src/main/java/de/pnreichmuth/timekeep_backend/controllers/TeamRestController.java
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/controllers/TeamRestController.java
@@ -1,11 +1,13 @@
package de.pnreichmuth.timekeep_backend.controllers;
import de.pnreichmuth.timekeep_backend.entities.Team;
+import de.pnreichmuth.timekeep_backend.exceptions.TeamNotFoundException;
import de.pnreichmuth.timekeep_backend.services.TeamService;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
-import java.rmi.NoSuchObjectException;
import java.util.List;
@RestController
@@ -13,8 +15,11 @@ import java.util.List;
@Slf4j
public class TeamRestController {
+ @Autowired
TeamService teamService;
+
@PostMapping("createTeam")
+ @ResponseStatus(HttpStatus.CREATED)
public Team createTeam(@RequestBody Team team){
teamService.createTeam(team);
return team;
@@ -26,17 +31,15 @@ public class TeamRestController {
}
@DeleteMapping("all")
+ @ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteAllTeams(){
teamService.deleteAllTeams();
}
@DeleteMapping("deleteTeam")
+ @ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteTeam(@RequestBody Team team){
- try{
- teamService.deleteTeam(team.getTeamName());
- } catch (NoSuchObjectException e) {
- log.error(e.getMessage());
- }
+ teamService.deleteTeam(team.getTeamName());
}
}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/exceptions/RacerNotFoundException.java b/src/main/java/de/pnreichmuth/timekeep_backend/exceptions/RacerNotFoundException.java
new file mode 100644
index 0000000..9955a42
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/exceptions/RacerNotFoundException.java
@@ -0,0 +1,14 @@
+package de.pnreichmuth.timekeep_backend.exceptions;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@Slf4j
+@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "RACER_NOT_FOUND")
+public class RacerNotFoundException extends RuntimeException {
+ public RacerNotFoundException(String message) {
+ super(message);
+ log.error(message);
+ }
+}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/exceptions/TeamExistsException.java b/src/main/java/de/pnreichmuth/timekeep_backend/exceptions/TeamExistsException.java
new file mode 100644
index 0000000..7cfd88e
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/exceptions/TeamExistsException.java
@@ -0,0 +1,15 @@
+package de.pnreichmuth.timekeep_backend.exceptions;
+
+import de.pnreichmuth.timekeep_backend.entities.Team;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(value = HttpStatus.CONFLICT, reason = "TEAM_EXISTS")
+@Slf4j
+public class TeamExistsException extends RuntimeException {
+ public TeamExistsException(String message, Team team) {
+ super(message);
+ log.warn(message, team.getTeamName());
+ }
+}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/exceptions/TeamNotFoundException.java b/src/main/java/de/pnreichmuth/timekeep_backend/exceptions/TeamNotFoundException.java
new file mode 100644
index 0000000..cf9451c
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/exceptions/TeamNotFoundException.java
@@ -0,0 +1,14 @@
+package de.pnreichmuth.timekeep_backend.exceptions;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@Slf4j
+@ResponseStatus(HttpStatus.NOT_FOUND)
+public class TeamNotFoundException extends RuntimeException {
+ public TeamNotFoundException(String message) {
+ super(message);
+ log.error(message);
+ }
+}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/repositories/RacerRepository.java b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/RacerRepository.java
index 8069c4c..a142656 100644
--- a/src/main/java/de/pnreichmuth/timekeep_backend/repositories/RacerRepository.java
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/RacerRepository.java
@@ -6,11 +6,12 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
+import java.util.Optional;
import java.util.UUID;
@SuppressWarnings("ALL")
@Repository
public interface RacerRepository extends JpaRepository<@NonNull Racer,@NonNull UUID> {
- Racer findByName(String name);
+ Optional getRacerByName(String name);
List findAllByName(String name);
}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/repositories/StationRepository.java b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/StationRepository.java
index 07d2d5f..70049b4 100644
--- a/src/main/java/de/pnreichmuth/timekeep_backend/repositories/StationRepository.java
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/StationRepository.java
@@ -5,11 +5,12 @@ import lombok.NonNull;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
+import java.util.Optional;
import java.util.UUID;
@Repository
public interface StationRepository extends JpaRepository<@NonNull Station, @NonNull UUID> {
- Station findByLocation(String location);
- Station findByName(String name);
- Station findByPasswordHash(String passwordHash);
+ Optional findByLocation(String location);
+ Optional findByName(String name);
+ Optional findByPasswordHash(String passwordHash);
}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/repositories/TeamRepository.java b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/TeamRepository.java
index a48d174..9ce9f95 100644
--- a/src/main/java/de/pnreichmuth/timekeep_backend/repositories/TeamRepository.java
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/TeamRepository.java
@@ -7,14 +7,14 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
+import java.util.Optional;
import java.util.UUID;
@Repository
public interface TeamRepository extends JpaRepository<@NonNull Team, @NonNull UUID> {
- Team getTeamByTeamName(String name);
+ Optional getTeamByTeamName(String name);
List getTeamsByFirstSemesterTeamIsTrue();
List getTeamsByPassedStationsContains(Station station);
void deleteTeamByTeamName(String name);
-
boolean existsByTeamName(String name);
}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/services/RacerService.java b/src/main/java/de/pnreichmuth/timekeep_backend/services/RacerService.java
new file mode 100644
index 0000000..a41a77a
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/services/RacerService.java
@@ -0,0 +1,61 @@
+package de.pnreichmuth.timekeep_backend.services;
+
+import de.pnreichmuth.timekeep_backend.entities.Racer;
+import de.pnreichmuth.timekeep_backend.exceptions.RacerNotFoundException;
+import de.pnreichmuth.timekeep_backend.exceptions.TeamNotFoundException;
+import de.pnreichmuth.timekeep_backend.repositories.RacerRepository;
+import de.pnreichmuth.timekeep_backend.repositories.TeamRepository;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.UUID;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class RacerService {
+ private final RacerRepository racerRepository;
+
+ public Racer createRacer(Racer racer){
+ return racerRepository.save(racer);
+ }
+
+ public Racer createRacer(String name, boolean isFirstSemester){
+ Racer racer = new Racer();
+ racer.setName(name);
+ racer.setIsFirstSemester(isFirstSemester);
+ return racerRepository.save(racer);
+ }
+
+ public Racer getRacer(String name){
+ Racer racer = racerRepository.getRacerByName(name).orElse(null);
+ if(racer == null) throw new RacerNotFoundException("Racer "+name+" not found");
+ return racer;
+ }
+
+ public UUID getRacerIdByName(String name){
+ Racer racer = racerRepository.getRacerByName(name).orElse(null);
+ if(racer == null) throw new RacerNotFoundException("Racer "+name+" not found");
+ return racer.getId();
+ }
+
+ public Racer addTelNumber(String name,String telNumber){
+ Racer racer = racerRepository.getRacerByName(name).orElse(null);
+ if(racer == null) throw new RacerNotFoundException("Racer "+name+" not found");
+ racer.setPhoneNumber(telNumber);
+ return racerRepository.save(racer);
+ }
+
+ public Racer addTelNumber(UUID id, String telNumber){
+ Racer racer = racerRepository.findById(id).orElse(null);
+ if(racer == null) throw new RacerNotFoundException("Racer not found");
+ racer.setPhoneNumber(telNumber);
+ return racerRepository.save(racer);
+ }
+
+ public void deleteRacer(UUID id) throws RacerNotFoundException {
+ Racer racer = racerRepository.findById(id).orElse(null);
+ if(racer == null) throw new RacerNotFoundException("Racer not found");
+ }
+}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/services/TeamService.java b/src/main/java/de/pnreichmuth/timekeep_backend/services/TeamService.java
index dc4a853..554308d 100644
--- a/src/main/java/de/pnreichmuth/timekeep_backend/services/TeamService.java
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/services/TeamService.java
@@ -1,12 +1,13 @@
package de.pnreichmuth.timekeep_backend.services;
import de.pnreichmuth.timekeep_backend.entities.Team;
+import de.pnreichmuth.timekeep_backend.exceptions.TeamExistsException;
+import de.pnreichmuth.timekeep_backend.exceptions.TeamNotFoundException;
import de.pnreichmuth.timekeep_backend.repositories.TeamRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
-import java.rmi.NoSuchObjectException;
import java.util.List;
import java.util.UUID;
@@ -22,7 +23,9 @@ public class TeamService {
}
public Team getTeam(String name){
- return teamRepository.getTeamByTeamName(name);
+ Team team = teamRepository.getTeamByTeamName(name).orElse(null);
+ if(team == null) throw new TeamNotFoundException("Team "+name+" not found");
+ return team;
}
public List getTeams(){
@@ -36,6 +39,9 @@ public class TeamService {
}
public void createTeam(Team team){
+ if(teamRepository.existsByTeamName(team.getTeamName())){
+ throw new TeamExistsException("A team by this name already exists.", team);
+ }
teamRepository.save(team);
log.info("Team created: {}", team);
}
@@ -47,13 +53,13 @@ public class TeamService {
log.info("Team created: {}", tempTeam);
}
- public void deleteTeam(UUID id) throws NoSuchObjectException{
- if(!teamRepository.existsById(id)) throw new NoSuchObjectException("Team not found");
+ public void deleteTeam(UUID id) throws TeamNotFoundException {
+ if(!teamRepository.existsById(id)) throw new TeamNotFoundException("Team not found");
teamRepository.deleteById(id);
}
- public void deleteTeam(String name) throws NoSuchObjectException{
- if(!teamRepository.existsByTeamName(name)) throw new NoSuchObjectException("Team not found");
+ public void deleteTeam(String name) throws TeamNotFoundException {
+ if(!teamRepository.existsByTeamName(name)) throw new TeamNotFoundException("Team not found");
teamRepository.deleteTeamByTeamName(name);
}