/* * This file is a part of the SteamWar software. * * Copyright (C) 2026 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package de.steamwar.routes.v2 import de.steamwar.routes.ResponseEvent import de.steamwar.routes.ResponseTeam import de.steamwar.routes.ResponseUser import de.steamwar.sql.SteamwarUser import de.steamwar.sql.Team import de.steamwar.sql.TeamTable import de.steamwar.sql.TeamTeilnahme import de.steamwar.sql.internal.useDb import io.ktor.http.HttpStatusCode import io.ktor.server.application.call import io.ktor.server.response.respond import io.ktor.server.routing.Route import io.ktor.server.routing.get import io.ktor.server.routing.route import kotlinx.serialization.Serializable import org.jetbrains.exposed.v1.core.like import org.jetbrains.exposed.v1.jdbc.Query import org.jetbrains.exposed.v1.jdbc.andWhere import org.jetbrains.exposed.v1.jdbc.selectAll fun Query.addTeamFilter(teamName: String?, teamKuerzel: String?): Query { teamName?.let { andWhere { TeamTable.name like "%$it%" } } teamKuerzel?.let { andWhere { TeamTable.kuerzel like "%$it%" } } return this } fun Route.configureTeamRoutes() { route("/teams") { get { val teamName = call.request.queryParameters["name"] val teamKuerzel = call.request.queryParameters["kuerzel"] val limit = call.request.queryParameters["limit"]?.toIntOrNull() ?: 100 val page = call.request.queryParameters["page"]?.toIntOrNull() ?: 0 call.respond(useDb { TeamTable.selectAll().addTeamFilter(teamName, teamKuerzel).limit(limit).offset((page * limit).toLong()) .map { ResponseTeam(it) } }) } get("/{team}") { @Serializable data class TeamResponse( val team: ResponseTeam, val members: List, val leaders: List, val events: List ) val team = call.parameters["team"]?.toIntOrNull()?.let { Team.byId(it) } if (team == null) { call.respond(HttpStatusCode.NotFound) return@get } call.respond(useDb { TeamResponse( ResponseTeam(team), team.membersUser.map { ResponseUser(it) }, team.membersUser.filter { it.leader }.map { ResponseUser(it) }, TeamTeilnahme.getEvents(team.teamId).map { ResponseEvent(it) }) }) } } }