From dc29e2c6b1d0a612bfac92c4ad8533e5aa15691b Mon Sep 17 00:00:00 2001 From: francescods Date: Fri, 21 Feb 2025 17:37:59 +0100 Subject: [PATCH] /movimenti implementazione endpoint per il recupero dei movimenti legati ad una tessera --- src/main/kotlin/eu/maiora/db/Mapping.kt | 68 ++++++++++++++++++- src/main/kotlin/eu/maiora/model/Movimenti.kt | 22 ++++++ .../eu/maiora/model/MovimentiRepository.kt | 5 ++ .../maiora/model/MovimentiRepositoryImpl.kt | 15 ++++ src/main/kotlin/eu/maiora/plugins/Routing.kt | 3 + src/main/kotlin/eu/maiora/routes/Movimenti.kt | 36 ++++++++++ 6 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/eu/maiora/model/Movimenti.kt create mode 100644 src/main/kotlin/eu/maiora/model/MovimentiRepository.kt create mode 100644 src/main/kotlin/eu/maiora/model/MovimentiRepositoryImpl.kt create mode 100644 src/main/kotlin/eu/maiora/routes/Movimenti.kt diff --git a/src/main/kotlin/eu/maiora/db/Mapping.kt b/src/main/kotlin/eu/maiora/db/Mapping.kt index f882518..96a7f5d 100644 --- a/src/main/kotlin/eu/maiora/db/Mapping.kt +++ b/src/main/kotlin/eu/maiora/db/Mapping.kt @@ -1,16 +1,22 @@ package eu.maiora.db -import com.fasterxml.jackson.databind.deser.impl.CreatorCandidate.Param import eu.maiora.model.Accounts +import eu.maiora.model.Movimenti 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 +import org.jetbrains.exposed.dao.LongEntity +import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.IdTable import org.jetbrains.exposed.sql.Transaction +import org.jetbrains.exposed.sql.javatime.datetime import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import java.time.format.DateTimeFormatter + + object AccountsTable : IdTable("accounts"){ override val id = integer("id").entityId() @@ -39,6 +45,23 @@ object TessereTable : IdTable("view_tessere_api"){ override val primaryKey = PrimaryKey(id) } +object MovimentiTable : IdTable("view_movimenti_api"){ + override val id = long("id").entityId() + val idTessera = long("id_tessera") + val numero = varchar("numero_tessera", 255) + val operazione = varchar("operazione", 255) + val dataMovimento = datetime("data_movimento") + val transazione = varchar("transazione", 255) + val dispositivo = varchar("dispositivo", 255) + val riferimento= varchar("riferimento", 255) + val saldoPre = double("saldo_pre") + val importo = double("importo") + val saldoPost = double("saldo_post") + val puntiPre = integer("punti_pre") + val punti = integer("punti") + val puntiPost = integer("punti_post") +} + class AccountsDAO(id: EntityID) :IntEntity(id) { companion object : IntEntityClass(AccountsTable) @@ -63,6 +86,24 @@ class TessereDao(id: EntityID) :LongEntity(id) { var punti by TessereTable.punti } +class MovimentiDao(id: EntityID) :LongEntity(id) { + companion object : LongEntityClass(MovimentiTable) + + var idTessera by MovimentiTable.idTessera + var numero by MovimentiTable.numero + var operazione by MovimentiTable.operazione + var dataMovimento by MovimentiTable.dataMovimento + var transazione by MovimentiTable.transazione + var dispositivo by MovimentiTable.dispositivo + var riferimento by MovimentiTable.riferimento + var saldoPre by MovimentiTable.saldoPre + var importo by MovimentiTable.importo + var saldoPost by MovimentiTable.saldoPost + var puntiPre by MovimentiTable.puntiPre + var punti by MovimentiTable.punti + var puntiPost by MovimentiTable.puntiPost +} + fun accountsDaoToModel(dao: AccountsDAO) = Accounts( dao.id.value, @@ -85,6 +126,31 @@ fun tessereDaoToModel(dao: TessereDao) = Tessere( dao.punti ) +fun movimentiDaoToModel(dao: MovimentiDao) :Movimenti{ + val formatter = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm") + val formattedDate = dao.dataMovimento.format(formatter) + + return Movimenti( + dao.id.value, + dao.idTessera, + dao.numero, + dao.operazione, + formattedDate, + dao.transazione, + dao.dispositivo, + dao.riferimento, + dao.saldoPre, + dao.importo, + dao.saldoPost, + dao.puntiPre, + dao.punti, + dao.puntiPost + ) +} + + + + 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/Movimenti.kt b/src/main/kotlin/eu/maiora/model/Movimenti.kt new file mode 100644 index 0000000..5bcc050 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/Movimenti.kt @@ -0,0 +1,22 @@ +package eu.maiora.model + +import kotlinx.serialization.Serializable + + +@Serializable +data class Movimenti( + val id: Long, + val idTessera: Long, + val numero: String, + val operazione: String, + val dataMovimento: String, + val transazione: String, + val dispositivo: String, + val riferimento: String, + val saldoPre: Double, + val importo: Double, + val saldoPost: Double, + val puntiPre: Int, + val punti: Int, + val puntiPost: Int +) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/MovimentiRepository.kt b/src/main/kotlin/eu/maiora/model/MovimentiRepository.kt new file mode 100644 index 0000000..706231c --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/MovimentiRepository.kt @@ -0,0 +1,5 @@ +package eu.maiora.model + +interface MovimentiRepository { + suspend fun movimentiByIdTessera(idTessera : Long): List? +} \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/MovimentiRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/MovimentiRepositoryImpl.kt new file mode 100644 index 0000000..4e02e58 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/MovimentiRepositoryImpl.kt @@ -0,0 +1,15 @@ +package eu.maiora.model + +import eu.maiora.db.* +import org.jetbrains.exposed.sql.SortOrder + +class MovimentiRepositoryImpl : MovimentiRepository { + override suspend fun movimentiByIdTessera(idTessera : Long): List = suspendTransaction { + // Cerca la lista di movimenti + MovimentiDao.find { MovimentiTable.idTessera eq idTessera } + .orderBy(MovimentiTable.dataMovimento to SortOrder.DESC) + .toList() // Restituisce la lista dei movimenti + .map { movimentiDaoToModel(it) } // Converte il DAO in un oggetto Movimenti + + } +} \ 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 5430fb7..37967f5 100644 --- a/src/main/kotlin/eu/maiora/plugins/Routing.kt +++ b/src/main/kotlin/eu/maiora/plugins/Routing.kt @@ -5,9 +5,11 @@ package eu.maiora.plugins //import eu.maiora.routes.eseguiScriptSQLRoute //import eu.maiora.routes.logScriptRouting import eu.maiora.model.AccountsRepositoryImpl +import eu.maiora.model.MovimentiRepositoryImpl import eu.maiora.model.ParametriRepositoryImpl import eu.maiora.model.TessereRepositoryImpl import eu.maiora.routes.auth +import eu.maiora.routes.movimenti import eu.maiora.routes.tessere import io.ktor.server.application.* import io.ktor.server.response.* @@ -22,5 +24,6 @@ fun Application.configureRouting(dbUrl : String, username : String, password : S auth(AccountsRepositoryImpl()) tessere(TessereRepositoryImpl()) + movimenti(MovimentiRepositoryImpl()) } } diff --git a/src/main/kotlin/eu/maiora/routes/Movimenti.kt b/src/main/kotlin/eu/maiora/routes/Movimenti.kt new file mode 100644 index 0000000..0a6d75d --- /dev/null +++ b/src/main/kotlin/eu/maiora/routes/Movimenti.kt @@ -0,0 +1,36 @@ +package eu.maiora.routes + +import eu.maiora.model.MovimentiRepositoryImpl +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.movimenti(movimentiRepository: MovimentiRepositoryImpl){ + route("/api/movimenti"){ + authenticate("auth-jwt") { + get("{idTessera}"){ + // Ottieni l'id della tessera dal percorso + val idTessera = call.parameters["idTessera"] + + if (idTessera == null) { + call.respondText("ID tessera non valido", status = HttpStatusCode.BadRequest) + return@get + } + + // Cerca la tessera per codice fiscale + val listaMovimenti = movimentiRepository.movimentiByIdTessera(idTessera.toLong()) + + + if (listaMovimenti != null) { + call.respond(listaMovimenti) + } else { + call.respondText("Movimenti non trovati", status = HttpStatusCode.NotFound) + } + } + } + + } +} \ No newline at end of file