5
0
mirror of https://github.com/AJMicke/KickerELO.git synced 2026-03-11 13:31:02 +01:00

data: Store user who submitted the game

This may become useful in the future.
This commit is contained in:
Sebastian Beckmann
2025-09-09 00:12:51 +02:00
parent 3e55606ef8
commit d395b4cb18
4 changed files with 53 additions and 7 deletions

View File

@@ -3,6 +3,8 @@ package org.kickerelo.kickerelo.data;
import jakarta.persistence.*; import jakarta.persistence.*;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional; import java.util.Optional;
@Entity @Entity
@@ -18,12 +20,20 @@ public class AuthentikUser {
@Column(name = "NAME", nullable = false) @Column(name = "NAME", nullable = false)
private String name; private String name;
@OneToMany(mappedBy = "submitter", cascade = CascadeType.ALL)
private List<Ergebnis1vs1> submittedGames1v1;
@OneToMany(mappedBy = "submitter", cascade = CascadeType.ALL)
private List<Ergebnis2vs2> submittedGames2v2;
public AuthentikUser() { public AuthentikUser() {
} }
public AuthentikUser(String id, String name) { public AuthentikUser(String id, String name) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.submittedGames1v1 = new ArrayList<>();
this.submittedGames2v2 = new ArrayList<>();
} }
public String getName() { public String getName() {
@@ -38,6 +48,14 @@ public class AuthentikUser {
this.spieler = spieler; this.spieler = spieler;
} }
public void addSubmittedResult(Ergebnis1vs1 ergebnis) {
submittedGames1v1.add(ergebnis);
}
public void addSubmittedResult(Ergebnis2vs2 ergebnis) {
submittedGames2v2.add(ergebnis);
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (!(o instanceof AuthentikUser)) return false; if (!(o instanceof AuthentikUser)) return false;

View File

@@ -27,13 +27,18 @@ public class Ergebnis1vs1 {
@CreationTimestamp @CreationTimestamp
private LocalDateTime timestamp; private LocalDateTime timestamp;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SUBMITTER", referencedColumnName = "ID")
private AuthentikUser submitter;
public Ergebnis1vs1() { public Ergebnis1vs1() {
} }
public Ergebnis1vs1(Spieler gewinner, Spieler verlierer, short toreVerlierer) { public Ergebnis1vs1(Spieler gewinner, Spieler verlierer, short toreVerlierer, AuthentikUser submitter) {
this.gewinner = gewinner; this.gewinner = gewinner;
this.verlierer = verlierer; this.verlierer = verlierer;
this.toreVerlierer = toreVerlierer; this.toreVerlierer = toreVerlierer;
this.submitter = submitter;
} }
public Spieler getVerlierer() { public Spieler getVerlierer() {

View File

@@ -35,15 +35,20 @@ public class Ergebnis2vs2 {
@CreationTimestamp @CreationTimestamp
private LocalDateTime timestamp; private LocalDateTime timestamp;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SUBMITTER", referencedColumnName = "ID")
private AuthentikUser submitter;
public Ergebnis2vs2() { public Ergebnis2vs2() {
} }
public Ergebnis2vs2(Spieler gewinnerVorn, Spieler gewinnerHinten, Spieler verliererVorn, Spieler verliererHinten, short toreVerlierer) { public Ergebnis2vs2(Spieler gewinnerVorn, Spieler gewinnerHinten, Spieler verliererVorn, Spieler verliererHinten, short toreVerlierer, AuthentikUser submitter) {
this.gewinnerVorn = gewinnerVorn; this.gewinnerVorn = gewinnerVorn;
this.gewinnerHinten = gewinnerHinten; this.gewinnerHinten = gewinnerHinten;
this.verliererVorn = verliererVorn; this.verliererVorn = verliererVorn;
this.verliererHinten = verliererHinten; this.verliererHinten = verliererHinten;
this.toreVerlierer = toreVerlierer; this.toreVerlierer = toreVerlierer;
this.submitter = submitter;
} }
public long getId() { public long getId() {

View File

@@ -1,14 +1,18 @@
package org.kickerelo.kickerelo.service; package org.kickerelo.kickerelo.service;
import org.kickerelo.kickerelo.exception.DuplicatePlayerException; import jakarta.transaction.Transactional;
import org.kickerelo.kickerelo.exception.InvalidDataException; import org.kickerelo.kickerelo.data.AuthentikUser;
import org.kickerelo.kickerelo.data.Ergebnis1vs1; import org.kickerelo.kickerelo.data.Ergebnis1vs1;
import org.kickerelo.kickerelo.data.Ergebnis2vs2; import org.kickerelo.kickerelo.data.Ergebnis2vs2;
import org.kickerelo.kickerelo.data.Spieler; import org.kickerelo.kickerelo.data.Spieler;
import org.kickerelo.kickerelo.exception.DuplicatePlayerException;
import org.kickerelo.kickerelo.exception.InvalidDataException;
import org.kickerelo.kickerelo.exception.PlayerNameNotSetException; import org.kickerelo.kickerelo.exception.PlayerNameNotSetException;
import org.kickerelo.kickerelo.repository.AuthentikUserRepository;
import org.kickerelo.kickerelo.repository.Ergebnis1vs1Repository; import org.kickerelo.kickerelo.repository.Ergebnis1vs1Repository;
import org.kickerelo.kickerelo.repository.Ergebnis2vs2Repository; import org.kickerelo.kickerelo.repository.Ergebnis2vs2Repository;
import org.kickerelo.kickerelo.repository.SpielerRepository; import org.kickerelo.kickerelo.repository.SpielerRepository;
import org.kickerelo.kickerelo.util.AccessControlService;
import org.kickerelo.kickerelo.util.EloChange1vs1; import org.kickerelo.kickerelo.util.EloChange1vs1;
import org.kickerelo.kickerelo.util.EloChange2vs2; import org.kickerelo.kickerelo.util.EloChange2vs2;
import org.kickerelo.kickerelo.util.comparator.Ergebnis1vs1TimeComparator; import org.kickerelo.kickerelo.util.comparator.Ergebnis1vs1TimeComparator;
@@ -29,15 +33,21 @@ public class KickerEloService {
private final Ergebnis2vs2Repository ergebnis2vs2Repository; private final Ergebnis2vs2Repository ergebnis2vs2Repository;
private final SpielerRepository spielerRepository; private final SpielerRepository spielerRepository;
private final EloCalculationService eloCalculationService; private final EloCalculationService eloCalculationService;
private final AccessControlService accessControlService;
private final AuthentikUserRepository userRepository;
public KickerEloService(Ergebnis1vs1Repository ergebnis1vs1Repository, public KickerEloService(Ergebnis1vs1Repository ergebnis1vs1Repository,
Ergebnis2vs2Repository ergebnis2vs2Repository, Ergebnis2vs2Repository ergebnis2vs2Repository,
SpielerRepository spielerRepository, SpielerRepository spielerRepository,
EloCalculationService eloCalculationService) { EloCalculationService eloCalculationService,
AccessControlService accessControlService,
AuthentikUserRepository userRepository) {
this.ergebnis1vs1Repository = ergebnis1vs1Repository; this.ergebnis1vs1Repository = ergebnis1vs1Repository;
this.ergebnis2vs2Repository = ergebnis2vs2Repository; this.ergebnis2vs2Repository = ergebnis2vs2Repository;
this.spielerRepository = spielerRepository; this.spielerRepository = spielerRepository;
this.eloCalculationService = eloCalculationService; this.eloCalculationService = eloCalculationService;
this.accessControlService = accessControlService;
this.userRepository = userRepository;
recalculateAll1vs1(); recalculateAll1vs1();
recalculateAll2vs2(); recalculateAll2vs2();
} }
@@ -62,6 +72,7 @@ public class KickerEloService {
* @param verlierer The losing player * @param verlierer The losing player
* @param toreVerlierer The number of goals of the loser * @param toreVerlierer The number of goals of the loser
*/ */
@Transactional
public void enterResult1vs1(Spieler gewinner, Spieler verlierer, public void enterResult1vs1(Spieler gewinner, Spieler verlierer,
short toreVerlierer) { short toreVerlierer) {
// Check if the inputs are valid // Check if the inputs are valid
@@ -76,8 +87,11 @@ public class KickerEloService {
throw new InvalidDataException("too many goals"); throw new InvalidDataException("too many goals");
} }
Ergebnis1vs1 ergebnis = new Ergebnis1vs1(gewinner, verlierer, toreVerlierer); AuthentikUser currentUser = accessControlService.getCurrentUser().orElseThrow(() -> new RuntimeException("User not authenticated"));
Ergebnis1vs1 ergebnis = new Ergebnis1vs1(gewinner, verlierer, toreVerlierer, currentUser);
currentUser.addSubmittedResult(ergebnis);
ergebnis = ergebnis1vs1Repository.save(ergebnis); ergebnis = ergebnis1vs1Repository.save(ergebnis);
userRepository.save(currentUser);
EloChange1vs1 change = eloCalculationService.updateElo1vs1(gewinner, verlierer, toreVerlierer); EloChange1vs1 change = eloCalculationService.updateElo1vs1(gewinner, verlierer, toreVerlierer);
EloChangeTracker.put1vs1Result(ergebnis.getId(), change); EloChangeTracker.put1vs1Result(ergebnis.getId(), change);
@@ -93,6 +107,7 @@ public class KickerEloService {
* @param verliererHinten losing defensive player * @param verliererHinten losing defensive player
* @param toreVerlierer Number of goals of the losing team * @param toreVerlierer Number of goals of the losing team
*/ */
@Transactional
public void enterResult2vs2(Spieler gewinnerVorn, Spieler gewinnerHinten, public void enterResult2vs2(Spieler gewinnerVorn, Spieler gewinnerHinten,
Spieler verliererVorn, Spieler verliererHinten, Spieler verliererVorn, Spieler verliererHinten,
short toreVerlierer) { short toreVerlierer) {
@@ -115,8 +130,11 @@ public class KickerEloService {
throw new InvalidDataException("too many loser goals"); throw new InvalidDataException("too many loser goals");
} }
Ergebnis2vs2 ergebnis = new Ergebnis2vs2(gewinnerVorn, gewinnerHinten, verliererVorn, verliererHinten, toreVerlierer); AuthentikUser currentUser = accessControlService.getCurrentUser().orElseThrow(() -> new RuntimeException("User not authenticated"));
Ergebnis2vs2 ergebnis = new Ergebnis2vs2(gewinnerVorn, gewinnerHinten, verliererVorn, verliererHinten, toreVerlierer, currentUser);
currentUser.addSubmittedResult(ergebnis);
ergebnis = ergebnis2vs2Repository.save(ergebnis); ergebnis = ergebnis2vs2Repository.save(ergebnis);
userRepository.save(currentUser);
EloChange2vs2 change = eloCalculationService.updateElo2vs2(gewinnerVorn, gewinnerHinten, verliererVorn, verliererHinten, toreVerlierer); EloChange2vs2 change = eloCalculationService.updateElo2vs2(gewinnerVorn, gewinnerHinten, verliererVorn, verliererHinten, toreVerlierer);
EloChangeTracker.put2vs2Result(ergebnis.getId(), change); EloChangeTracker.put2vs2Result(ergebnis.getId(), change);