Compare commits

..

29 Commits

Author SHA1 Message Date
213d7fdd74 GET prodotti prenotabili 2025-04-14 17:03:57 +02:00
3995d993e5 Merge pull request '0002438-endpoint-puntiDistribuzione' (#10) from 0002438-endpoint-puntiDistribuzione into dev
Reviewed-on: maiora/backend-api-DSU#10
2025-04-14 09:58:43 +00:00
eae52617a3 modifica controlli sui parametri 2025-04-14 11:57:30 +02:00
837914f913 Merge pull request '0002439-endpoint-slotOrari' (#9) from 0002439-endpoint-slotOrari into dev
Reviewed-on: maiora/backend-api-DSU#9
2025-04-14 09:51:03 +00:00
10d2fefa24 GET recupero slot orari 2025-04-14 11:47:55 +02:00
1adb9c5f0e Merge pull request '0002438-endpoint-puntiDistribuzione' (#8) from 0002438-endpoint-puntiDistribuzione into dev
Reviewed-on: maiora/backend-api-DSU#8
2025-04-11 14:29:17 +00:00
5c169dcfdd GET recupero punti distribuzione 2025-04-11 16:28:18 +02:00
3e0ae28708 Merge pull request '0002357-endpoint-ricariche' (#7) from 0002357-endpoint-ricariche into dev
Reviewed-on: maiora/backend-api-DSU#7
2025-04-10 07:50:08 +00:00
529087dd98 POST creazione ricarica
ID gestito dalla sequenza
2025-04-10 09:46:14 +02:00
025f45b972 Merge pull request '0002393-endpoint-valorePasti' (#6) from 0002393-endpoint-valorePasti into dev
Reviewed-on: maiora/backend-api-DSU#6
2025-04-01 07:14:02 +00:00
8b4c9138ac miglioramento caso valori non trovati
risposta con Not Found
2025-04-01 09:13:08 +02:00
e0e93f93d0 Merge pull request '0002358-endpoint-composizioni' (#5) from 0002358-endpoint-composizioni into dev
Reviewed-on: maiora/backend-api-DSU#5
2025-04-01 06:55:19 +00:00
a633d1aac6 Merge branch '0002358-endpoint-composizioni' of https://git-repo.eu/maiora/backend-api-DSU into 0002358-endpoint-composizioni
# Conflicts:
#	src/main/kotlin/eu/maiora/plugins/Routing.kt
2025-04-01 08:53:27 +02:00
3585ec9ad6 implementazione endpoint composizioni
recupero senza filtri, viene restituita la lista di tutte le composizioni dei vassoi
2025-04-01 08:52:41 +02:00
5ae17aa8a8 Merge remote-tracking branch 'upstream/dev' into dev 2025-04-01 08:48:19 +02:00
dfa518383a Merge pull request '0002393-endpoint-valorePasti' (#3) from 0002393-endpoint-valorePasti into dev
Reviewed-on: maiora/backend-api-DSU#3
2025-04-01 06:47:44 +00:00
3f8ecb0370 recupero prezzo e punti
dati una tessera, un vassoio e una data
2025-04-01 08:45:33 +02:00
71443ff6f3 implementazione endpoint composizioni
recupero senza filtri, viene restituita la lista di tutte le composizioni dei vassoi
2025-03-26 10:10:02 +01:00
57597c3d94 Merge remote-tracking branch 'upstream/dev' into dev
# Conflicts:
#	src/main/kotlin/eu/maiora/plugins/Routing.kt
2025-03-24 11:47:52 +01:00
28a9ec86af Merge remote-tracking branch 'upstream/dev' into dev 2025-03-05 11:59:38 +01:00
ea4edcdcee Merge remote-tracking branch 'upstream/dev' into dev 2025-03-05 09:52:55 +01:00
311d1fbd3b Merge pull request '0002350-endpoint-movimenti' (#2) from 0002350-endpoint-movimenti into dev
Reviewed-on: maiora/backend-api-DSU#2
2025-03-05 08:50:08 +00:00
dc29e2c6b1 /movimenti
implementazione endpoint per il recupero dei movimenti legati ad una tessera
2025-02-21 17:37:59 +01:00
e0d64f91d1 Merge pull request '0002343-endpoint-tessere' (#1) from 0002343-endpoint-tessere into dev
Reviewed-on: maiora/backend-api-DSU#1
2025-02-21 16:36:09 +00:00
af2b7cea6d modifica tipi ID
da integer a long
2025-02-21 17:32:39 +01:00
488cab4ac7 Merge remote-tracking branch 'upstream/dev' into 0002343-endpoint-tessere 2025-02-18 16:07:53 +01:00
8e417f02f2 /tessere
uso del metodo authenticate per la verifica della validità del JWT
2025-02-18 16:02:41 +01:00
728eca6dd6 Merge remote-tracking branch 'upstream/dev' into 0002343-endpoint-tessere 2025-02-18 12:55:00 +01:00
e3fc1f73b7 prima implementazione
mapping e repository
2025-02-18 09:22:59 +01:00
36 changed files with 962 additions and 7 deletions

View File

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

View File

@ -47,7 +47,7 @@ fun Application.module(configFile: Properties) {
fun loadConfig(): Properties {
val properties = Properties()
val inputStream = FileInputStream("/home/backend_api/config.properties")
val inputStream = FileInputStream("/home/ristocloudadm/config.properties")
properties.load(inputStream)
return properties
}

View File

@ -1,15 +1,20 @@
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.*
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.date
import org.jetbrains.exposed.sql.javatime.datetime
import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction
import java.time.format.DateTimeFormatter
object AccountsTable : IdTable<Int>("accounts"){
override val id = integer("id").entityId()
@ -27,6 +32,85 @@ object ParametriTable : IdTable<Int>("parametri"){
override val primaryKey = PrimaryKey(id)
}
object TessereTable : IdTable<Long>("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")
val punti = integer("punti")
override val primaryKey = PrimaryKey(id)
}
object MovimentiTable : IdTable<Long>("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")
}
object ComposizioniTable : IdTable<Long>("view_composizioni"){
override val id = long("id").entityId()
val idVassoio = long("id_vassoio")
val vassoio = varchar("vassoio", 255)
val idCategoria = long("id_categoria")
val categoria = varchar("categoria", 255)
val quantita = integer("quantita")
}
object RicaricheTable : IdTable<Long>("ricariche_app"){
override val id = long("id").autoIncrement("seq_ricariche_app").entityId()
val codiceTransazione = varchar("codice_transazione", 255)
val messaggio = varchar("messaggio", 255).nullable()
val idTessera = long("id_tessera")
val importo = double("importo")
}
object SlotPrenotabiliTable : IdTable<Long>("view_slot_prenotabili"){
override val id = long("id").entityId()
val giorno = date("giorno")
val dataInizio = datetime("data_inizio")
val dataFine = datetime("data_fine")
val idModalita = long("id_modalita")
val modalitaPrenotazione = varchar("modalita_prenotazione", 255)
val idPuntoDistribuzione = long("id_punto_distribuzione")
val puntoDistribuzione = varchar("punto_distribuzione", 255)
val idPuntoCassa = long("id_punto_cassa")
val puntoCassa = varchar("punto_cassa", 255)
val idTurno = long("id_turno")
val turno = varchar("turno", 255)
val idResidenza = long("id_residenza").nullable()
val residenza = varchar("residenza", 255).nullable()
}
object ProdottiPrenotabiliTable : IdTable<Long>("view_prodotti_prenotabili"){
override val id = long("id").entityId()
val giorno = date("giorno")
val idPuntoDistribuzione = long("id_punto_distribuzione")
val puntoDistribuzione = varchar("punto_distribuzione", 255)
val idTurno = long("id_turno")
val turno = varchar("turno", 255)
val idProdotto = long("id_prodotto")
val prodotto = varchar("prodotto", 255)
val codiceProdotto = varchar("codice_prodotto", 255)
val descrizioneProdotto = varchar("descrizione_prodotto", 255)
val idCategoria = long("id_categoria")
val categoria = varchar("categoria", 255)
val idModalita = long("id_modalita")
val modalitaPrenotazione = varchar("modalita_prenotazione", 255)
}
class AccountsDAO(id: EntityID<Int>) :IntEntity(id) {
companion object : IntEntityClass<AccountsDAO>(AccountsTable)
@ -41,6 +125,88 @@ class ParametriDAO(id: EntityID<Int>) :IntEntity(id) {
var valore by ParametriTable.valore
}
class TessereDao(id: EntityID<Long>) :LongEntity(id) {
companion object : LongEntityClass<TessereDao>(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
}
class MovimentiDao(id: EntityID<Long>) :LongEntity(id) {
companion object : LongEntityClass<MovimentiDao>(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
}
class ComposizioniDao(id: EntityID<Long>) :LongEntity(id){
companion object : LongEntityClass<ComposizioniDao>(ComposizioniTable)
var idVassoio by ComposizioniTable.idVassoio
var vassoio by ComposizioniTable.vassoio
var idCategoria by ComposizioniTable.idCategoria
var categoria by ComposizioniTable.categoria
var quantita by ComposizioniTable.quantita
}
class RicaricheDao(id: EntityID<Long>) :LongEntity(id){
companion object : LongEntityClass<RicaricheDao>(RicaricheTable)
var codiceTransazione by RicaricheTable.codiceTransazione
var messaggio by RicaricheTable.messaggio
var idTessera by RicaricheTable.idTessera
var importo by RicaricheTable.importo
}
class SlotPrenotabiliDao(id: EntityID<Long>) :LongEntity(id) {
companion object : LongEntityClass<SlotPrenotabiliDao>(SlotPrenotabiliTable)
var giorno by SlotPrenotabiliTable.giorno
var dataInizio by SlotPrenotabiliTable.dataInizio
var dataFine by SlotPrenotabiliTable.dataFine
var idModalita by SlotPrenotabiliTable.idModalita
var modalitaPrenotazione by SlotPrenotabiliTable.modalitaPrenotazione
var idPuntoDistribuzione by SlotPrenotabiliTable.idPuntoDistribuzione
var puntoDistribuzione by SlotPrenotabiliTable.puntoDistribuzione
var idPuntoCassa by SlotPrenotabiliTable.idPuntoCassa
var puntoCassa by SlotPrenotabiliTable.puntoCassa
var idTurno by SlotPrenotabiliTable.idTurno
var turno by SlotPrenotabiliTable.turno
var idResidenza by SlotPrenotabiliTable.idResidenza
var residenza by SlotPrenotabiliTable.residenza
}
class ProdottiPrenotabiliDao(id: EntityID<Long>) :LongEntity(id) {
companion object : LongEntityClass<ProdottiPrenotabiliDao>(ProdottiPrenotabiliTable)
var giorno by ProdottiPrenotabiliTable.giorno
var idPuntoDistribuzione by ProdottiPrenotabiliTable.idPuntoDistribuzione
var puntoDistribuzione by ProdottiPrenotabiliTable.puntoDistribuzione
var idTurno by ProdottiPrenotabiliTable.idTurno
var turno by ProdottiPrenotabiliTable.turno
var idProdotto by ProdottiPrenotabiliTable.idProdotto
var prodotto by ProdottiPrenotabiliTable.prodotto
var codiceProdotto by ProdottiPrenotabiliTable.codiceProdotto
var descrizioneProdotto by ProdottiPrenotabiliTable.descrizioneProdotto
var idCategoria by ProdottiPrenotabiliTable.idCategoria
var categoria by ProdottiPrenotabiliTable.categoria
var idModalita by ProdottiPrenotabiliTable.idModalita
var modalitaPrenotazione by ProdottiPrenotabiliTable.modalitaPrenotazione
}
fun accountsDaoToModel(dao: AccountsDAO) = Accounts(
dao.id.value,
@ -54,6 +220,105 @@ 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
)
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
)
}
fun composizioniDaoToModel(dao: ComposizioniDao) = Composizioni(
dao.id.value,
dao.idVassoio,
dao.vassoio,
dao.idCategoria,
dao.categoria,
dao.quantita
)
fun puntiDistribuzioneDaoToModel(dao: SlotPrenotabiliDao) :PuntiDistribuzione{
return PuntiDistribuzione(
dao.id.value,
dao.idPuntoDistribuzione,
dao.puntoDistribuzione,
dao.idPuntoCassa,
dao.puntoCassa,
dao.idModalita,
dao.modalitaPrenotazione
)
}
fun slotOrariDaoToModel(dao: SlotPrenotabiliDao) :SlotOrari{
val formatterGiorno = DateTimeFormatter.ofPattern("ddMMyyyy")
val formatterConOra = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
val formattedGiorno = dao.giorno.format(formatterGiorno)
val formattedDataInizio = dao.dataInizio.format(formatterConOra)
val formattedDataFine = dao.dataFine.format(formatterConOra)
return SlotOrari(
dao.id.value,
formattedGiorno,
formattedDataInizio,
formattedDataFine,
dao.idPuntoDistribuzione,
dao.puntoDistribuzione,
dao.idPuntoCassa,
dao.puntoCassa,
dao.idModalita,
dao.modalitaPrenotazione,
dao.idTurno,
dao.turno,
dao.idResidenza,
dao.residenza
)
}
fun prodottiPrenotabiliDaoToModel(dao: ProdottiPrenotabiliDao) :ProdottiPrenotabili{
val formatterGiorno = DateTimeFormatter.ofPattern("ddMMyyyy")
val formattedGiorno = dao.giorno.format(formatterGiorno)
return ProdottiPrenotabili(
dao.id.value,
formattedGiorno,
dao.idPuntoDistribuzione,
dao.puntoDistribuzione,
dao.idTurno,
dao.turno,
dao.idProdotto,
dao.prodotto,
dao.codiceProdotto,
dao.descrizioneProdotto,
dao.idCategoria,
dao.categoria,
dao.idModalita,
dao.modalitaPrenotazione
)
}
suspend fun <T> suspendTransaction(block: Transaction.() -> T): T =
newSuspendedTransaction(Dispatchers.IO, statement = block)

View File

@ -0,0 +1,13 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
@Serializable
data class Composizioni(
val id: Long,
val idVassoio : Long,
val vassoio : String,
val idCategoria : Long,
val categoria : String,
val quantita : Int
)

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface ComposizioniRepository {
suspend fun listaComposizioni(): List<Composizioni>
}

View File

@ -0,0 +1,14 @@
package eu.maiora.model
import eu.maiora.db.*
import org.jetbrains.exposed.sql.SortOrder
class ComposizioniRepositoryImpl : ComposizioniRepository {
override suspend fun listaComposizioni(): List<Composizioni> = suspendTransaction {
// Cerca la lista di composizioni
ComposizioniDao.all()
.toList()
.map { composizioniDaoToModel(it) } // Converte il DAO in un oggetto Composizioni
}
}

View File

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

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface MovimentiRepository {
suspend fun movimentiByIdTessera(idTessera : Long): List<Movimenti>?
}

View File

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

View File

@ -0,0 +1,21 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
@Serializable
data class ProdottiPrenotabili(
val id: Long,
val giorno : String,
val idPuntoDistribuzione : Long,
val puntoDistribuzione : String,
val idTurno : Long,
val turno : String,
val idProdotto : Long,
val prodotto : String,
val codiceProdotto : String,
val descrizioneProdotto : String,
val idCategoria : Long,
val categoria : String,
val idModalita : Long,
val modalitaPrenotazione : String
)

View File

@ -0,0 +1,8 @@
package eu.maiora.model
interface ProdottiPrenotabiliRepository {
suspend fun prodottiPrenotabiliByGiornoIdTurnoIdPuntoDistIdMod(giorno : String,
idTurno : Long,
idPuntoDistribuzione : Long,
idModalita : Long): List<ProdottiPrenotabili>?
}

View File

@ -0,0 +1,25 @@
package eu.maiora.model
import eu.maiora.db.*
import org.jetbrains.exposed.sql.and
import java.time.LocalDate
import java.time.format.DateTimeFormatter
class ProdottiPrenotabiliRepositoryImpl : ProdottiPrenotabiliRepository {
override suspend fun prodottiPrenotabiliByGiornoIdTurnoIdPuntoDistIdMod(giorno : String,
idTurno : Long,
idPuntoDistribuzione : Long,
idModalita : Long): List<ProdottiPrenotabili> = suspendTransaction {
// Cerca la lista di prodotti prenotabili
val formatter = DateTimeFormatter.ofPattern("ddMMyyyy")
val formattedDate = LocalDate.parse(giorno, formatter)
ProdottiPrenotabiliDao.find { (ProdottiPrenotabiliTable.giorno eq formattedDate) and
(ProdottiPrenotabiliTable.idTurno eq idTurno) and
(ProdottiPrenotabiliTable.idPuntoDistribuzione eq idPuntoDistribuzione) and
(ProdottiPrenotabiliTable.idModalita eq idModalita)}
.toList() // Restituisce la lista dei prodotti prenotabili
.map { prodottiPrenotabiliDaoToModel(it) } // Converte il DAO in un oggetto ProdottiPrenotabili
}
}

View File

@ -0,0 +1,14 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
@Serializable
data class PuntiDistribuzione(
val id: Long,
val idPuntoDistribuzione : Long,
val puntoDistribuzione : String,
val idPuntoCassa : Long,
val puntoCassa : String,
val idModalita : Long,
val modalitaPrenotazione : String
)

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface PuntiDistribuzioneRepository {
suspend fun puntiDistByGiornoIdTurno(giorno : String, idTurno : Long): List<PuntiDistribuzione>?
}

View File

@ -0,0 +1,21 @@
package eu.maiora.model
import eu.maiora.db.*
import org.jetbrains.exposed.sql.SortOrder
import org.jetbrains.exposed.sql.and
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
class PuntiDistribuzioneRepositoryImpl : PuntiDistribuzioneRepository {
override suspend fun puntiDistByGiornoIdTurno(giorno : String, idTurno : Long): List<PuntiDistribuzione> = suspendTransaction {
// Cerca la lista di punti distribuzione dalla tabella degli slot prenotabili
val formatter = DateTimeFormatter.ofPattern("ddMMyyyy")
val formattedDate = LocalDate.parse(giorno, formatter)
SlotPrenotabiliDao.find { (SlotPrenotabiliTable.giorno eq formattedDate) and (SlotPrenotabiliTable.idTurno eq idTurno)}
.toList() // Restituisce la lista degli slot prenotabili da cui ricavare i punti distribuzione
.map { puntiDistribuzioneDaoToModel(it) } // Converte il DAO in un oggetto PuntiDistribuzione
}
}

View File

@ -0,0 +1,12 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
@Serializable
data class Ricariche(
val id : Long? = null,
val codiceTransazione : String,
val messaggio : String? = null,
val idTessera : Long,
val importo : Double
)

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface RicaricheRepository {
suspend fun insert(ricarica : Ricariche): Ricariche
}

View File

@ -0,0 +1,26 @@
package eu.maiora.model
import eu.maiora.db.*
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.insertAndGetId
class RicaricheRepositoryImpl : RicaricheRepository {
override suspend fun insert(ricarica : Ricariche): Ricariche = suspendTransaction {
// Inserisci una nuova ricarica
// ID non definito: viene gestito dalla sequence
val idRicaricaInserted = RicaricheTable.insertAndGetId {
it[codiceTransazione] = ricarica.codiceTransazione
it[messaggio] = ricarica.messaggio
it[idTessera] = ricarica.idTessera
it[importo] = ricarica.importo
}.value
Ricariche(
idRicaricaInserted,
ricarica.codiceTransazione,
ricarica.messaggio,
ricarica.idTessera,
ricarica.importo
)
}
}

View File

@ -0,0 +1,21 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
@Serializable
data class SlotOrari(
val id: Long,
val giorno : String,
val dataInizio : String,
val dataFine : String,
val idPuntoDistribuzione : Long,
val puntoDistribuzione : String,
val idPuntoCassa : Long,
val puntoCassa : String,
val idModalita : Long,
val modalitaPrenotazione : String,
val idTurno : Long,
val turno : String,
val idResidenza : Long? = null,
val residenza : String? = null
)

View File

@ -0,0 +1,8 @@
package eu.maiora.model
interface SlotOrariRepository {
suspend fun slotOrariByGiornoIdTurnoIdPuntoDistIdMod(giorno : String,
idTurno : Long,
idPuntoDistribuzione : Long,
idModalita : Long): List<SlotOrari>?
}

View File

@ -0,0 +1,25 @@
package eu.maiora.model
import eu.maiora.db.*
import org.jetbrains.exposed.sql.and
import java.time.LocalDate
import java.time.format.DateTimeFormatter
class SlotOrariRepositoryImpl : SlotOrariRepository {
override suspend fun slotOrariByGiornoIdTurnoIdPuntoDistIdMod(giorno : String,
idTurno : Long,
idPuntoDistribuzione : Long,
idModalita : Long): List<SlotOrari> = suspendTransaction {
// Cerca la lista di slot orari
val formatter = DateTimeFormatter.ofPattern("ddMMyyyy")
val formattedDate = LocalDate.parse(giorno, formatter)
SlotPrenotabiliDao.find { (SlotPrenotabiliTable.giorno eq formattedDate) and
(SlotPrenotabiliTable.idTurno eq idTurno) and
(SlotPrenotabiliTable.idPuntoDistribuzione eq idPuntoDistribuzione) and
(SlotPrenotabiliTable.idModalita eq idModalita)}
.toList() // Restituisce la lista degli slot prenotabili da cui ricavare i punti distribuzione
.map { slotOrariDaoToModel(it) } // Converte il DAO in un oggetto SlotOrari
}
}

View File

@ -0,0 +1,13 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
@Serializable
data class Tessere(
val id: Long,
val idUtente : Long,
val codiceFiscale : String,
val numero : String,
val saldo : Double,
val punti : Int
)

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface TessereRepository {
suspend fun tesseraByCodiceFiscale(cf : String): Tessere?
}

View File

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

View File

@ -0,0 +1,12 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
@Serializable
data class ValorePasti(
val idTessera : Long,
val idVassoio : Long,
val data : String,
val prezzo : Double,
val punti : Int
)

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface ValorePastiRepository {
suspend fun valorePastoByTessVassData(idTessera : String, idVassoio : String, data : String): String
}

View File

@ -0,0 +1,31 @@
package eu.maiora.model
import eu.maiora.db.*
import org.jetbrains.exposed.sql.LongColumnType
import org.jetbrains.exposed.sql.SqlExpressionBuilder
import org.jetbrains.exposed.sql.VarCharColumnType
class ValorePastiRepositoryImpl : ValorePastiRepository {
override suspend fun valorePastoByTessVassData(idTessera : String, idVassoio : String, data : String): String = suspendTransaction {
// Cerca valore del pasto e punti in base alla tessera, al vassoio e al giorno
val result = exec("SELECT SIR.trova_tariffa(?, ?, ?) FROM dual",
listOf(
Pair(LongColumnType(), idTessera),
Pair(LongColumnType(), idVassoio),
Pair(VarCharColumnType(), data)
)){ rs ->
var resultString: String? = null
// Processiamo il ResultSet restituito dalla query
if (rs.next()) {
resultString = rs.getString(1) // Leggiamo il primo risultato
}
resultString
}
result ?: "Nessun risultato"
}
}

View File

@ -1,7 +1,7 @@
package eu.maiora.plugins
import eu.maiora.model.AccountsRepositoryImpl
import eu.maiora.routes.auth
import eu.maiora.model.*
import eu.maiora.routes.*
import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
@ -13,5 +13,13 @@ fun Application.configureRouting() {
}
auth(AccountsRepositoryImpl())
tessere(TessereRepositoryImpl())
movimenti(MovimentiRepositoryImpl())
composizioni(ComposizioniRepositoryImpl())
valorePasti(ValorePastiRepositoryImpl())
ricariche(RicaricheRepositoryImpl())
puntiDistribuzione(PuntiDistribuzioneRepositoryImpl())
slotOrari(SlotOrariRepositoryImpl())
prodottiPrenotabili(ProdottiPrenotabiliRepositoryImpl())
}
}

View File

@ -0,0 +1,20 @@
package eu.maiora.routes
import eu.maiora.model.ComposizioniRepositoryImpl
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
fun Route.composizioni(composizioniRepository: ComposizioniRepositoryImpl){
route("/api/composizioni"){
authenticate("auth-jwt") {
get(){
val listaComposizioni = composizioniRepository.listaComposizioni()
call.respond(listaComposizioni)
}
}
}
}

View File

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

View File

@ -0,0 +1,55 @@
package eu.maiora.routes
import eu.maiora.model.ProdottiPrenotabiliRepositoryImpl
import eu.maiora.model.SlotOrariRepositoryImpl
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.prodottiPrenotabili(prodottiPrenotabiliRepository: ProdottiPrenotabiliRepositoryImpl){
route("/api/prodottiPrenotabili"){
authenticate("auth-jwt") {
get(){
// Ottieni l'id del turno, il giorno, l'id della modalita e l'id del punto di distribuzione dal percorso
val idTurno = call.parameters["idTurno"]
val giorno = call.parameters["giorno"]
val idPuntoDistribuzione = call.parameters["idPuntoDistribuzione"]
val idModalita = call.parameters["idModalita"]
if (idTurno.isNullOrEmpty()) {
call.respondText("ID turno non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
if (idPuntoDistribuzione.isNullOrEmpty()) {
call.respondText("ID punto distribuzione non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
if (idModalita.isNullOrEmpty()) {
call.respondText("ID modalita non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
if (giorno.isNullOrEmpty()) {
call.respondText("Giorno non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
// Cerca i prodotti prenotabili per giorno, turno, punto distribuzione e modalita
val listaProdottiPrenotabili = prodottiPrenotabiliRepository.prodottiPrenotabiliByGiornoIdTurnoIdPuntoDistIdMod(giorno,
idTurno.toLong(),
idPuntoDistribuzione.toLong(),
idModalita.toLong())
if (listaProdottiPrenotabili != null) {
call.respond(listaProdottiPrenotabili)
} else {
call.respondText("Prodotti prenotabili non trovati", status = HttpStatusCode.NotFound)
}
}
}
}
}

View File

@ -0,0 +1,41 @@
package eu.maiora.routes
import eu.maiora.model.PuntiDistribuzioneRepositoryImpl
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.puntiDistribuzione(puntiDistribuzioneRepository: PuntiDistribuzioneRepositoryImpl){
route("/api/puntiDistribuzione"){
authenticate("auth-jwt") {
get(){
// Ottieni l'id del turno e il giorno dal percorso
val idTurno = call.parameters["idTurno"]
val giorno = call.parameters["giorno"]
if (idTurno.isNullOrEmpty()) {
call.respondText("ID turno non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
if (giorno.isNullOrEmpty()) {
call.respondText("Giorno non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
// Cerca i punti distribuzione per giorno e turno
val listaPuntiDistribuzione = puntiDistribuzioneRepository.puntiDistByGiornoIdTurno(giorno, idTurno.toLong())
if (listaPuntiDistribuzione != null) {
call.respond(listaPuntiDistribuzione)
} else {
call.respondText("Punti distribuzione non trovati", status = HttpStatusCode.NotFound)
}
}
}
}
}

View File

@ -0,0 +1,43 @@
package eu.maiora.routes
import eu.maiora.model.*
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
fun Route.ricariche(ricaricheRepository: RicaricheRepository){
route("/api/ricariche"){
authenticate("auth-jwt") {
post(){
try{
val ricaricaRequest = call.receive<Ricariche>()
//solo per il codiceTransazione (String) è necessario controllare se è vuoto
if(ricaricaRequest.codiceTransazione.isBlank()){
call.respond(
HttpStatusCode.BadRequest,
"Errore nel processare la richiesta: codiceTransazione vuoto"
)
}
// Inserisci la ricarica nel database
val ricaricaInserita = ricaricheRepository.insert(ricaricaRequest)
// Rispondi con l'oggetto Ricariche, che include l'ID generato
call.respond(HttpStatusCode.Created, ricaricaInserita)
}
catch (e: Exception){
call.respond(
HttpStatusCode.BadRequest,
"Errore nel processare la richiesta: ${e.cause}"
)
}
}
}
}
}

View File

@ -0,0 +1,54 @@
package eu.maiora.routes
import eu.maiora.model.SlotOrariRepositoryImpl
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.slotOrari(slotOrariRepository: SlotOrariRepositoryImpl){
route("/api/slotOrari"){
authenticate("auth-jwt") {
get(){
// Ottieni l'id del turno, il giorno, l'id della modalita e l'id del punto di distribuzione dal percorso
val idTurno = call.parameters["idTurno"]
val giorno = call.parameters["giorno"]
val idPuntoDistribuzione = call.parameters["idPuntoDistribuzione"]
val idModalita = call.parameters["idModalita"]
if (idTurno.isNullOrEmpty()) {
call.respondText("ID turno non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
if (idPuntoDistribuzione.isNullOrEmpty()) {
call.respondText("ID punto distribuzione non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
if (idModalita.isNullOrEmpty()) {
call.respondText("ID modalita non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
if (giorno.isNullOrEmpty()) {
call.respondText("Giorno non valido o non presente nei parametri", status = HttpStatusCode.BadRequest)
return@get
}
// Cerca gli slot orari per giorno, turno, punto distribuzione e modalita
val listaSlotOrari = slotOrariRepository.slotOrariByGiornoIdTurnoIdPuntoDistIdMod(giorno,
idTurno.toLong(),
idPuntoDistribuzione.toLong(),
idModalita.toLong())
if (listaSlotOrari != null) {
call.respond(listaSlotOrari)
} else {
call.respondText("Slot orari non trovati", status = HttpStatusCode.NotFound)
}
}
}
}
}

View File

@ -0,0 +1,35 @@
package eu.maiora.routes
import eu.maiora.model.TessereRepositoryImpl
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.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)
if (tessera != null) {
call.respond(tessera)
} else {
call.respondText("Tessera non trovata", status = HttpStatusCode.NotFound)
}
}
}
}
}

View File

@ -0,0 +1,54 @@
package eu.maiora.routes
import eu.maiora.model.TessereRepositoryImpl
import eu.maiora.model.ValorePasti
import eu.maiora.model.ValorePastiRepository
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.valorePasti(valorePastiRepository: ValorePastiRepository){
route("/api/valorePasti"){
authenticate("auth-jwt") {
get(){
// Ottieni i parametri dal percorso
val idTessera = call.parameters["idTessera"]
val idVassoio = call.parameters["idVassoio"]
val data = call.parameters["data"]
if (idTessera == null) {
call.respondText("ID tessera non valido", status = HttpStatusCode.BadRequest)
return@get
}
if (idVassoio == null) {
call.respondText("ID vassoio non valido", status = HttpStatusCode.BadRequest)
return@get
}
if (data == null) {
call.respondText("data non valida", status = HttpStatusCode.BadRequest)
return@get
}
// Cerca la tessera per codice fiscale
val valorePasto = valorePastiRepository.valorePastoByTessVassData(idTessera, idVassoio, data)
val prezzo = valorePasto.split("#").get(0)
val punti = valorePasto.split("#").get(1)
if(prezzo == "-1" && punti == "-1")
call.respondText("Prezzo e punti non trovati", status = HttpStatusCode.NotFound)
call.respond( ValorePasti(idTessera.toLong(),
idVassoio.toLong(), data,
prezzo.replace(',', '.').toDouble(),
punti.toInt()))
}
}
}
}