3
0
forked from maiora/backend-api

Compare commits

..

2 Commits

Author SHA1 Message Date
efe1e33229 Merge pull request '0002700-spostamento-endpoint-getArticoliEcommerce' (#2) from 0002700-spostamento-endpoint-getArticoliEcommerce into dev
Reviewed-on: #2
2025-11-11 15:24:04 +00:00
1b3d5aa322 creazione endpoint /articoli
senza parametri recupera tutta la lista, con il parametro implicito recupera solo l'id selezionato
2025-11-11 16:23:08 +01:00
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 com.fasterxml.jackson.databind.deser.impl.CreatorCandidate.Param
import eu.maiora.model.Accounts import eu.maiora.model.Accounts
import eu.maiora.model.Parametri import eu.maiora.model.Parametri
import eu.maiora.model.ViewEcommerceArticoli
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntity
import org.jetbrains.exposed.dao.IntEntityClass 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.EntityID
import org.jetbrains.exposed.dao.id.IdTable import org.jetbrains.exposed.dao.id.IdTable
import org.jetbrains.exposed.sql.Transaction import org.jetbrains.exposed.sql.Transaction
@ -27,6 +30,12 @@ object ParametriTable : IdTable<Int>("parametri"){
override val primaryKey = PrimaryKey(id) 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) { class AccountsDAO(id: EntityID<Int>) :IntEntity(id) {
companion object : IntEntityClass<AccountsDAO>(AccountsTable) companion object : IntEntityClass<AccountsDAO>(AccountsTable)
@ -41,6 +50,13 @@ class ParametriDAO(id: EntityID<Int>) :IntEntity(id) {
var valore by ParametriTable.valore 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( fun accountsDaoToModel(dao: AccountsDAO) = Accounts(
dao.id.value, dao.id.value,
@ -54,6 +70,12 @@ fun parametriDaoToModel(dao: ParametriDAO) = Parametri(
dao.valore dao.valore
) )
fun viewEcommerceArticoliDaoToModel(dao: ViewEcommerceArticoliDAO) = ViewEcommerceArticoli(
dao.id.value,
dao.codice,
dao.descrizione
)
suspend fun <T> suspendTransaction(block: Transaction.() -> T): T = suspend fun <T> suspendTransaction(block: Transaction.() -> T): T =
newSuspendedTransaction(Dispatchers.IO, statement = block) 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 package eu.maiora.plugins
import eu.maiora.model.AccountsRepositoryImpl import eu.maiora.model.*
import eu.maiora.model.ViewEcommercePrezSconDispRepositoryImpl
import eu.maiora.model.ViewEcommerceValoreUsatoRepository
import eu.maiora.model.ViewEcommerceValoreUsatoRepositoryImpl
import eu.maiora.routes.auth import eu.maiora.routes.auth
import eu.maiora.routes.prezziScontiMagazzino import eu.maiora.routes.prezziScontiMagazzino
import eu.maiora.routes.viewEcommerceArticoli
import io.ktor.server.application.* import io.ktor.server.application.*
import io.ktor.server.response.* import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
@ -18,5 +16,6 @@ fun Application.configureRouting() {
auth(AccountsRepositoryImpl()) auth(AccountsRepositoryImpl())
prezziScontiMagazzino(ViewEcommerceValoreUsatoRepositoryImpl(), ViewEcommercePrezSconDispRepositoryImpl()) 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)
}
}
}
}
}