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