From 3b752bd90effba5d2286e119b55f5df106bd441a Mon Sep 17 00:00:00 2001 From: stefan Date: Thu, 5 Jun 2025 15:43:31 +0200 Subject: [PATCH] fix SQLite --- data/meldestelle.db | Bin 32768 -> 32768 bytes docker-compose.yml | 4 +- .../at/mocode/repository/TurnierRepository.kt | 248 +++++++++++------- .../kotlin/at/mocode/routes/AdminRoutes.kt | 46 ++-- .../kotlin/at/mocode/routes/HomeRoutes.kt | 5 +- .../kotlin/at/mocode/views/LayoutTemplate.kt | 10 +- 6 files changed, 185 insertions(+), 128 deletions(-) diff --git a/data/meldestelle.db b/data/meldestelle.db index 13b965f3c9732337b9d23be82e654e62cfeb4f8c..922ef380639c8c504b58898d5f631aac6aff4ac2 100644 GIT binary patch delta 158 zcmZo@U}|V!njp={HBrWyk!xeZ5`G>Qeh&uz)BKb8qxd~G3kq293kk5WFp5i7holyl z7#Zpr>KU0%j*?#mRQQ5{{}2BQ{&)OeHw!A<;AdlHW@M~pnfy*)43DI}7_&5w`eb$o lQzjmDpan0vdAViT88`*`85o_yb*nd<_?#AIlwFjd0002!DRTe- delta 108 zcmZo@U}|V!njp={IZ?)$k#l3h5`Hdb{wN0i)BKb8qc#gF`0!7Tl3xWBd&j{4hyNY_ u*Uf?jH~1$8a7=!uFNRgvUW{3a$7C|QgXv~LfgjwPO?*xZGs-MVPyhfh`Xed; diff --git a/docker-compose.yml b/docker-compose.yml index 8231b823..5f85fcd5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,7 @@ services: ports: - "8080:8081" volumes: - - sqlite_data:/app/data # Volume für SQLite Datenbank + - ./data:/app/data # Direktes Mapping des data Verzeichnisses environment: - USE_SQLITE=true networks: @@ -17,5 +17,3 @@ services: networks: meldestelle-net: driver: bridge -volumes: - sqlite_data: # Volume für SQLite Datenbank diff --git a/server/src/main/kotlin/at/mocode/repository/TurnierRepository.kt b/server/src/main/kotlin/at/mocode/repository/TurnierRepository.kt index f7ff4e46..4367dab1 100644 --- a/server/src/main/kotlin/at/mocode/repository/TurnierRepository.kt +++ b/server/src/main/kotlin/at/mocode/repository/TurnierRepository.kt @@ -121,97 +121,130 @@ class TurnierRepository { fun getAllTurniere(): List = transaction { log.info("Fetching all tournaments from database...") - // Get all tournaments - val turniere = TurniereTable.selectAll().map { row -> - Turnier( - name = row[TurniereTable.name], - 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] + try { + // Get all tournaments + val turniere = TurniereTable.selectAll().map { row -> + Turnier( + name = row[TurniereTable.name], + datum = row[TurniereTable.datum], + number = row[TurniereTable.number] ) } - 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. */ fun insertDummyTurnierIfEmpty() = transaction { - if (TurniereTable.selectAll().count() == 0L) { - log.info("Turnier table is empty, inserting dummy tournaments...") + try { + // First check if the table is empty + val count = TurniereTable.selectAll().count() + log.info("Current tournament count in database: $count") - // Insert first tournament - 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" + if (count == 0L) { + log.info("Turnier table is empty, inserting dummy tournaments...") + + try { + // Insert first tournament + 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") } - - // 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 - } - - // 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.") + } catch (e: Exception) { + log.error("Error checking if tournament table is empty", e) + // Don't rethrow, allow the application to continue } } @@ -221,26 +254,47 @@ class TurnierRepository { * @return The tournament or null if not found */ fun getTurnierByNumber(number: Int): Turnier? = transaction { - // Get the tournament - val turnierRow = TurniereTable.selectAll().where { TurniereTable.number eq number }.singleOrNull() ?: return@transaction null + log.info("Fetching tournament with number $number") - val turnier = Turnier( - name = turnierRow[TurniereTable.name], - datum = turnierRow[TurniereTable.datum], - number = turnierRow[TurniereTable.number] - ) + try { + // Get the tournament + val turnierRow = TurniereTable.selectAll().where { TurniereTable.number eq number }.singleOrNull() - // 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] + if (turnierRow == null) { + log.warn("Tournament with number $number not found") + return@transaction null + } + + log.info("Found tournament with number $number: ${turnierRow[TurniereTable.name]}") + + val turnier = Turnier( + name = turnierRow[TurniereTable.name], + datum = turnierRow[TurniereTable.datum], + number = turnierRow[TurniereTable.number] ) - } - turnier.bewerbe = bewerbeList - turnier + try { + // 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 + } } } diff --git a/server/src/main/kotlin/at/mocode/routes/AdminRoutes.kt b/server/src/main/kotlin/at/mocode/routes/AdminRoutes.kt index 1e30e9e6..9e15d2b7 100644 --- a/server/src/main/kotlin/at/mocode/routes/AdminRoutes.kt +++ b/server/src/main/kotlin/at/mocode/routes/AdminRoutes.kt @@ -73,19 +73,24 @@ fun Route.adminRoutes() { val bewerbKlasse = formParameters.getAll("bewerb-klasse[]") ?: 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 val bewerbe = mutableListOf() for (i in bewerbNummern.indices) { - if (i < bewerbTitel.size && i < bewerbKlasse.size && i < bewerbTask.size) { - bewerbe.add( - Bewerb( - nummer = bewerbNummern[i], - titel = bewerbTitel[i], - klasse = bewerbKlasse[i], - task = if (bewerbTask[i].isNotBlank()) bewerbTask[i] else null - ) + val titel = if (i < bewerbTitel.size) bewerbTitel[i] else "Unbenannter Bewerb" + val klasse = if (i < bewerbKlasse.size) bewerbKlasse[i] else "Keine Klasse" + val task = if (i < bewerbTask.size && bewerbTask[i].isNotBlank()) bewerbTask[i] else null + + bewerbe.add( + Bewerb( + nummer = bewerbNummern[i], + titel = titel, + klasse = klasse, + task = task ) - } + ) + log.info("Added competition for creation: ${bewerbNummern[i]}, $titel, $klasse, $task") } // Create the tournament @@ -126,19 +131,24 @@ fun Route.adminRoutes() { val bewerbKlasse = formParameters.getAll("bewerb-klasse[]") ?: 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 val bewerbe = mutableListOf() for (i in bewerbNummern.indices) { - if (i < bewerbTitel.size && i < bewerbKlasse.size && i < bewerbTask.size) { - bewerbe.add( - Bewerb( - nummer = bewerbNummern[i], - titel = bewerbTitel[i], - klasse = bewerbKlasse[i], - task = if (bewerbTask[i].isNotBlank()) bewerbTask[i] else null - ) + val titel = if (i < bewerbTitel.size) bewerbTitel[i] else "Unbenannter Bewerb" + val klasse = if (i < bewerbKlasse.size) bewerbKlasse[i] else "Keine Klasse" + val task = if (i < bewerbTask.size && bewerbTask[i].isNotBlank()) bewerbTask[i] else null + + bewerbe.add( + Bewerb( + nummer = bewerbNummern[i], + titel = titel, + klasse = klasse, + task = task ) - } + ) + log.info("Added competition for update: ${bewerbNummern[i]}, $titel, $klasse, $task") } // Update the tournament diff --git a/server/src/main/kotlin/at/mocode/routes/HomeRoutes.kt b/server/src/main/kotlin/at/mocode/routes/HomeRoutes.kt index 8a31dc97..e09c66b6 100644 --- a/server/src/main/kotlin/at/mocode/routes/HomeRoutes.kt +++ b/server/src/main/kotlin/at/mocode/routes/HomeRoutes.kt @@ -16,10 +16,7 @@ fun Route.homeRoutes() { get("/") { log.info("Handling request to home page") - // Insert dummy tournament if needed - turnierRepository.insertDummyTurnierIfEmpty() - - // Get all tournaments + // Get all tournaments from the database val turniere = turnierRepository.getAllTurniere() // Render the home page diff --git a/server/src/main/kotlin/at/mocode/views/LayoutTemplate.kt b/server/src/main/kotlin/at/mocode/views/LayoutTemplate.kt index 0451350a..eebfb1db 100644 --- a/server/src/main/kotlin/at/mocode/views/LayoutTemplate.kt +++ b/server/src/main/kotlin/at/mocode/views/LayoutTemplate.kt @@ -178,10 +178,10 @@ class LayoutTemplate { textarea, select { width: 100%; - padding: 1.2rem; - border: none; + padding: 0.8rem; + border: 1px solid var(--border-color); border-radius: 6px; - font-size: 2rem; + font-size: 1rem; transition: all 0.3s; margin-bottom: 1.2rem; box-shadow: 0 1px 3px rgba(0,0,0,0.05); @@ -220,7 +220,6 @@ class LayoutTemplate { letter-spacing: 0.5px; font-weight: 500; box-shadow: 0 2px 5px rgba(0,0,0,0.2); - width: 100%; text-align: center; } @@ -359,8 +358,7 @@ class LayoutTemplate { } .button, button { - width: 100%; - text-align: center; + display: block; margin-bottom: 0.5rem; } }