From e3fc1f73b73c024b8ea6ccf9d7a1baf1336a89ff Mon Sep 17 00:00:00 2001 From: francescods Date: Tue, 18 Feb 2025 09:22:59 +0100 Subject: [PATCH 1/3] prima implementazione mapping e repository --- src/main/kotlin/eu/maiora/db/Mapping.kt | 31 ++++++++++++ src/main/kotlin/eu/maiora/model/Tessere.kt | 13 +++++ .../eu/maiora/model/TessereRepository.kt | 5 ++ .../eu/maiora/model/TessereRepositoryImpl.kt | 13 +++++ src/main/kotlin/eu/maiora/routes/Tessere.kt | 48 +++++++++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 src/main/kotlin/eu/maiora/model/Tessere.kt create mode 100644 src/main/kotlin/eu/maiora/model/TessereRepository.kt create mode 100644 src/main/kotlin/eu/maiora/model/TessereRepositoryImpl.kt create mode 100644 src/main/kotlin/eu/maiora/routes/Tessere.kt diff --git a/src/main/kotlin/eu/maiora/db/Mapping.kt b/src/main/kotlin/eu/maiora/db/Mapping.kt index e4150a0..2a021fa 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("tessere"){ + override val id = integer("id").entityId() + val idUtente = integer("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) :IntEntity(id) { + companion object : IntEntityClass(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..50d34a5 --- /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: Int, + val idUtente : Int, + 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..25108b4 --- /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 Accounts + + } +} \ No newline at end of file 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..afccbb0 --- /dev/null +++ b/src/main/kotlin/eu/maiora/routes/Tessere.kt @@ -0,0 +1,48 @@ +package eu.maiora.routes + +import eu.maiora.model.ParametriRepositoryImpl +import eu.maiora.model.TessereRepositoryImpl +import io.jsonwebtoken.Jwts +import io.jsonwebtoken.SignatureAlgorithm +import io.jsonwebtoken.security.Keys +import io.ktor.client.statement.* +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.request.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import org.slf4j.LoggerFactory +import java.util.* + + +fun Route.tessere(tessereRepository: TessereRepositoryImpl, parametriRepository: ParametriRepositoryImpl){ + route("/tessere"){ + get("{cf}"){ + //verifica JWT + val parametro = parametriRepository.parametroByChiave("jwt_secret") + if(parametro != null){ + + } + + + // 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 From 8e417f02f26067de9d1de4fe0911da8cb6ad3fae Mon Sep 17 00:00:00 2001 From: francescods Date: Tue, 18 Feb 2025 16:02:41 +0100 Subject: [PATCH 2/3] /tessere MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit uso del metodo authenticate per la verifica della validità del JWT --- settings.gradle.kts | 2 +- src/main/kotlin/eu/maiora/db/Mapping.kt | 2 +- src/main/kotlin/eu/maiora/plugins/Routing.kt | 3 ++ src/main/kotlin/eu/maiora/routes/Tessere.kt | 51 ++++++++------------ 4 files changed, 24 insertions(+), 34 deletions(-) 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 2a021fa..3a60fcf 100644 --- a/src/main/kotlin/eu/maiora/db/Mapping.kt +++ b/src/main/kotlin/eu/maiora/db/Mapping.kt @@ -28,7 +28,7 @@ object ParametriTable : IdTable("parametri"){ override val primaryKey = PrimaryKey(id) } -object TessereTable : IdTable("tessere"){ +object TessereTable : IdTable("view_tessere_api"){ override val id = integer("id").entityId() val idUtente = integer("id_utente") val codiceFiscale = varchar("codice_fiscale", 255) 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 index afccbb0..328ee63 100644 --- a/src/main/kotlin/eu/maiora/routes/Tessere.kt +++ b/src/main/kotlin/eu/maiora/routes/Tessere.kt @@ -1,48 +1,35 @@ package eu.maiora.routes -import eu.maiora.model.ParametriRepositoryImpl import eu.maiora.model.TessereRepositoryImpl -import io.jsonwebtoken.Jwts -import io.jsonwebtoken.SignatureAlgorithm -import io.jsonwebtoken.security.Keys -import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.server.application.* -import io.ktor.server.request.* +import io.ktor.server.auth.* import io.ktor.server.response.* import io.ktor.server.routing.* -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.Json -import org.slf4j.LoggerFactory -import java.util.* -fun Route.tessere(tessereRepository: TessereRepositoryImpl, parametriRepository: ParametriRepositoryImpl){ - route("/tessere"){ - get("{cf}"){ - //verifica JWT - val parametro = parametriRepository.parametroByChiave("jwt_secret") - if(parametro != null){ +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) - // 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) + if (tessera != null) { + call.respond(tessera) + } else { + call.respondText("Tessera non trovata", status = HttpStatusCode.NotFound) + } } } + } } \ No newline at end of file From af2b7cea6dff411a70e72dba5052ed143ab798e3 Mon Sep 17 00:00:00 2001 From: francescods Date: Fri, 21 Feb 2025 17:32:39 +0100 Subject: [PATCH 3/3] modifica tipi ID da integer a long --- src/main/kotlin/eu/maiora/db/Mapping.kt | 10 +++++----- src/main/kotlin/eu/maiora/model/Tessere.kt | 4 ++-- .../kotlin/eu/maiora/model/TessereRepositoryImpl.kt | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/eu/maiora/db/Mapping.kt b/src/main/kotlin/eu/maiora/db/Mapping.kt index 3a60fcf..f882518 100644 --- a/src/main/kotlin/eu/maiora/db/Mapping.kt +++ b/src/main/kotlin/eu/maiora/db/Mapping.kt @@ -28,9 +28,9 @@ object ParametriTable : IdTable("parametri"){ override val primaryKey = PrimaryKey(id) } -object TessereTable : IdTable("view_tessere_api"){ - override val id = integer("id").entityId() - val idUtente = integer("id_utente") +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") @@ -53,8 +53,8 @@ class ParametriDAO(id: EntityID) :IntEntity(id) { var valore by ParametriTable.valore } -class TessereDao(id: EntityID) :IntEntity(id) { - companion object : IntEntityClass(TessereTable) +class TessereDao(id: EntityID) :LongEntity(id) { + companion object : LongEntityClass(TessereTable) var idUtente by TessereTable.idUtente var codiceFiscale by TessereTable.codiceFiscale diff --git a/src/main/kotlin/eu/maiora/model/Tessere.kt b/src/main/kotlin/eu/maiora/model/Tessere.kt index 50d34a5..47c9108 100644 --- a/src/main/kotlin/eu/maiora/model/Tessere.kt +++ b/src/main/kotlin/eu/maiora/model/Tessere.kt @@ -4,8 +4,8 @@ import kotlinx.serialization.Serializable @Serializable data class Tessere( - val id: Int, - val idUtente : Int, + val id: Long, + val idUtente : Long, val codiceFiscale : String, val numero : String, val saldo : Double, diff --git a/src/main/kotlin/eu/maiora/model/TessereRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/TessereRepositoryImpl.kt index 25108b4..93dce0c 100644 --- a/src/main/kotlin/eu/maiora/model/TessereRepositoryImpl.kt +++ b/src/main/kotlin/eu/maiora/model/TessereRepositoryImpl.kt @@ -7,7 +7,7 @@ class TessereRepositoryImpl : TessereRepository { // 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 Accounts + ?.let { tessereDaoToModel(it) } // Converte il DAO in un oggetto Tessere } } \ No newline at end of file