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

Initial commit

This commit is contained in:
Anton Micke
2025-02-05 17:42:09 +01:00
commit ee2c9687a4
13 changed files with 579 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
package org.kickerelo.kickerelo;
import com.vaadin.flow.component.page.AppShellConfigurator;
import com.vaadin.flow.theme.Theme;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
@EntityScan(basePackages = "org.kickerelo.kickerelo.data")
@EnableJpaRepositories
@Theme("my-theme")
public class KickerEloApplication implements AppShellConfigurator {
public static void main(String[] args) {
SpringApplication.run(KickerEloApplication.class, args);
}
}

View File

@@ -0,0 +1,73 @@
package org.kickerelo.kickerelo;
import org.kickerelo.kickerelo.data.Ergebnis1vs1;
import org.kickerelo.kickerelo.data.Ergebnis2vs2;
import org.kickerelo.kickerelo.data.Spieler;
import org.kickerelo.kickerelo.repository.Ergebnis1vs1Repository;
import org.kickerelo.kickerelo.repository.Ergebnis2vs2Repository;
import org.kickerelo.kickerelo.repository.SpielerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class KickerEloService {
@Autowired
private Ergebnis1vs1Repository ergebnis1vs1Repository;
@Autowired
private Ergebnis2vs2Repository ergebnis2vs2Repository;
@Autowired
private SpielerRepository spielerRepository;
public List<String> getSpielerNamen() {
return spielerRepository.findAll().stream().map(Spieler::getName).toList();
}
public void enterResult1vs1(String gewinnerName, String verliererName,
short toreVerlierer) {
Spieler gewinner = spielerRepository.findByName(gewinnerName)
.orElseThrow(() -> new NoSuchPlayerException(gewinnerName));
Spieler verlierer = spielerRepository.findByName(verliererName)
.orElseThrow(() -> new NoSuchPlayerException(verliererName));
Ergebnis1vs1 ergebnis = new Ergebnis1vs1(gewinner, verlierer, toreVerlierer);
ergebnis1vs1Repository.save(ergebnis);
// Compute the new ELO and update the Spieler entities
}
public void enterResult2vs2(String gewinnerNameVorn, String gewinnerNameHinten,
String verliererNameVorn, String verliererNameHinten,
short toreVerlierer) {
Spieler gewinnerVorn = spielerRepository.findByName(gewinnerNameVorn)
.orElseThrow(() -> new NoSuchPlayerException(gewinnerNameVorn));
Spieler gewinnerHinten = spielerRepository.findByName(gewinnerNameHinten)
.orElseThrow(() -> new NoSuchPlayerException(gewinnerNameHinten));
Spieler verliererVorn = spielerRepository.findByName(verliererNameVorn)
.orElseThrow(() -> new NoSuchPlayerException(verliererNameVorn));
Spieler verliererHinten = spielerRepository.findByName(verliererNameHinten)
.orElseThrow(() -> new NoSuchPlayerException(verliererNameHinten));
Ergebnis2vs2 ergebnis = new Ergebnis2vs2(gewinnerVorn, gewinnerHinten, verliererVorn, verliererHinten, toreVerlierer);
ergebnis2vs2Repository.save(ergebnis);
// Compute the new ELO, update the Spieler entitities
}
public void addSpieler(String name) {
Spieler spieler = new Spieler();
spieler.setName(name);
spieler.setElo(1500);
spielerRepository.save(spieler);
}
}

View File

@@ -0,0 +1,70 @@
package org.kickerelo.kickerelo;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.notification.NotificationVariant;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.IntegerField;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.router.Route;
/**
* A sample Vaadin view class.
* <p>
* To implement a Vaadin view just extend any Vaadin component and use @Route
* annotation to announce it in a URL as a Spring managed bean.
* <p>
* A new instance of this class is created for every new user and every browser
* tab/window.
* <p>
* The main view contains a text field for getting the user name and a button
* that shows a greeting message in a notification.
*/
@Route
public class MainView extends VerticalLayout {
/**
* Construct a new Vaadin view.
*/
public MainView(KickerEloService eloService) {
TextField spielername = new TextField("Spielername");
spielername.addClassName("bordered");
// Button click listeners can be defined as lambda expressions
Button button = new Button("Spieler hinzufügen", e -> {
eloService.addSpieler(spielername.getValue());
Notification.show("Spieler gespeichert").addThemeVariants(NotificationVariant.LUMO_SUCCESS);
});
button.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
ComboBox<String> winnerSelect = new ComboBox<>("Gewinner");
winnerSelect.setItems(eloService.getSpielerNamen());
winnerSelect.setPlaceholder("Spieler auswählen");
ComboBox<String> loserSelect = new ComboBox<>("Verlierer");
loserSelect.setItems(eloService.getSpielerNamen());
loserSelect.setPlaceholder("Spieler auswählen");
IntegerField loserGoals = new IntegerField("Tore des Verlierers");
loserGoals.setMin(0);
loserGoals.setMax(9);
loserGoals.setValue(0);
loserGoals.setStepButtonsVisible(true);
Button saveButton = new Button("Speichern", e ->
eloService.enterResult1vs1(winnerSelect.getValue(), loserSelect.getValue(), loserGoals.getValue().shortValue()));
// Use custom CSS classes to apply styling. This is defined in
// styles.css.
addClassName("centered-content");
add(spielername, button, winnerSelect, loserSelect, loserGoals, saveButton);
}
}

