diff --git a/pom.xml b/pom.xml
index 6fbc509..f27b8d0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,25 +31,43 @@
25
-
-
-
-
-
-
-
-
org.springframework.boot
spring-boot-starter-websocket
-
org.springframework.boot
spring-boot-starter-test
test
-
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.projectlombok
+ lombok
+ annotationProcessor
+
+
+ com.mysql
+ mysql-connector-j
+ runtime
+
+
+
+
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepBackendApplication.java b/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepBackendApplication.java
index 91f5ef5..36b2977 100644
--- a/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepBackendApplication.java
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepBackendApplication.java
@@ -2,8 +2,6 @@ package de.pnreichmuth.timekeep_backend;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class TimekeepBackendApplication {
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepBackendSecurityConfig.java b/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepBackendSecurityConfig.java
new file mode 100644
index 0000000..7825dc1
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepBackendSecurityConfig.java
@@ -0,0 +1,21 @@
+package de.pnreichmuth.timekeep_backend;
+
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+//import org.springframework.security.web.SecurityFilterChain;
+//
+//
+//@Configuration
+////@EnableWebSecurity
+//public class TimekeepBackendSecurityConfig {
+// @Bean
+// public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+// http.authorizeHttpRequests((authorize) ->
+// authorize.
+// anyRequest().authenticated());
+// return http.build();
+// }
+//
+//}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepRestController.java b/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepRestController.java
deleted file mode 100644
index afadf82..0000000
--- a/src/main/java/de/pnreichmuth/timekeep_backend/TimekeepRestController.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package de.pnreichmuth.timekeep_backend;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Date;
-
-@RestController
-public class TimekeepRestController {
-
- public TimekeepRestController() {
-
- }
-
- @GetMapping("/time/test")
- public Testclass timeEndpoint(){
- return new Testclass("TEST",1);
- }
- @GetMapping("/time")
- public Date getTime(){
- return new Date();
- }
-}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/controllers/TeamRestController.java b/src/main/java/de/pnreichmuth/timekeep_backend/controllers/TeamRestController.java
new file mode 100644
index 0000000..8057634
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/controllers/TeamRestController.java
@@ -0,0 +1,34 @@
+package de.pnreichmuth.timekeep_backend.controllers;
+
+import de.pnreichmuth.timekeep_backend.entities.Team;
+import de.pnreichmuth.timekeep_backend.repositories.TeamRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/teams")
+public class TeamRestController {
+ @Autowired
+ private TeamRepository teamRepository;
+
+ @PostMapping("createTeam")
+ public Team createTeam(){
+ Team team = new Team();
+ teamRepository.save(team);
+ return team;
+ }
+
+ @GetMapping("all")
+ public List findAllTeams(){
+ return teamRepository.findAll();
+ }
+
+ @DeleteMapping("all")
+ public void deleteAllTeams(){
+ teamRepository.deleteAll();
+ }
+
+}
+
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/entities/Racer.java b/src/main/java/de/pnreichmuth/timekeep_backend/entities/Racer.java
new file mode 100644
index 0000000..8e11ec1
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/entities/Racer.java
@@ -0,0 +1,20 @@
+package de.pnreichmuth.timekeep_backend.entities;
+
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.util.UUID;
+
+@Entity
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Racer{
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private UUID id;
+
+ private String name;
+ private Boolean isFirstSemester;
+ private String phoneNumber;
+}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/entities/Station.java b/src/main/java/de/pnreichmuth/timekeep_backend/entities/Station.java
new file mode 100644
index 0000000..49275f3
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/entities/Station.java
@@ -0,0 +1,22 @@
+package de.pnreichmuth.timekeep_backend.entities;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import lombok.Getter;
+
+import java.util.UUID;
+
+@Entity
+@Getter
+
+public class Station {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private UUID id;
+
+ private String name;
+ private String location;
+ private String passwordHash;
+}
\ No newline at end of file
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/entities/Team.java b/src/main/java/de/pnreichmuth/timekeep_backend/entities/Team.java
new file mode 100644
index 0000000..4745e61
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/entities/Team.java
@@ -0,0 +1,71 @@
+package de.pnreichmuth.timekeep_backend.entities;
+
+import jakarta.persistence.*;
+import lombok.Getter;
+import lombok.Setter;
+
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Stream;
+
+@Entity
+@Getter
+public class Team {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private UUID id;
+
+ @Setter
+ private String teamName;
+
+ private boolean firstSemesterTeam;
+
+ @OneToMany(cascade = CascadeType.ALL)
+ private Map members;
+
+ @OneToMany(cascade = CascadeType.ALL)
+ private Map passedStations;
+
+ public Team(){
+ this.teamName = "Team-" + UUID.randomUUID();
+ this.firstSemesterTeam = true;
+ this.members = new HashMap<>(4);
+ this.passedStations = new HashMap<>();
+ }
+
+
+
+ /**
+ * Treat this team as a team of first semester students, if at least 50% of its members are in the first semester
+ */
+ private void checkFirstSemesterTeam(){
+ long erstiCount = members.entrySet().stream()
+ .filter(
+ e -> e.getValue().getIsFirstSemester()
+ ).count();
+ double percentFirstSemester = erstiCount /(double)members.size();
+ this.firstSemesterTeam = percentFirstSemester >= 0.5;
+ }
+
+ /**
+ * Adds a new member to the team and checks whether the team still qualifies as a first semester team
+ * @param newMember the Racer object to be added to the team
+ */
+ public void addMember(Racer newMember){
+ this.members.put(newMember.getName(), newMember);
+ this.checkFirstSemesterTeam();
+ }
+
+ /**
+ * Removes a member from the team by name
+ * @param name the name of the member to be removed
+ */
+ public void removeMember(String name){
+ this.members.remove(name);
+ this.checkFirstSemesterTeam();
+ }
+}
diff --git a/src/main/java/de/pnreichmuth/timekeep_backend/repositories/RacerRepository.java b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/RacerRepository.java
new file mode 100644
index 0000000..8db1397
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/RacerRepository.java
@@ -0,0 +1,14 @@
+package de.pnreichmuth.timekeep_backend.repositories;
+
+import de.pnreichmuth.timekeep_backend.entities.Racer;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.UUID;
+
+@Repository
+public interface RacerRepository extends JpaRepository {
+ Racer findByName(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
new file mode 100644
index 0000000..e47b30e
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/StationRepository.java
@@ -0,0 +1,14 @@
+package de.pnreichmuth.timekeep_backend.repositories;
+
+import de.pnreichmuth.timekeep_backend.entities.Station;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.UUID;
+
+@Repository
+public interface StationRepository extends JpaRepository {
+ public Station findByLocation(String location);
+ public Station findByName(String name);
+ public Station 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
new file mode 100644
index 0000000..e4f73d0
--- /dev/null
+++ b/src/main/java/de/pnreichmuth/timekeep_backend/repositories/TeamRepository.java
@@ -0,0 +1,17 @@
+package de.pnreichmuth.timekeep_backend.repositories;
+
+import de.pnreichmuth.timekeep_backend.entities.Station;
+import de.pnreichmuth.timekeep_backend.entities.Team;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.UUID;
+
+@Repository
+public interface TeamRepository extends JpaRepository {
+ Team getTeamById(UUID id);
+ Team getTeamByTeamName(String name);
+ List getTeamsByFirstSemesterTeamIsTrue();
+ List getTeamsByPassedStationsContains(Station station);
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 5549f3e..cbeb4a7 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1 +1,7 @@
spring.application.name=timekeep-backend
+spring.jpa.hibernate.ddl-auto=update
+spring.datasource.url=jdbc:mysql://localhost:3306/jpa
+spring.datasource.username=myuser
+spring.datasource.password=secret
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.jpa.show-sql= true
diff --git a/src/main/resources/compose.yaml b/src/main/resources/compose.yaml
new file mode 100644
index 0000000..abecd33
--- /dev/null
+++ b/src/main/resources/compose.yaml
@@ -0,0 +1,11 @@
+services:
+ mysql:
+ container_name: 'jpa-mysql'
+ image: 'mysql:latest'
+ environment:
+ - 'MYSQL_DATABASE=jpa'
+ - 'MYSQL_PASSWORD=secret'
+ - 'MYSQL_ROOT_PASSWORD=verysecret'
+ - 'MYSQL_USER=myuser'
+ ports:
+ - '3306:3306'
\ No newline at end of file