5
0
mirror of https://github.com/AJMicke/KickerELO.git synced 2026-03-11 13:31: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

41
.gitignore vendored Normal file
View 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
View 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>

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);
}

View 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