3
0
forked from maiora/backend-api

Merge pull request '0002700-spostamento-endpoint-getArticoliEcommerce' (#2) from 0002700-spostamento-endpoint-getArticoliEcommerce into dev

Reviewed-on: #2
This commit is contained in:
Francesco Di Sciascio 2025-11-11 15:24:04 +00:00
commit efe1e33229
6 changed files with 105 additions and 4 deletions

View File

@ -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<Int>("parametri"){
override val primaryKey = PrimaryKey(id)
}
object ViewEcommerceArticoliTable : IdTable<Long>("view_ecommerce_articoli"){
override val id = long("id").entityId()
val codice = varchar("codice", 20)
val descrizione = varchar("descrizione", 255)
}
class AccountsDAO(id: EntityID<Int>) :IntEntity(id) {
companion object : IntEntityClass<AccountsDAO>(AccountsTable)
@ -41,6 +50,13 @@ class ParametriDAO(id: EntityID<Int>) :IntEntity(id) {
var valore by ParametriTable.valore
}
class ViewEcommerceArticoliDAO(id:EntityID<Long>) : LongEntity(id){
companion object : LongEntityClass<ViewEcommerceArticoliDAO>(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 <T> suspendTransaction(block: Transaction.() -> T): T =
newSuspendedTransaction(Dispatchers.IO, statement = block)

View File

@ -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
)

View File

@ -0,0 +1,6 @@
package eu.maiora.model
interface ViewEcommerceArticoliRepository {
suspend fun getListaArticoli(): List<ViewEcommerceArticoli>
suspend fun getArticoloById(idArticolo : Long): ViewEcommerceArticoli?
}

View File

@ -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<ViewEcommerceArticoli> = 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
}
}

View File

@ -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())
}
}

View File

@ -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)
}
}
}
}
}