View File

@@ -0,0 +1,7 @@
package org.kickerelo.kickerelo;
public class NoSuchPlayerException extends RuntimeException {
public NoSuchPlayerException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,75 @@
package org.kickerelo.kickerelo.data;
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
public class Ergebnis1vs1 {
@Id
@Column(name = "ID")
private long id;
@ManyToOne
@JoinColumn(name = "GEWINNER")
private Spieler gewinner;
@ManyToOne
@JoinColumn(name = "VERLIERER")
private Spieler verlierer;
@Column(name = "TORE_VERLIERER")
private short toreVerlierer;
@Column(name = "ZEITPUNKT")
private LocalDateTime timestamp;
public Ergebnis1vs1() {
}
public Ergebnis1vs1(Spieler gewinner, Spieler verlierer, short toreVerlierer) {
this.gewinner = gewinner;
this.verlierer = verlierer;
this.toreVerlierer = toreVerlierer;
}
public Spieler getVerlierer() {
return verlierer;
}
public void setVerlierer(Spieler verlierer) {
this.verlierer = verlierer;
}
public Spieler getGewinner() {
return gewinner;
}
public void setGewinner(Spieler gewinner) {
this.gewinner = gewinner;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public short getToreVerlierer() {
return toreVerlierer;
}
public void setToreVerlierer(short toreVerlierer) {
this.toreVerlierer = toreVerlierer;
}
public LocalDateTime getTimestamp() {
return timestamp;
}
public void setTimestamp(LocalDateTime timestamp) {
this.timestamp = timestamp;
}
}

View File

@@ -0,0 +1,97 @@
package org.kickerelo.kickerelo.data;
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
public class Ergebnis2vs2 {
@Id
@Column(name = "ID")
private long id;
@ManyToOne
@JoinColumn(name = "GEWINNER_VORN")
private Spieler gewinnerVorn;
@ManyToOne
@JoinColumn(name = "GEWINNER_HINTEN")
private Spieler gewinnerHinten;
@ManyToOne
@JoinColumn(name = "VERLIERER_VORN")
private Spieler verliererVorn;
@ManyToOne
@JoinColumn(name = "VERLIERER_HINTEN")
private Spieler verliererHinten;
@Column(name = "TORE_VERLIERER")
private short toreVerlierer;
@Column(name = "ZEITPUNKT")
private LocalDateTime timestamp;
public Ergebnis2vs2() {
}
public Ergebnis2vs2(Spieler gewinnerVorn, Spieler gewinnerHinten, Spieler verliererVorn, Spieler verliererHinten, short toreVerlierer) {
this.gewinnerVorn = gewinnerVorn;
this.gewinnerHinten = gewinnerHinten;
this.verliererVorn = verliererVorn;
this.verliererHinten = verliererHinten;
this.toreVerlierer = toreVerlierer;
}
public long getId() {
return id;
}
public short getToreVerlierer() {
return toreVerlierer;
}
public void setToreVerlierer(short toreVerlierer) {
this.toreVerlierer = toreVerlierer;
}
public LocalDateTime getTimestamp() {
return timestamp;
}
public void setTimestamp(LocalDateTime timestamp) {
this.timestamp = timestamp;
}
public Spieler getVerliererHinten() {
return verliererHinten;
}
public void setVerliererHinten(Spieler verliererHinten) {
this.verliererHinten = verliererHinten;
}
public Spieler getVerliererVorn() {
return verliererVorn;
}
public void setVerliererVorn(Spieler verliererVorn) {
this.verliererVorn = verliererVorn;
}
public Spieler getGewinnerHinten() {
return gewinnerHinten;
}
public void setGewinnerHinten(Spieler gewinnerHinten) {
this.gewinnerHinten = gewinnerHinten;
}
public Spieler getGewinnerVorn() {
return gewinnerVorn;
}
public void setGewinnerVorn(Spieler gewinnerVorn) {
this.gewinnerVorn = gewinnerVorn;
}
}

View File

@@ -0,0 +1,45 @@
package org.kickerelo.kickerelo.data;
import jakarta.persistence.*;
@Entity
@Table(name = "SPIELER")
public class Spieler {
@Id
@Column(name = "ID", unique = true, nullable = false)
@GeneratedValue
private int id;
@Column(name = "NAME", nullable = false, unique = true)
private String name;
@Column(name = "ELO", nullable = false)
private float elo;
public Spieler() {
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getElo() {
return elo;
}
public void setElo(float elo) {
this.elo = elo;
}
}

View File

@@ -0,0 +1,9 @@
package org.kickerelo.kickerelo.repository;
import org.kickerelo.kickerelo.data.Ergebnis1vs1;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface Ergebnis1vs1Repository extends JpaRepository<Ergebnis1vs1, Long> {
}

View File

@@ -0,0 +1,9 @@
package org.kickerelo.kickerelo.repository;
import org.kickerelo.kickerelo.data.Ergebnis2vs2;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface Ergebnis2vs2Repository extends JpaRepository<Ergebnis2vs2, Long> {
}

View File

@@ -0,0 +1,12 @@
package org.kickerelo.kickerelo.repository;
import org.kickerelo.kickerelo.data.Spieler;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface SpielerRepository extends JpaRepository<Spieler, Long> {
Optional<Spieler> findByName(String name);
}