From 1b3d5aa322b44a9b83def29096b788ed607b2e1b Mon Sep 17 00:00:00 2001 From: francescods Date: Tue, 11 Nov 2025 16:23:08 +0100 Subject: [PATCH] creazione endpoint /articoli senza parametri recupera tutta la lista, con il parametro implicito recupera solo l'id selezionato --- src/main/kotlin/eu/maiora/db/Mapping.kt | 22 ++++++++++ .../eu/maiora/model/ViewEcommerceArticoli.kt | 10 +++++ .../model/ViewEcommerceArticoliRepository.kt | 6 +++ .../ViewEcommerceArticoliRepositoryImpl.kt | 22 ++++++++++ src/main/kotlin/eu/maiora/plugins/Routing.kt | 7 ++-- .../eu/maiora/routes/ViewEcommerceArticoli.kt | 42 +++++++++++++++++++ 6 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/eu/maiora/model/ViewEcommerceArticoli.kt create mode 100644 src/main/kotlin/eu/maiora/model/ViewEcommerceArticoliRepository.kt create mode 100644 src/main/kotlin/eu/maiora/model/ViewEcommerceArticoliRepositoryImpl.kt create mode 100644 src/main/kotlin/eu/maiora/routes/ViewEcommerceArticoli.kt diff --git a/src/main/kotlin/eu/maiora/db/Mapping.kt b/src/main/kotlin/eu/maiora/db/Mapping.kt index e4150a0..187aa12 100644 --- a/src/main/kotlin/eu/maiora/db/Mapping.kt +++ b/src/main/kotlin/eu/maiora/db/Mapping.kt @@ -3,9 +3,12 @@ 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.ViewEcommerceArticoli 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 @@ -27,6 +30,12 @@ object ParametriTable : IdTable("parametri"){ override val primaryKey = PrimaryKey(id) } +object ViewEcommerceArticoliTable : IdTable("view_ecommerce_articoli"){ + override val id = long("id").entityId() + val codice = varchar("codice", 20) + val descrizione = varchar("descrizione", 255) +} + class AccountsDAO(id: EntityID) :IntEntity(id) { companion object : IntEntityClass(AccountsTable) @@ -41,6 +50,13 @@ class ParametriDAO(id: EntityID) :IntEntity(id) { var valore by ParametriTable.valore } +class ViewEcommerceArticoliDAO(id:EntityID) : LongEntity(id){ + companion object : LongEntityClass(ViewEcommerceArticoliTable) + + var codice by ViewEcommerceArticoliTable.codice + var descrizione by ViewEcommerceArticoliTable.descrizione +} + fun accountsDaoToModel(dao: AccountsDAO) = Accounts( dao.id.value, @@ -54,6 +70,12 @@ fun parametriDaoToModel(dao: ParametriDAO) = Parametri( dao.valore ) +fun viewEcommerceArticoliDaoToModel(dao: ViewEcommerceArticoliDAO) = ViewEcommerceArticoli( + dao.id.value, + dao.codice, + dao.descrizione +) + 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/ViewEcommerceArticoli.kt b/src/main/kotlin/eu/maiora/model/ViewEcommerceArticoli.kt new file mode 100644 index 0000000..ef9985b --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/ViewEcommerceArticoli.kt @@ -0,0 +1,10 @@ +package eu.maiora.model + +import kotlinx.serialization.Serializable + +@Serializable +data class ViewEcommerceArticoli( + val id : Long, + val codice : String, + val descrizione : String +) \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/ViewEcommerceArticoliRepository.kt b/src/main/kotlin/eu/maiora/model/ViewEcommerceArticoliRepository.kt new file mode 100644 index 0000000..1fb545f --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/ViewEcommerceArticoliRepository.kt @@ -0,0 +1,6 @@ +package eu.maiora.model + +interface ViewEcommerceArticoliRepository { + suspend fun getListaArticoli(): List + suspend fun getArticoloById(idArticolo : Long): ViewEcommerceArticoli? +} \ No newline at end of file diff --git a/src/main/kotlin/eu/maiora/model/ViewEcommerceArticoliRepositoryImpl.kt b/src/main/kotlin/eu/maiora/model/ViewEcommerceArticoliRepositoryImpl.kt new file mode 100644 index 0000000..88eba89 --- /dev/null +++ b/src/main/kotlin/eu/maiora/model/ViewEcommerceArticoliRepositoryImpl.kt @@ -0,0 +1,22 @@ +package eu.maiora.model + +import eu.maiora.db.* +import eu.maiora.loadConfig +import org.jetbrains.exposed.sql.LongColumnType + +class ViewEcommerceArticoliRepositoryImpl : ViewEcommerceArticoliRepository { + override suspend fun getListaArticoli(): List = suspendTransaction { + // Cerca la lista di articoli + ViewEcommerceArticoliDAO.all() + .toList() + .map { viewEcommerceArticoliDaoToModel(it) } // Converte il DAO in un oggetto ViewEcommerceArticoli + + } + + override suspend fun getArticoloById(idArticolo : Long): ViewEcommerceArticoli? = suspendTransaction { + // Cerca un articolo dato il suo id + ViewEcommerceArticoliDAO.find{ ViewEcommerceArticoliTable.id eq idArticolo } + .singleOrNull() // Restituisce un singolo risultato o null se non trovato + ?.let { viewEcommerceArticoliDaoToModel(it) } // Converte il DAO in un oggetto ViewEcommerceArticoli + } +} \ 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 e5e6260..8ba827d 100644 --- a/src/main/kotlin/eu/maiora/plugins/Routing.kt +++ b/src/main/kotlin/eu/maiora/plugins/Routing.kt @@ -1,11 +1,9 @@ package eu.maiora.plugins -import eu.maiora.model.AccountsRepositoryImpl -import eu.maiora.model.ViewEcommercePrezSconDispRepositoryImpl -import eu.maiora.model.ViewEcommerceValoreUsatoRepository -import eu.maiora.model.ViewEcommerceValoreUsatoRepositoryImpl +import eu.maiora.model.* import eu.maiora.routes.auth import eu.maiora.routes.prezziScontiMagazzino +import eu.maiora.routes.viewEcommerceArticoli import io.ktor.server.application.* import io.ktor.server.response.* import io.ktor.server.routing.* @@ -18,5 +16,6 @@ fun Application.configureRouting() { auth(AccountsRepositoryImpl()) prezziScontiMagazzino(ViewEcommerceValoreUsatoRepositoryImpl(), ViewEcommercePrezSconDispRepositoryImpl()) + viewEcommerceArticoli(ViewEcommerceArticoliRepositoryImpl()) } } diff --git a/src/main/kotlin/eu/maiora/routes/ViewEcommerceArticoli.kt b/src/main/kotlin/eu/maiora/routes/ViewEcommerceArticoli.kt new file mode 100644 index 0000000..61528f8 --- /dev/null +++ b/src/main/kotlin/eu/maiora/routes/ViewEcommerceArticoli.kt @@ -0,0 +1,42 @@ +package eu.maiora.routes + +import eu.maiora.model.ViewEcommerceArticoliRepository +import eu.maiora.model.ViewEcommercePrezSconDisp +import eu.maiora.model.ViewEcommercePrezSconDispRepository +import eu.maiora.model.ViewEcommerceValoreUsatoRepository +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.viewEcommerceArticoli(viewEcommerceArticoliRepository: ViewEcommerceArticoliRepository){ + route("/api/articoli"){ + authenticate("auth-jwt") { + get("{id?}"){ + // Ottieni l'id articolo dal percorso + val idArticolo = call.parameters["id"] + + if(idArticolo != null){ + val id = idArticolo.toLongOrNull() + if(id == null) { + call.respondText("ID articolo non valido", status = HttpStatusCode.BadRequest) + return@get + } + //restituisco il singolo articolo se disponibile + val articolo = viewEcommerceArticoliRepository.getArticoloById(idArticolo.toLong()) + if(articolo == null){ + call.respondText("Articolo non esistente", status = HttpStatusCode.NotFound) + return@get + } + call.respond(articolo) + } + else { + //restituisco la lista articoli completa + val articoli = viewEcommerceArticoliRepository.getListaArticoli() + call.respond(articoli) + } + } + } + } +} \ No newline at end of file