diff --git a/settings.gradle.kts b/settings.gradle.kts index e2d0939..5eceafc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" } -rootProject.name = "Backend_API" +rootProject.name = "Backend_API_DSU" diff --git a/src/main/kotlin/eu/maiora/db/Mapping.kt b/src/main/kotlin/eu/maiora/db/Mapping.kt index e4150a0..f882518 100644 --- a/src/main/kotlin/eu/maiora/db/Mapping.kt +++ b/src/main/kotlin/eu/maiora/db/Mapping.kt @@ -3,6 +3,7 @@ package eu.maiora.db import com.fasterxml.jackson.databind.deser.impl.CreatorCandidate.Param import eu.maiora.model.Accounts import eu.maiora.model.Parametri +import eu.maiora.model.Tessere import kotlinx.coroutines.Dispatchers import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass @@ -27,6 +28,17 @@ object ParametriTable : IdTable("parametri"){ override val primaryKey = PrimaryKey(id) } +object TessereTable : IdTable("view_tessere_api"){ + override val id = long("id").entityId() + val idUtente = long("id_utente") + val codiceFiscale = varchar("codice_fiscale", 255) + val numero = varchar("numero", 255) + val saldo = double("saldo") + val punti = integer("punti") + + override val primaryKey = PrimaryKey(id) +} + class AccountsDAO(id: EntityID) :IntEntity(id) { companion object : IntEntityClass(AccountsTable) @@ -41,6 +53,16 @@ class ParametriDAO(id: EntityID) :IntEntity(id) { var valore by ParametriTable.valore } +class TessereDao(id: EntityID) :LongEntity(id) { + companion object : LongEntityClass(TessereTable) + + var idUtente by TessereTable.idUtente + var codiceFiscale by TessereTable.codiceFiscale + var numero by TessereTable.numero + var saldo by TessereTable.saldo + var punti by TessereTable.punti +} + fun accountsDaoToModel(dao: AccountsDAO) = Accounts( dao.id.value, @@ -54,6 +76,15 @@ fun parametriDaoToModel(dao: ParametriDAO) = Parametri( dao.valore ) +fun tessereDaoToModel(dao: TessereDao) = Tessere( + dao.id.value, + dao.idUtente, + dao.codiceFiscale, + dao.numero, + dao.saldo, + dao.punti +) + suspend fun suspendTransaction(block: Transaction.() -> T): T = newSuspendedTransaction(Dispatchers.IO, statement = block) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/Tessere.kt b/src/main/kotlin/eu/maiora/model/Tessere.kt new file mode 100644 index 0000000..47c9108 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/Tessere.kt @@ -0,0 +1,13 @@ +package eu.maiora.model + +import kotlinx.serialization.Serializable + +@Serializable +data class Tessere( + val id: Long, + val idUtente : Long, + val codiceFiscale : String, + val numero : String, + val saldo : Double, + val punti : Int +) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/TessereRepository.kt b/src/main/kotlin/eu/maiora/model/TessereRepository.kt new file mode 100644 index 0000000..fd6df68 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/TessereRepository.kt @@ -0,0 +1,5 @@ +package eu.maiora.model + +interface TessereRepository { + suspend fun tesseraByCodiceFiscale(cf : String): Tessere? +} \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/TessereRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/TessereRepositoryImpl.kt new file mode 100644 index 0000000..93dce0c --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/TessereRepositoryImpl.kt @@ -0,0 +1,13 @@ +package eu.maiora.model + +import eu.maiora.db.* + +class TessereRepositoryImpl : TessereRepository { + override suspend fun tesseraByCodiceFiscale(cf: String): Tessere? = suspendTransaction { + // Cerca tessere in base al codice fiscale + TessereDao.find { TessereTable.codiceFiscale eq cf } + .singleOrNull() // Restituisce un singolo risultato o null se non trovato + ?.let { tessereDaoToModel(it) } // Converte il DAO in un oggetto Tessere + + } +} \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/plugins/Routing.kt b/src/main/kotlin/eu/maiora/plugins/Routing.kt index abfd7e4..5430fb7 100644 --- a/src/main/kotlin/eu/maiora/plugins/Routing.kt +++ b/src/main/kotlin/eu/maiora/plugins/Routing.kt @@ -6,7 +6,9 @@ package eu.maiora.plugins //import eu.maiora.routes.logScriptRouting import eu.maiora.model.AccountsRepositoryImpl import eu.maiora.model.ParametriRepositoryImpl +import eu.maiora.model.TessereRepositoryImpl import eu.maiora.routes.auth +import eu.maiora.routes.tessere import io.ktor.server.application.* import io.ktor.server.response.* import io.ktor.server.routing.* @@ -19,5 +21,6 @@ fun Application.configureRouting(dbUrl : String, username : String, password : S } auth(AccountsRepositoryImpl()) + tessere(TessereRepositoryImpl()) } } diff --git a/src/main/kotlin/eu/maiora/routes/Tessere.kt b/src/main/kotlin/eu/maiora/routes/Tessere.kt new file mode 100644 index 0000000..328ee63 --- /dev/null +++ b/src/main/kotlin/eu/maiora/routes/Tessere.kt @@ -0,0 +1,35 @@ +package eu.maiora.routes + +import eu.maiora.model.TessereRepositoryImpl +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.auth.* +import io.ktor.server.response.* +import io.ktor.server.routing.* + + +fun Route.tessere(tessereRepository: TessereRepositoryImpl){ + route("/api/tessere"){ + authenticate("auth-jwt") { + get("{cf}"){ + // Ottieni il codice fiscale dal percorso + val cf = call.parameters["cf"] + + if (cf == null) { + call.respondText("Codice fiscale non valido", status = HttpStatusCode.BadRequest) + return@get + } + + // Cerca la tessera per codice fiscale + val tessera = tessereRepository.tesseraByCodiceFiscale(cf) + + if (tessera != null) { + call.respond(tessera) + } else { + call.respondText("Tessera non trovata", status = HttpStatusCode.NotFound) + } + } + } + + } +} \ No newline at end of file