mirror of
https://github.com/AJMicke/KickerELO.git
synced 2026-03-11 13:31:02 +01:00
Initial commit
This commit is contained in:
41
.gitignore
vendored
Normal file
41
.gitignore
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
|
||||
### Vaadin ###
|
||||
/src/main/frontend/generated/
|
||||
115
pom.xml
Normal file
115
pom.xml
Normal file
@@ -0,0 +1,115 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.kickerelo</groupId>
|
||||
<artifactId>KickerELO</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.4.2</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>23</maven.compiler.source>
|
||||
<maven.compiler.target>23</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<vaadin.version>24.6.4</vaadin.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.vaadin</groupId>
|
||||
<artifactId>vaadin-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency>
|
||||
<groupId>org.apache.derby</groupId>
|
||||
<artifactId>derbyclient</artifactId>
|
||||
<version>10.13.1.1</version>
|
||||
</dependency>-->
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.vaadin</groupId>
|
||||
<artifactId>vaadin-bom</artifactId>
|
||||
<version>${vaadin.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>production</id>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.vaadin</groupId>
|
||||
<artifactId>vaadin-core</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.vaadin</groupId>
|
||||
<artifactId>vaadin-dev</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.vaadin</groupId>
|
||||
<artifactId>vaadin-maven-plugin</artifactId>
|
||||
<version>${vaadin.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>frontend</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>prepare-frontend</goal>
|
||||
<goal>build-frontend</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
73
src/main/java/org/kickerelo/kickerelo/KickerEloService.java
Normal file
73
src/main/java/org/kickerelo/kickerelo/KickerEloService.java
Normal 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);
|
||||
}
|
||||
}
|
||||
70
src/main/java/org/kickerelo/kickerelo/MainView.java
Normal file
70
src/main/java/org/kickerelo/kickerelo/MainView.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package org.kickerelo.kickerelo;
|
||||
|
||||
public class NoSuchPlayerException extends RuntimeException {
|
||||
public NoSuchPlayerException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
75
src/main/java/org/kickerelo/kickerelo/data/Ergebnis1vs1.java
Normal file
75
src/main/java/org/kickerelo/kickerelo/data/Ergebnis1vs1.java
Normal 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;
|
||||
}
|
||||
}
|
||||
97
src/main/java/org/kickerelo/kickerelo/data/Ergebnis2vs2.java
Normal file
97
src/main/java/org/kickerelo/kickerelo/data/Ergebnis2vs2.java
Normal 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;
|
||||
}
|
||||
}
|
||||
45
src/main/java/org/kickerelo/kickerelo/data/Spieler.java
Normal file
45
src/main/java/org/kickerelo/kickerelo/data/Spieler.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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> {
|
||||
}
|
||||
@@ -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> {
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
6
src/main/resources/application.properties
Normal file
6
src/main/resources/application.properties
Normal file
@@ -0,0 +1,6 @@
|
||||
server.port=${PORT:8080}
|
||||
logging.level.org.atmosphere = warn
|
||||
spring.mustache.check-template-location = false
|
||||
|
||||
# Launch the default browser when starting the application in development mode
|
||||
vaadin.launch-browser=true
|
||||
Reference in New Issue
Block a user