erste Version Online-Nennen

This commit is contained in:
stefan
2025-06-05 12:57:07 +02:00
parent 8fcc279679
commit ef59fa35b1
27 changed files with 3081 additions and 207 deletions
@@ -0,0 +1,80 @@
package at.mocode.repository
import at.mocode.config.DependencyInjection
import at.mocode.model.Nennung
import at.mocode.tables.NennungEventsTable
import at.mocode.tables.NennungenTable
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.transactions.transaction
import org.slf4j.LoggerFactory
/**
* Repository class for handling registration-related database operations.
*/
class NennungRepository {
private val log = LoggerFactory.getLogger(this::class.java)
private val turnierRepository by lazy { DependencyInjection.turnierRepository }
/**
* Saves a registration to the database.
* @param nennung The registration to save
* @return The ID of the saved registration
*/
fun saveNennung(nennung: Nennung): Int = transaction {
log.info("Saving registration for ${nennung.riderName} with ${nennung.horseName}")
// Insert the registration
val nennungId = NennungenTable.insert {
it[riderName] = nennung.riderName
it[horseName] = nennung.horseName
it[email] = nennung.email
it[phone] = nennung.phone
it[comments] = nennung.comments
it[turnierNumber] = nennung.turnier.number
} get NennungenTable.id
// Insert the selected events
nennung.selectedEvents.forEach { eventNumber ->
NennungEventsTable.insert {
it[NennungEventsTable.nennungId] = nennungId
it[NennungEventsTable.eventNumber] = eventNumber
}
}
log.info("Registration saved with ID: $nennungId")
nennungId
}
/**
* Creates a Nennung object from form parameters.
* @param riderName The name of the rider
* @param horseName The name of the horse
* @param email The email address for contact
* @param phone The phone number for contact
* @param selectedEvents The list of selected event numbers
* @param comments Additional comments or wishes
* @param turnierNumber The number of the tournament
* @return The created Nennung object, or null if the tournament was not found
*/
fun createNennung(
riderName: String,
horseName: String,
email: String,
phone: String,
selectedEvents: List<String>,
comments: String,
turnierNumber: Int
): Nennung? {
val turnier = turnierRepository.getTurnierByNumber(turnierNumber) ?: return null
return Nennung(
riderName = riderName,
horseName = horseName,
email = email,
phone = phone,
selectedEvents = selectedEvents,
comments = comments,
turnier = turnier
)
}
}
@@ -0,0 +1,246 @@
package at.mocode.repository
import at.mocode.model.Bewerb
import at.mocode.model.Turnier
import at.mocode.tables.BewerbeTable
import at.mocode.tables.TurniereTable
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction
import org.slf4j.LoggerFactory
/**
* Repository class for handling tournament-related database operations.
*/
class TurnierRepository {
private val log = LoggerFactory.getLogger(this::class.java)
/**
* Creates a new tournament with competitions.
* @param number The tournament number
* @param name The tournament name
* @param datum The tournament date
* @param bewerbe List of competitions for the tournament
* @return The created tournament or null if creation failed
*/
fun createTurnier(number: Int, name: String, datum: String, bewerbe: List<Bewerb>): Turnier? = transaction {
try {
// Check if a tournament with this number already exists
val existingTurnier = TurniereTable.select { TurniereTable.number eq number }.singleOrNull()
if (existingTurnier != null) {
log.error("Tournament with number $number already exists")
return@transaction null
}
// Insert tournament
TurniereTable.insert {
it[TurniereTable.number] = number
it[TurniereTable.name] = name
it[TurniereTable.datum] = datum
}
// Insert competitions
bewerbe.forEach { bewerb ->
BewerbeTable.insert {
it[BewerbeTable.nummer] = bewerb.nummer
it[BewerbeTable.titel] = bewerb.titel
it[BewerbeTable.klasse] = bewerb.klasse
it[BewerbeTable.task] = bewerb.task
it[BewerbeTable.turnierNumber] = number
}
}
// Return the created tournament
Turnier(
number = number,
name = name,
datum = datum,
bewerbe = bewerbe
)
} catch (e: Exception) {
log.error("Error creating tournament", e)
null
}
}
/**
* Updates an existing tournament with competitions.
* @param number The tournament number
* @param name The new tournament name
* @param datum The new tournament date
* @param bewerbe The new list of competitions
* @return The updated tournament or null if update failed
*/
fun updateTurnier(number: Int, name: String, datum: String, bewerbe: List<Bewerb>): Turnier? = transaction {
try {
// Check if the tournament exists
val existingTurnier = TurniereTable.select { TurniereTable.number eq number }.singleOrNull()
if (existingTurnier == null) {
log.error("Tournament with number $number not found")
return@transaction null
}
// Update tournament
TurniereTable.update({ TurniereTable.number eq number }) {
it[TurniereTable.name] = name
it[TurniereTable.datum] = datum
}
// Delete existing competitions
BewerbeTable.deleteWhere { BewerbeTable.turnierNumber eq number }
// Insert new competitions
bewerbe.forEach { bewerb ->
BewerbeTable.insert {
it[BewerbeTable.nummer] = bewerb.nummer
it[BewerbeTable.titel] = bewerb.titel
it[BewerbeTable.klasse] = bewerb.klasse
it[BewerbeTable.task] = bewerb.task
it[BewerbeTable.turnierNumber] = number
}
}
// Return the updated tournament
Turnier(
number = number,
name = name,
datum = datum,
bewerbe = bewerbe
)
} catch (e: Exception) {
log.error("Error updating tournament", e)
null
}
}
/**
* Retrieves all tournaments from the database with their associated competitions.
* @return List of Turnier objects
*/
fun getAllTurniere(): List<Turnier> = 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]
)
}
turnier.bewerbe = bewerbeList
}
turniere
}
/**
* 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...")
// 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"
}
// 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.")
}
}
/**
* Gets a tournament by its number.
* @param number The tournament number
* @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
val turnier = Turnier(
name = turnierRow[TurniereTable.name],
datum = turnierRow[TurniereTable.datum],
number = turnierRow[TurniereTable.number]
)
// 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]
)
}
turnier.bewerbe = bewerbeList
turnier
}
}