fix SQLite

This commit is contained in:
stefan
2025-06-05 15:43:31 +02:00
parent 0482ef8479
commit 3b752bd90e
6 changed files with 185 additions and 128 deletions
Binary file not shown.
+1 -3
View File
@@ -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;
} }
} }