From e3fc1f73b73c024b8ea6ccf9d7a1baf1336a89ff Mon Sep 17 00:00:00 2001 From: francescods Date: Tue, 18 Feb 2025 09:22:59 +0100 Subject: [PATCH 1/5] 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 b8ee25b7626d027b180b800865f7474ce5c95cc6 Mon Sep 17 00:00:00 2001 From: francescods Date: Tue, 18 Feb 2025 12:50:02 +0100 Subject: [PATCH 2/5] modifiche uso JWT utilizzo dipendenze come da documentazione Ktor per JWT recupero secret da file di configurazione (e non da database) --- build.gradle.kts | 5 +- src/main/kotlin/eu/maiora/Application.kt | 4 +- src/main/kotlin/eu/maiora/plugins/Routing.kt | 5 +- src/main/kotlin/eu/maiora/routes/Auth.kt | 115 ++++++++++--------- src/main/resources/application.conf | 7 +- 5 files changed, 70 insertions(+), 66 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 40fc23e..f2b1945 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,9 +35,8 @@ dependencies { implementation("org.jetbrains.exposed:exposed-dao:$exposed_version") implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1") implementation ("org.jetbrains.exposed:exposed-java-time:$exposed_version") - implementation("io.jsonwebtoken:jjwt-api:0.11.5") - implementation("io.jsonwebtoken:jjwt-impl:0.11.5") - implementation("io.jsonwebtoken:jjwt-jackson:0.11.5") + implementation("io.ktor:ktor-server-auth:$ktor_version") + implementation("io.ktor:ktor-server-auth-jwt:$ktor_version") testImplementation("io.ktor:ktor-server-test-host-jvm") testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version") } diff --git a/src/main/kotlin/eu/maiora/Application.kt b/src/main/kotlin/eu/maiora/Application.kt index a0c43f3..bfd7600 100644 --- a/src/main/kotlin/eu/maiora/Application.kt +++ b/src/main/kotlin/eu/maiora/Application.kt @@ -1,7 +1,6 @@ package eu.maiora import eu.maiora.plugins.configureDatabases -//import eu.maiora.model.LogScriptRepositoryImpl import eu.maiora.plugins.* import io.ktor.http.* import io.ktor.server.application.* @@ -21,11 +20,10 @@ fun Application.module() { val dbUrl = config.property("ktor.database.url").getString(); val username = config.property("ktor.database.username").getString(); val password = config.property("ktor.database.password").getString(); - //val repository = LogScriptRepositoryImpl() configureDatabases(dbUrl, username, password) - //configureRouting(dbUrl, username, password, repository) configureRouting(dbUrl, username, password) configureSerialization() + install(CallLogging) install(CORS){ anyHost() diff --git a/src/main/kotlin/eu/maiora/plugins/Routing.kt b/src/main/kotlin/eu/maiora/plugins/Routing.kt index 40887ee..abfd7e4 100644 --- a/src/main/kotlin/eu/maiora/plugins/Routing.kt +++ b/src/main/kotlin/eu/maiora/plugins/Routing.kt @@ -18,9 +18,6 @@ fun Application.configureRouting(dbUrl : String, username : String, password : S call.respondText("Hello World!") } - auth(AccountsRepositoryImpl(), ParametriRepositoryImpl()) - //analizzaURLRoute() - //eseguiScriptSQLRoute(dbUrl, username, password) - //logScriptRouting(repository) + auth(AccountsRepositoryImpl()) } } diff --git a/src/main/kotlin/eu/maiora/routes/Auth.kt b/src/main/kotlin/eu/maiora/routes/Auth.kt index 7b3274c..c6a2cbb 100644 --- a/src/main/kotlin/eu/maiora/routes/Auth.kt +++ b/src/main/kotlin/eu/maiora/routes/Auth.kt @@ -1,13 +1,11 @@ package eu.maiora.routes -import com.fasterxml.jackson.databind.ser.Serializers.Base +import com.auth0.jwt.JWT +import com.auth0.jwt.algorithms.Algorithm import eu.maiora.model.AccountsRepositoryImpl -import eu.maiora.model.ParametriRepositoryImpl -import io.jsonwebtoken.Jwts -import io.jsonwebtoken.SignatureAlgorithm -import io.jsonwebtoken.security.Keys import io.ktor.http.* import io.ktor.server.application.* +import io.ktor.server.config.* import io.ktor.server.request.* import io.ktor.server.response.* import io.ktor.server.routing.* @@ -17,70 +15,77 @@ import org.slf4j.LoggerFactory import java.util.* -fun Route.auth(accountsRepository: AccountsRepositoryImpl, parametriRepository: ParametriRepositoryImpl){ - - post("/auth"){ - // Riceve il body della richiesta e lo deserializza in ReceivedResponse - val receivedResponse = try { - call.receive() - } catch (e: Exception) { - return@post call.respondText("Body mancante " + e.stackTraceToString(), status = HttpStatusCode.BadRequest) - } - val logger = LoggerFactory.getLogger("AuthRoute") - logger.info("param: " + - receivedResponse.param); - - // Decodifica la stringa da Base64 a oggetto Credentials - val decodedBytes = Base64.getDecoder().decode(receivedResponse.param) - val decodedString = String(decodedBytes) - val credentials = Json.decodeFromString(decodedString) - - - - - //verifica credenziali (recupero account dal database) - val account = accountsRepository.accountByUsername(credentials.username) - //se le credenziali sono valide, creare il JWT - if (account != null) { - val passwordPlain = String( - Base64.getDecoder().decode( - StringBuffer( - String( - Base64.getDecoder().decode(account.password.toByteArray()) - ) - ).reverse().toString().toByteArray() +fun Route.auth(accountsRepository: AccountsRepositoryImpl) { + route("/auth") { + post() { + // Riceve il body della richiesta e lo deserializza in ReceivedResponse + val receivedResponse = try { + call.receive() + } catch (e: Exception) { + return@post call.respondText( + "Body mancante " + e.stackTraceToString(), + status = HttpStatusCode.BadRequest ) - ) - if(passwordPlain.equals(credentials.password)){ - val parametro = parametriRepository.parametroByChiave("jwt_secret") - if (parametro != null) { + } + val logger = LoggerFactory.getLogger("AuthRoute") + logger.info( + "param: " + + receivedResponse.param + ); + + // Decodifica la stringa da Base64 a oggetto Credentials + val decodedBytes = Base64.getDecoder().decode(receivedResponse.param) + val decodedString = String(decodedBytes) + val credentials = try { + Json.decodeFromString(decodedString) + } catch (e: Exception) { + return@post call.respondText( + "Errore nel param. Verificare la codifica. \n" + e.stackTraceToString(), + status = HttpStatusCode.BadRequest + ) + } + + //verifica credenziali (recupero account dal database) + val account = accountsRepository.accountByUsername(credentials.username) + //se le credenziali sono valide, creare il JWT + if (account != null) { + val passwordPlain = String( + Base64.getDecoder().decode( + StringBuffer( + String( + Base64.getDecoder().decode(account.password.toByteArray()) + ) + ).reverse().toString().toByteArray() + ) + ) + if (passwordPlain.equals(credentials.password)) { + val config = ApplicationConfig("application.conf") + val secret = config.property("ktor.jwt.secret").getString() - val key = Keys.hmacShaKeyFor(parametro.valore.toByteArray()) val now = System.currentTimeMillis() val expiration = now + 86400000 // Scadenza tra 1 giorno (24 ore) - val token = Jwts.builder() - .setSubject(account.username) // Soggetto del JWT - .setIssuedAt(Date(now)) // Data di emissione - .setExpiration(Date(expiration)) // Data di scadenza - .signWith(key, SignatureAlgorithm.HS256) // Firma con una chiave segreta - .compact() + val token = JWT.create() + .withSubject(account.username) + .withIssuedAt(Date(now)) + .withExpiresAt(Date(expiration)) + .sign(Algorithm.HMAC256(secret)) // Risponde con la stringa decodificata call.respond(HttpStatusCode.OK, token) - } - } - else { + } else { + call.respond(HttpStatusCode.Unauthorized) + } + } else { call.respond(HttpStatusCode.Unauthorized) } - } - else { - call.respond(HttpStatusCode.Unauthorized) - } + } } + + } @Serializable diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 0aecf29..2037c99 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -13,4 +13,9 @@ ktor { ;username = "EP_DONORIONE" ;password = "ep_donorione" } -} \ No newline at end of file + jwt { + # secret per JWT generato partendo dalla stringa '?Backend_API*06022025!' codificato in Base64 + secret = "P0JhY2tlbmRfQVBJKjA2MDIyMDI1IQ==" + } +} + From 8e417f02f26067de9d1de4fe0911da8cb6ad3fae Mon Sep 17 00:00:00 2001 From: francescods Date: Tue, 18 Feb 2025 16:02:41 +0100 Subject: [PATCH 3/5] /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 cd597a52c2ad61ec358f196a7eea8d7b56d53e96 Mon Sep 17 00:00:00 2001 From: francescods Date: Tue, 18 Feb 2025 16:06:15 +0100 Subject: [PATCH 4/5] implementazione metodo di verifica JWT secret in file di configurazione application.config --- src/main/kotlin/eu/maiora/Application.kt | 8 +++-- src/main/kotlin/eu/maiora/plugins/Security.kt | 35 +++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/eu/maiora/plugins/Security.kt diff --git a/src/main/kotlin/eu/maiora/Application.kt b/src/main/kotlin/eu/maiora/Application.kt index bfd7600..d82eece 100644 --- a/src/main/kotlin/eu/maiora/Application.kt +++ b/src/main/kotlin/eu/maiora/Application.kt @@ -17,10 +17,12 @@ fun main() { fun Application.module() { val config = ApplicationConfig("application.conf") - val dbUrl = config.property("ktor.database.url").getString(); - val username = config.property("ktor.database.username").getString(); - val password = config.property("ktor.database.password").getString(); + val dbUrl = config.property("ktor.database.url").getString() + val username = config.property("ktor.database.username").getString() + val password = config.property("ktor.database.password").getString() + val secret = config.property("ktor.jwt.secret").getString() configureDatabases(dbUrl, username, password) + configureSecurity(secret) configureRouting(dbUrl, username, password) configureSerialization() diff --git a/src/main/kotlin/eu/maiora/plugins/Security.kt b/src/main/kotlin/eu/maiora/plugins/Security.kt new file mode 100644 index 0000000..3facb4e --- /dev/null +++ b/src/main/kotlin/eu/maiora/plugins/Security.kt @@ -0,0 +1,35 @@ +package eu.maiora.plugins + +import com.auth0.jwt.JWT +import com.auth0.jwt.algorithms.Algorithm +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.auth.* +import io.ktor.server.auth.jwt.* +import io.ktor.server.response.* + +fun Application.configureSecurity(secret: String) { + install(Authentication) { + jwt ("auth-jwt"){ + verifier( + JWT + .require(Algorithm.HMAC256(secret)) + .build()) + validate { credential -> + val expiresAt = credential.payload.expiresAt?.time ?: 0 + val now = System.currentTimeMillis() + + // Verifica se il token ? scaduto + if (expiresAt >= now) { + JWTPrincipal(credential.payload) + } + else { + null + } + } + challenge { defaultScheme, realm -> + call.respond(HttpStatusCode.Unauthorized, "Token non valido o scaduto") + } + } + } +} \ 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 5/5] 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