fix SQLite
This commit is contained in:
Binary file not shown.
+1
-3
@@ -8,7 +8,7 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "8080:8081"
|
- "8080:8081"
|
||||||
volumes:
|
volumes:
|
||||||
- sqlite_data:/app/data # Volume für SQLite Datenbank
|
- ./data:/app/data # Direktes Mapping des data Verzeichnisses
|
||||||
environment:
|
environment:
|
||||||
- USE_SQLITE=true
|
- USE_SQLITE=true
|
||||||
networks:
|
networks:
|
||||||
@@ -17,5 +17,3 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
meldestelle-net:
|
meldestelle-net:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
volumes:
|
|
||||||
sqlite_data: # Volume für SQLite Datenbank
|
|
||||||
|
|||||||
@@ -121,97 +121,130 @@ class TurnierRepository {
|
|||||||
fun getAllTurniere(): List<Turnier> = transaction {
|
fun getAllTurniere(): List<Turnier> = transaction {
|
||||||
log.info("Fetching all tournaments from database...")
|
log.info("Fetching all tournaments from database...")
|
||||||
|
|
||||||
// Get all tournaments
|
try {
|
||||||
val turniere = TurniereTable.selectAll().map { row ->
|
// Get all tournaments
|
||||||
Turnier(
|
val turniere = TurniereTable.selectAll().map { row ->
|
||||||
name = row[TurniereTable.name],
|
Turnier(
|
||||||
datum = row[TurniereTable.datum],
|
name = row[TurniereTable.name],
|
||||||
number = row[TurniereTable.number]
|
datum = row[TurniereTable.datum],
|
||||||
)
|
number = row[TurniereTable.number]
|
||||||
}
|
|
||||||
|
|
||||||
// For each tournament, get its competitions
|
|
||||||
turniere.forEach { turnier ->
|
|
||||||
val bewerbeList = BewerbeTable.selectAll().where { BewerbeTable.turnierNumber eq turnier.number }.map { row ->
|
|
||||||
Bewerb(
|
|
||||||
nummer = row[BewerbeTable.nummer],
|
|
||||||
titel = row[BewerbeTable.titel],
|
|
||||||
klasse = row[BewerbeTable.klasse],
|
|
||||||
task = row[BewerbeTable.task]
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
turnier.bewerbe = bewerbeList
|
|
||||||
}
|
|
||||||
|
|
||||||
turniere
|
log.info("Found ${turniere.size} tournaments in database")
|
||||||
|
|
||||||
|
// For each tournament, get its competitions
|
||||||
|
turniere.forEach { turnier ->
|
||||||
|
try {
|
||||||
|
val bewerbeList = BewerbeTable.selectAll().where { BewerbeTable.turnierNumber eq turnier.number }.map { row ->
|
||||||
|
Bewerb(
|
||||||
|
nummer = row[BewerbeTable.nummer],
|
||||||
|
titel = row[BewerbeTable.titel],
|
||||||
|
klasse = row[BewerbeTable.klasse],
|
||||||
|
task = row[BewerbeTable.task]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
turnier.bewerbe = bewerbeList
|
||||||
|
log.info("Found ${bewerbeList.size} competitions for tournament ${turnier.number}")
|
||||||
|
} catch (e: Exception) {
|
||||||
|
log.error("Error fetching competitions for tournament ${turnier.number}", e)
|
||||||
|
turnier.bewerbe = emptyList() // Set empty list to avoid null pointer exceptions
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
turniere
|
||||||
|
} catch (e: Exception) {
|
||||||
|
log.error("Error fetching tournaments from database", e)
|
||||||
|
emptyList() // Return empty list instead of throwing exception
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inserts dummy tournaments with competitions if the table is empty.
|
* Inserts dummy tournaments with competitions if the table is empty.
|
||||||
*/
|
*/
|
||||||
fun insertDummyTurnierIfEmpty() = transaction {
|
fun insertDummyTurnierIfEmpty() = transaction {
|
||||||
if (TurniereTable.selectAll().count() == 0L) {
|
try {
|
||||||
log.info("Turnier table is empty, inserting dummy tournaments...")
|
// First check if the table is empty
|
||||||
|
val count = TurniereTable.selectAll().count()
|
||||||
|
log.info("Current tournament count in database: $count")
|
||||||
|
|
||||||
// Insert first tournament
|
if (count == 0L) {
|
||||||
val turnierNumber1 = 25319
|
log.info("Turnier table is empty, inserting dummy tournaments...")
|
||||||
TurniereTable.insert {
|
|
||||||
it[TurniereTable.number] = turnierNumber1
|
try {
|
||||||
it[TurniereTable.name] = "CSN-C Edelhof April 2025"
|
// Insert first tournament
|
||||||
it[TurniereTable.datum] = "14.04.2025 - 15.04.2025"
|
val turnierNumber1 = 25319
|
||||||
|
TurniereTable.insert {
|
||||||
|
it[TurniereTable.number] = turnierNumber1
|
||||||
|
it[TurniereTable.name] = "CSN-C Edelhof April 2025"
|
||||||
|
it[TurniereTable.datum] = "14.04.2025 - 15.04.2025"
|
||||||
|
}
|
||||||
|
log.info("Inserted first tournament with number $turnierNumber1")
|
||||||
|
|
||||||
|
// Insert competitions for first tournament
|
||||||
|
BewerbeTable.insert {
|
||||||
|
it[BewerbeTable.nummer] = 1
|
||||||
|
it[BewerbeTable.titel] = "Stilspringprüfung"
|
||||||
|
it[BewerbeTable.klasse] = "60 cm"
|
||||||
|
it[BewerbeTable.task] = null
|
||||||
|
it[BewerbeTable.turnierNumber] = turnierNumber1
|
||||||
|
}
|
||||||
|
|
||||||
|
BewerbeTable.insert {
|
||||||
|
it[BewerbeTable.nummer] = 2
|
||||||
|
it[BewerbeTable.titel] = "Dressurprüfung"
|
||||||
|
it[BewerbeTable.klasse] = "Kl. A"
|
||||||
|
it[BewerbeTable.task] = "DRA 1"
|
||||||
|
it[BewerbeTable.turnierNumber] = turnierNumber1
|
||||||
|
}
|
||||||
|
log.info("Inserted competitions for first tournament")
|
||||||
|
|
||||||
|
// Insert second tournament (as specified in the issue description)
|
||||||
|
val turnierNumber2 = 25320
|
||||||
|
TurniereTable.insert {
|
||||||
|
it[TurniereTable.number] = turnierNumber2
|
||||||
|
it[TurniereTable.name] = "CDN-C CDNP-C NEU Neumarkt/M., OÖ"
|
||||||
|
it[TurniereTable.datum] = "8. JUNI 2025"
|
||||||
|
}
|
||||||
|
log.info("Inserted second tournament with number $turnierNumber2")
|
||||||
|
|
||||||
|
// Insert competitions for second tournament
|
||||||
|
BewerbeTable.insert {
|
||||||
|
it[BewerbeTable.nummer] = 1
|
||||||
|
it[BewerbeTable.titel] = "Dressurprüfung"
|
||||||
|
it[BewerbeTable.klasse] = "Kl. A"
|
||||||
|
it[BewerbeTable.task] = "DRA 2"
|
||||||
|
it[BewerbeTable.turnierNumber] = turnierNumber2
|
||||||
|
}
|
||||||
|
|
||||||
|
BewerbeTable.insert {
|
||||||
|
it[BewerbeTable.nummer] = 2
|
||||||
|
it[BewerbeTable.titel] = "Dressurprüfung"
|
||||||
|
it[BewerbeTable.klasse] = "Kl. L"
|
||||||
|
it[BewerbeTable.task] = "DRL 1"
|
||||||
|
it[BewerbeTable.turnierNumber] = turnierNumber2
|
||||||
|
}
|
||||||
|
|
||||||
|
BewerbeTable.insert {
|
||||||
|
it[BewerbeTable.nummer] = 3
|
||||||
|
it[BewerbeTable.titel] = "Dressurprüfung"
|
||||||
|
it[BewerbeTable.klasse] = "Kl. L"
|
||||||
|
it[BewerbeTable.task] = "DRL 2"
|
||||||
|
it[BewerbeTable.turnierNumber] = turnierNumber2
|
||||||
|
}
|
||||||
|
log.info("Inserted competitions for second tournament")
|
||||||
|
|
||||||
|
log.info("Dummy tournaments and competitions inserted successfully.")
|
||||||
|
} catch (e: Exception) {
|
||||||
|
log.error("Error inserting dummy tournaments", e)
|
||||||
|
// Don't rethrow, allow the application to continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.info("Turnier table is not empty, skipping dummy data insertion")
|
||||||
}
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
// Insert competitions for first tournament
|
log.error("Error checking if tournament table is empty", e)
|
||||||
BewerbeTable.insert {
|
// Don't rethrow, allow the application to continue
|
||||||
it[BewerbeTable.nummer] = 1
|
|
||||||
it[BewerbeTable.titel] = "Stilspringprüfung"
|
|
||||||
it[BewerbeTable.klasse] = "60 cm"
|
|
||||||
it[BewerbeTable.task] = null
|
|
||||||
it[BewerbeTable.turnierNumber] = turnierNumber1
|
|
||||||
}
|
|
||||||
|
|
||||||
BewerbeTable.insert {
|
|
||||||
it[BewerbeTable.nummer] = 2
|
|
||||||
it[BewerbeTable.titel] = "Dressurprüfung"
|
|
||||||
it[BewerbeTable.klasse] = "Kl. A"
|
|
||||||
it[BewerbeTable.task] = "DRA 1"
|
|
||||||
it[BewerbeTable.turnierNumber] = turnierNumber1
|
|
||||||
}
|
|
||||||
|
|
||||||
// Insert second tournament (as specified in the issue description)
|
|
||||||
val turnierNumber2 = 25320
|
|
||||||
TurniereTable.insert {
|
|
||||||
it[TurniereTable.number] = turnierNumber2
|
|
||||||
it[TurniereTable.name] = "CDN-C CDNP-C NEU Neumarkt/M., OÖ"
|
|
||||||
it[TurniereTable.datum] = "8. JUNI 2025"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Insert competitions for second tournament
|
|
||||||
BewerbeTable.insert {
|
|
||||||
it[BewerbeTable.nummer] = 1
|
|
||||||
it[BewerbeTable.titel] = "Dressurprüfung"
|
|
||||||
it[BewerbeTable.klasse] = "Kl. A"
|
|
||||||
it[BewerbeTable.task] = "DRA 2"
|
|
||||||
it[BewerbeTable.turnierNumber] = turnierNumber2
|
|
||||||
}
|
|
||||||
|
|
||||||
BewerbeTable.insert {
|
|
||||||
it[BewerbeTable.nummer] = 2
|
|
||||||
it[BewerbeTable.titel] = "Dressurprüfung"
|
|
||||||
it[BewerbeTable.klasse] = "Kl. L"
|
|
||||||
it[BewerbeTable.task] = "DRL 1"
|
|
||||||
it[BewerbeTable.turnierNumber] = turnierNumber2
|
|
||||||
}
|
|
||||||
|
|
||||||
BewerbeTable.insert {
|
|
||||||
it[BewerbeTable.nummer] = 3
|
|
||||||
it[BewerbeTable.titel] = "Dressurprüfung"
|
|
||||||
it[BewerbeTable.klasse] = "Kl. L"
|
|
||||||
it[BewerbeTable.task] = "DRL 2"
|
|
||||||
it[BewerbeTable.turnierNumber] = turnierNumber2
|
|
||||||
}
|
|
||||||
|
|
||||||
log.info("Dummy tournaments and competitions inserted successfully.")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,26 +254,47 @@ class TurnierRepository {
|
|||||||
* @return The tournament or null if not found
|
* @return The tournament or null if not found
|
||||||
*/
|
*/
|
||||||
fun getTurnierByNumber(number: Int): Turnier? = transaction {
|
fun getTurnierByNumber(number: Int): Turnier? = transaction {
|
||||||
// Get the tournament
|
log.info("Fetching tournament with number $number")
|
||||||
val turnierRow = TurniereTable.selectAll().where { TurniereTable.number eq number }.singleOrNull() ?: return@transaction null
|
|
||||||
|
|
||||||
val turnier = Turnier(
|
try {
|
||||||
name = turnierRow[TurniereTable.name],
|
// Get the tournament
|
||||||
datum = turnierRow[TurniereTable.datum],
|
val turnierRow = TurniereTable.selectAll().where { TurniereTable.number eq number }.singleOrNull()
|
||||||
number = turnierRow[TurniereTable.number]
|
|
||||||
)
|
|
||||||
|
|
||||||
// Get competitions for this tournament
|
if (turnierRow == null) {
|
||||||
val bewerbeList = BewerbeTable.selectAll().where { BewerbeTable.turnierNumber eq number }.map { row ->
|
log.warn("Tournament with number $number not found")
|
||||||
Bewerb(
|
return@transaction null
|
||||||
nummer = row[BewerbeTable.nummer],
|
}
|
||||||
titel = row[BewerbeTable.titel],
|
|
||||||
klasse = row[BewerbeTable.klasse],
|
log.info("Found tournament with number $number: ${turnierRow[TurniereTable.name]}")
|
||||||
task = row[BewerbeTable.task]
|
|
||||||
|
val turnier = Turnier(
|
||||||
|
name = turnierRow[TurniereTable.name],
|
||||||
|
datum = turnierRow[TurniereTable.datum],
|
||||||
|
number = turnierRow[TurniereTable.number]
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
|
||||||
turnier.bewerbe = bewerbeList
|
try {
|
||||||
turnier
|
// Get competitions for this tournament
|
||||||
|
val bewerbeList = BewerbeTable.selectAll().where { BewerbeTable.turnierNumber eq number }.map { row ->
|
||||||
|
Bewerb(
|
||||||
|
nummer = row[BewerbeTable.nummer],
|
||||||
|
titel = row[BewerbeTable.titel],
|
||||||
|
klasse = row[BewerbeTable.klasse],
|
||||||
|
task = row[BewerbeTable.task]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("Found ${bewerbeList.size} competitions for tournament $number")
|
||||||
|
turnier.bewerbe = bewerbeList
|
||||||
|
} catch (e: Exception) {
|
||||||
|
log.error("Error fetching competitions for tournament $number", e)
|
||||||
|
turnier.bewerbe = emptyList() // Set empty list to avoid null pointer exceptions
|
||||||
|
}
|
||||||
|
|
||||||
|
turnier
|
||||||
|
} catch (e: Exception) {
|
||||||
|
log.error("Error fetching tournament with number $number", e)
|
||||||
|
null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,19 +73,24 @@ fun Route.adminRoutes() {
|
|||||||
val bewerbKlasse = formParameters.getAll("bewerb-klasse[]") ?: emptyList()
|
val bewerbKlasse = formParameters.getAll("bewerb-klasse[]") ?: emptyList()
|
||||||
val bewerbTask = formParameters.getAll("bewerb-task[]") ?: emptyList()
|
val bewerbTask = formParameters.getAll("bewerb-task[]") ?: emptyList()
|
||||||
|
|
||||||
|
log.info("Received competitions for creation: ${bewerbNummern.size} numbers, ${bewerbTitel.size} titles, ${bewerbKlasse.size} classes, ${bewerbTask.size} tasks")
|
||||||
|
|
||||||
// Create list of competitions
|
// Create list of competitions
|
||||||
val bewerbe = mutableListOf<Bewerb>()
|
val bewerbe = mutableListOf<Bewerb>()
|
||||||
for (i in bewerbNummern.indices) {
|
for (i in bewerbNummern.indices) {
|
||||||
if (i < bewerbTitel.size && i < bewerbKlasse.size && i < bewerbTask.size) {
|
val titel = if (i < bewerbTitel.size) bewerbTitel[i] else "Unbenannter Bewerb"
|
||||||
bewerbe.add(
|
val klasse = if (i < bewerbKlasse.size) bewerbKlasse[i] else "Keine Klasse"
|
||||||
Bewerb(
|
val task = if (i < bewerbTask.size && bewerbTask[i].isNotBlank()) bewerbTask[i] else null
|
||||||
nummer = bewerbNummern[i],
|
|
||||||
titel = bewerbTitel[i],
|
bewerbe.add(
|
||||||
klasse = bewerbKlasse[i],
|
Bewerb(
|
||||||
task = if (bewerbTask[i].isNotBlank()) bewerbTask[i] else null
|
nummer = bewerbNummern[i],
|
||||||
)
|
titel = titel,
|
||||||
|
klasse = klasse,
|
||||||
|
task = task
|
||||||
)
|
)
|
||||||
}
|
)
|
||||||
|
log.info("Added competition for creation: ${bewerbNummern[i]}, $titel, $klasse, $task")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the tournament
|
// Create the tournament
|
||||||
@@ -126,19 +131,24 @@ fun Route.adminRoutes() {
|
|||||||
val bewerbKlasse = formParameters.getAll("bewerb-klasse[]") ?: emptyList()
|
val bewerbKlasse = formParameters.getAll("bewerb-klasse[]") ?: emptyList()
|
||||||
val bewerbTask = formParameters.getAll("bewerb-task[]") ?: emptyList()
|
val bewerbTask = formParameters.getAll("bewerb-task[]") ?: emptyList()
|
||||||
|
|
||||||
|
log.info("Received competitions for update: ${bewerbNummern.size} numbers, ${bewerbTitel.size} titles, ${bewerbKlasse.size} classes, ${bewerbTask.size} tasks")
|
||||||
|
|
||||||
// Create list of competitions
|
// Create list of competitions
|
||||||
val bewerbe = mutableListOf<Bewerb>()
|
val bewerbe = mutableListOf<Bewerb>()
|
||||||
for (i in bewerbNummern.indices) {
|
for (i in bewerbNummern.indices) {
|
||||||
if (i < bewerbTitel.size && i < bewerbKlasse.size && i < bewerbTask.size) {
|
val titel = if (i < bewerbTitel.size) bewerbTitel[i] else "Unbenannter Bewerb"
|
||||||
bewerbe.add(
|
val klasse = if (i < bewerbKlasse.size) bewerbKlasse[i] else "Keine Klasse"
|
||||||
Bewerb(
|
val task = if (i < bewerbTask.size && bewerbTask[i].isNotBlank()) bewerbTask[i] else null
|
||||||
nummer = bewerbNummern[i],
|
|
||||||
titel = bewerbTitel[i],
|
bewerbe.add(
|
||||||
klasse = bewerbKlasse[i],
|
Bewerb(
|
||||||
task = if (bewerbTask[i].isNotBlank()) bewerbTask[i] else null
|
nummer = bewerbNummern[i],
|
||||||
)
|
titel = titel,
|
||||||
|
klasse = klasse,
|
||||||
|
task = task
|
||||||
)
|
)
|
||||||
}
|
)
|
||||||
|
log.info("Added competition for update: ${bewerbNummern[i]}, $titel, $klasse, $task")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the tournament
|
// Update the tournament
|
||||||
|
|||||||
@@ -16,10 +16,7 @@ fun Route.homeRoutes() {
|
|||||||
get("/") {
|
get("/") {
|
||||||
log.info("Handling request to home page")
|
log.info("Handling request to home page")
|
||||||
|
|
||||||
// Insert dummy tournament if needed
|
// Get all tournaments from the database
|
||||||
turnierRepository.insertDummyTurnierIfEmpty()
|
|
||||||
|
|
||||||
// Get all tournaments
|
|
||||||
val turniere = turnierRepository.getAllTurniere()
|
val turniere = turnierRepository.getAllTurniere()
|
||||||
|
|
||||||
// Render the home page
|
// Render the home page
|
||||||
|
|||||||
@@ -178,10 +178,10 @@ class LayoutTemplate {
|
|||||||
textarea,
|
textarea,
|
||||||
select {
|
select {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 1.2rem;
|
padding: 0.8rem;
|
||||||
border: none;
|
border: 1px solid var(--border-color);
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
font-size: 2rem;
|
font-size: 1rem;
|
||||||
transition: all 0.3s;
|
transition: all 0.3s;
|
||||||
margin-bottom: 1.2rem;
|
margin-bottom: 1.2rem;
|
||||||
box-shadow: 0 1px 3px rgba(0,0,0,0.05);
|
box-shadow: 0 1px 3px rgba(0,0,0,0.05);
|
||||||
@@ -220,7 +220,6 @@ class LayoutTemplate {
|
|||||||
letter-spacing: 0.5px;
|
letter-spacing: 0.5px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
|
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
|
||||||
width: 100%;
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -359,8 +358,7 @@ class LayoutTemplate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.button, button {
|
.button, button {
|
||||||
width: 100%;
|
display: block;
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user