0002650-endpoint-annullaPrenotazioni-modifiche-richieste #25

Merged
f.disciascio merged 1 commits from 0002650-endpoint-annullaPrenotazioni-modifiche-richieste into dev 2025-10-03 10:30:09 +00:00
14 changed files with 485 additions and 104 deletions

View File

@ -3,6 +3,8 @@ package eu.maiora.db
import eu.maiora.model.*
import kotlinx.coroutines.Dispatchers
import kotlinx.datetime.toKotlinLocalDate
import kotlinx.datetime.toKotlinLocalDateTime
import org.jetbrains.exposed.dao.*
import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.dao.id.IdTable
@ -13,7 +15,6 @@ import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransacti
import java.time.format.DateTimeFormatter
object AccountsTable : IdTable<Int>("accounts") {
override val id = integer("id").entityId()
val username = varchar("username", 255)
@ -30,7 +31,15 @@ object ParametriTable : IdTable<Int>("parametri"){
override val primaryKey = PrimaryKey(id)
}
object TessereTable : IdTable<Long>("view_tessere_api"){
object TessereTable : IdTable<Long>("tessere") {
override val id = long("id").entityId()
val saldo = double("saldo")
val tsUltimoUtilizzo = datetime("ts_ultimo_utilizzo")
override val primaryKey = PrimaryKey(id)
}
object ViewTessereAPITable : IdTable<Long>("view_tessere_api") {
override val id = long("id").entityId()
val idUtente = long("id_utente")
val codiceFiscale = varchar("codice_fiscale", 255)
@ -59,6 +68,35 @@ object MovimentiTable : IdTable<Long>("view_movimenti_api"){
val dettagli = varchar("dettagli", 255)
}
object DwhMovimentiTable : IdTable<Long>("dwh.movimenti") {
override val id = long("id").autoIncrement("dwh.seq_movimenti").entityId()
val idTessera = long("id_tessera")
val numero = varchar("numero", 255)
val operazione = varchar("operazione", 255)
val data = datetime("DATA")
val transazione = long("transazione")
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 = long("punti_pre")
val punti = long("punti")
val puntiPost = long("punti_post")
val flagPassaggioTessera = integer("flag_passaggio_tessera")
val oggetto = varchar("oggetto", 255)
val cognome = varchar("cognome", 255)
val nome = varchar("nome", 255)
val codiceFiscale = varchar("codice_fiscale", 255)
val azienda = varchar("azienda", 255)
val categoriaUtenti = varchar("categoria_utenti", 255)
val fascia = varchar("fascia", 255)
val idTipoMovimentoConto = integer("id_tipo_movimento_conto")
val giorno = date("giorno")
val modalita = varchar("modalita", 255)
val idModalita = long("id_modalita")
}
object ComposizioniTable : IdTable<Long>("view_composizioni") {
override val id = long("id").entityId()
val idVassoio = long("id_vassoio")
@ -148,6 +186,7 @@ object ViewPrenotazioniPastiTable : IdTable<Long>("view_prenotazioni_pasti"){
val dataFine = datetime("data_fine")
val dataLimiteCancellazione = datetime("data_limite_cancellazione")
val idVassoio = long("id_vassoio").nullable()
val vassoio = varchar("vassoio", 255)
val codiceRistocloud = varchar("codice_ristocloud", 255).nullable()
val importoPagato = double("importo_pagato")
val puntoDistribuzione = varchar("punto_distribuzione", 255)
@ -175,11 +214,18 @@ class ParametriDAO(id: EntityID<Int>) :IntEntity(id) {
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
var tsUltimoUtilizzo by TessereTable.tsUltimoUtilizzo
}
class ViewTessereAPIDao(id: EntityID<Long>) : LongEntity(id) {
companion object : LongEntityClass<ViewTessereAPIDao>(ViewTessereAPITable)
var idUtente by ViewTessereAPITable.idUtente
var codiceFiscale by ViewTessereAPITable.codiceFiscale
var numero by ViewTessereAPITable.numero
var saldo by ViewTessereAPITable.saldo
var punti by ViewTessereAPITable.punti
}
class MovimentiDao(id: EntityID<Long>) : LongEntity(id) {
@ -201,6 +247,36 @@ class MovimentiDao(id: EntityID<Long>) :LongEntity(id) {
var dettagli by MovimentiTable.dettagli
}
class DwhMovimentiDao(id: EntityID<Long>) : LongEntity(id) {
companion object : LongEntityClass<DwhMovimentiDao>(DwhMovimentiTable)
var idTessera by DwhMovimentiTable.idTessera
var numero by DwhMovimentiTable.numero
var operazione by DwhMovimentiTable.operazione
var data by DwhMovimentiTable.data
var transazione by DwhMovimentiTable.transazione
var dispositivo by DwhMovimentiTable.dispositivo
var riferimento by DwhMovimentiTable.riferimento
var saldoPre by DwhMovimentiTable.saldoPre
var importo by DwhMovimentiTable.importo
var saldoPost by DwhMovimentiTable.saldoPost
var puntiPre by DwhMovimentiTable.puntiPre
var punti by DwhMovimentiTable.punti
var puntiPost by DwhMovimentiTable.puntiPost
var flagPassaggioTessera by DwhMovimentiTable.flagPassaggioTessera
var oggetto by DwhMovimentiTable.oggetto
var cognome by DwhMovimentiTable.cognome
var nome by DwhMovimentiTable.nome
var codiceFiscale by DwhMovimentiTable.codiceFiscale
var azienda by DwhMovimentiTable.azienda
var categoriaUtenti by DwhMovimentiTable.categoriaUtenti
var fascia by DwhMovimentiTable.fascia
var idTipoMovimentoConto by DwhMovimentiTable.idTipoMovimentoConto
var giorno by DwhMovimentiTable.giorno
var modalita by DwhMovimentiTable.modalita
var idModalita by DwhMovimentiTable.idModalita
}
class ComposizioniDao(id: EntityID<Long>) : LongEntity(id) {
companion object : LongEntityClass<ComposizioniDao>(ComposizioniTable)
@ -297,6 +373,7 @@ class ViewPrenotazioniPastiDao(id: EntityID<Long>) :LongEntity(id){
val dataFine by ViewPrenotazioniPastiTable.dataFine
val dataLimiteCancellazione by ViewPrenotazioniPastiTable.dataLimiteCancellazione
val idVassoio by ViewPrenotazioniPastiTable.idVassoio
val vassoio by ViewPrenotazioniPastiTable.vassoio
val codiceRistocloud by ViewPrenotazioniPastiTable.codiceRistocloud
val importoPagato by ViewPrenotazioniPastiTable.importoPagato
val puntoDistribuzione by ViewPrenotazioniPastiTable.puntoDistribuzione
@ -320,6 +397,15 @@ fun parametriDaoToModel(dao: ParametriDAO) = Parametri(
)
fun tessereDaoToModel(dao: TessereDao) = Tessere(
dao.id.value,
dao.saldo,
dao.tsUltimoUtilizzo.toKotlinLocalDateTime()
)
fun viewTessereAPIDaoToModel(dao: ViewTessereAPIDao): ViewTessereAPI {
return ViewTessereAPI(
dao.id.value,
dao.idUtente,
dao.codiceFiscale,
@ -327,6 +413,8 @@ fun tessereDaoToModel(dao: TessereDao) = Tessere(
dao.saldo,
dao.punti
)
}
fun movimentiDaoToModel(dao: MovimentiDao): Movimenti {
val formatter = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
@ -351,6 +439,36 @@ fun movimentiDaoToModel(dao: MovimentiDao) :Movimenti{
)
}
fun dwhMovimentiDaoToModel(dao: DwhMovimentiDao) = DwhMovimenti(
dao.id.value,
dao.idTessera,
dao.numero,
dao.operazione,
dao.data.toKotlinLocalDateTime(),
dao.transazione,
dao.dispositivo,
dao.riferimento,
dao.saldoPre,
dao.importo,
dao.saldoPost,
dao.puntiPre,
dao.punti,
dao.puntiPost,
dao.flagPassaggioTessera,
dao.oggetto,
dao.cognome,
dao.nome,
dao.codiceFiscale,
dao.azienda,
dao.categoriaUtenti,
dao.fascia,
dao.idTipoMovimentoConto,
dao.giorno.toKotlinLocalDate(),
dao.modalita,
dao.idModalita
)
fun composizioniDaoToModel(dao: ComposizioniDao) = Composizioni(
dao.id.value,
dao.idVassoio,
@ -450,39 +568,11 @@ fun prenotazioniPastiDettaglioDaoToModel(dao: PrenotazioniPastiDettaglioDao) : P
)
}
/*fun viewPrenotazioniPastiDaoToModel(dao: ViewPrenotazioniPastiDao) : ViewPrenotazioniPasti{
val formatterGiorno = DateTimeFormatter.ofPattern("ddMMyyyy")
val formatterDataInizio = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
val formatterDataFine = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
val formatterDataLimiteCancellazione = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
val formattedGiorno = dao.giorno.format(formatterGiorno)
val formattedDataInizio = dao.dataInizio.format(formatterDataInizio)
val formattedDataFine = dao.dataFine.format(formatterDataFine)
val formattedDataLimiteCanc = dao.dataLimiteCancellazione.format(formatterDataLimiteCancellazione)
return ViewPrenotazioniPasti(
dao.idPrenotazione,
dao.idStato,
dao.stato,
dao.idTessera,
dao.idSlotPuntoCassa,
formattedGiorno,
dao.turno,
formattedDataInizio,
formattedDataFine,
formattedDataLimiteCanc,
dao.idVassoio,
dao.codiceRistocloud,
dao.importoPagato,
dao.puntoDistribuzione,
dao.puntoCassa,
dao.modalita,
null
)
}*/
fun viewPrenotazioniPastiDaoToModel(dao: ViewPrenotazioniPastiDao, listaProdotti: List<ListaProdottiElement>? = null) : ViewPrenotazioniPasti{
fun viewPrenotazioniPastiDaoToModel(
dao: ViewPrenotazioniPastiDao,
listaProdotti: List<ListaProdottiElement>? = null
): ViewPrenotazioniPasti {
val formatterGiorno = DateTimeFormatter.ofPattern("ddMMyyyy")
val formatterDataInizio = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
val formatterDataFine = DateTimeFormatter.ofPattern("ddMMyyyy HH:mm")
@ -505,6 +595,7 @@ fun viewPrenotazioniPastiDaoToModel(dao: ViewPrenotazioniPastiDao, listaProdotti
formattedDataFine,
formattedDataLimiteCanc,
dao.idVassoio,
dao.vassoio,
dao.codiceRistocloud,
dao.importoPagato,
dao.puntoDistribuzione,

View File

@ -0,0 +1,38 @@
package eu.maiora.model
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.serialization.Serializable
@Serializable
data class DwhMovimenti(
val id: Long,
val idTessera: Long,
val numero: String,
val operazione: String,
val data: LocalDateTime,
val transazione: Long,
val dispositivo: String,
val riferimento: String,
val saldoPre: Double,
val importo: Double,
val saldoPost: Double,
val puntiPre: Long,
val punti: Long,
val puntiPost: Long,
val flagPassaggioTessera: Int,
val oggetto: String,
val cognome: String,
val nome: String,
val codiceFiscale: String,
val azienda: String,
val categoriaUtenti: String,
val fascia: String,
val idTipoMovimentoConto: Int,
val giorno: LocalDate,
val modalita: String,
val idModalita: Long
)

View File

@ -0,0 +1,5 @@
package eu.maiora.model
interface DwhMovimentiRepository {
suspend fun insert(movimento : DwhMovimenti): DwhMovimenti
}

View File

@ -0,0 +1,71 @@
package eu.maiora.model
import eu.maiora.db.*
import kotlinx.datetime.toJavaLocalDate
import kotlinx.datetime.toJavaLocalDateTime
import org.jetbrains.exposed.sql.insertAndGetId
class DwhMovimentiRepositoryImpl : DwhMovimentiRepository {
override suspend fun insert(movimento : DwhMovimenti): DwhMovimenti = suspendTransaction {
// Inserisci un nuovo movimento
// ID non definito: viene gestito dalla sequence
val idMovimentoInserted = DwhMovimentiTable.insertAndGetId {
it[idTessera] = movimento.idTessera
it[numero] = movimento.numero
it[operazione] = movimento.operazione
it[data] = movimento.data.toJavaLocalDateTime()
it[transazione] = movimento.transazione
it[dispositivo] = movimento.dispositivo
it[riferimento] = movimento.riferimento
it[saldoPre] = movimento.saldoPre
it[importo] = movimento.importo
it[saldoPost] = movimento.saldoPost
it[puntiPre] = movimento.puntiPre
it[punti] = movimento.punti
it[puntiPost] = movimento.puntiPost
it[flagPassaggioTessera] = movimento.flagPassaggioTessera
it[oggetto] = movimento.oggetto
it[cognome] = movimento.cognome
it[nome] = movimento.nome
it[codiceFiscale] = movimento.codiceFiscale
it[azienda] = movimento.azienda
it[categoriaUtenti] = movimento.categoriaUtenti
it[fascia] = movimento.fascia
it[idTipoMovimentoConto] = movimento.idTipoMovimentoConto
it[giorno] = movimento.giorno.toJavaLocalDate()
it[modalita] = movimento.modalita
it[idModalita] = movimento.idModalita
}.value
DwhMovimenti(
idMovimentoInserted,
movimento.idTessera,
movimento.numero,
movimento.operazione,
movimento.data,
movimento.transazione,
movimento.dispositivo,
movimento.riferimento,
movimento.saldoPre,
movimento.importo,
movimento.saldoPost,
movimento.puntiPre,
movimento.punti,
movimento.puntiPost,
movimento.flagPassaggioTessera,
movimento.oggetto,
movimento.cognome,
movimento.nome,
movimento.codiceFiscale,
movimento.azienda,
movimento.categoriaUtenti,
movimento.fascia,
movimento.idTipoMovimentoConto,
movimento.giorno,
movimento.modalita,
movimento.idModalita
)
}
}

View File

@ -1,13 +1,11 @@
package eu.maiora.model
import kotlinx.datetime.LocalDateTime
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
val tsUltimoUtilizzo : LocalDateTime
)

View File

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

View File

@ -1,13 +1,17 @@
package eu.maiora.model
import eu.maiora.db.*
import kotlinx.datetime.toJavaLocalDateTime
import org.jetbrains.exposed.sql.update
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
override suspend fun update (tessera : Tessere): Tessere = suspendTransaction {
TessereTable.update({TessereTable.id eq tessera.id}){
it[saldo] = tessera.saldo
it[tsUltimoUtilizzo] = tessera.tsUltimoUtilizzo.toJavaLocalDateTime()
}
tessera
}
}

View File

@ -1,6 +1,7 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
@Serializable
data class ViewPrenotazioniPasti(
@ -15,6 +16,8 @@ data class ViewPrenotazioniPasti(
val dataFine: String,
val dataLimiteCancellazione: String,
val idVassoio: Long? = null,
@Transient
val vassoio: String = "",
val codiceRistocloud: String? = null,
val importoPagato: Double,
val puntoDistribuzione: String,

View File

@ -0,0 +1,14 @@
package eu.maiora.model
import kotlinx.serialization.Serializable
import javax.management.monitor.StringMonitor
@Serializable
data class ViewTessereAPI(
val id: Long,
val idUtente : Long,
val codiceFiscale : String,
val numero : String,
val saldo : Double,
val punti : Int
)

View File

@ -0,0 +1,6 @@
package eu.maiora.model
interface ViewTessereAPIRepository {
suspend fun tesseraByCodiceFiscale(cf : String): ViewTessereAPI?
suspend fun tesseraById(id : Long): ViewTessereAPI?
}

View File

@ -0,0 +1,23 @@
package eu.maiora.model
import eu.maiora.db.*
import org.jetbrains.exposed.sql.update
import java.time.LocalDateTime
class ViewTessereAPIRepositoryImpl : ViewTessereAPIRepository {
override suspend fun tesseraByCodiceFiscale(cf: String): ViewTessereAPI? = suspendTransaction {
// Cerca tessere in base al codice fiscale
ViewTessereAPIDao.find { ViewTessereAPITable.codiceFiscale eq cf }
.singleOrNull() // Restituisce un singolo risultato o null se non trovato
?.let { viewTessereAPIDaoToModel(it) } // Converte il DAO in un oggetto ViewTessereAPI
}
override suspend fun tesseraById(id: Long): ViewTessereAPI? = suspendTransaction{
//Cerca tessera in base all'id
ViewTessereAPIDao.find{ViewTessereAPITable.id eq id}
.singleOrNull()
?.let{viewTessereAPIDaoToModel(it)}
}
}

View File

@ -13,7 +13,7 @@ fun Application.configureRouting() {
}
auth(AccountsRepositoryImpl())
tessere(TessereRepositoryImpl())
tessere(ViewTessereAPIRepositoryImpl())
movimenti(MovimentiRepositoryImpl())
composizioni(ComposizioniRepositoryImpl())
valorePasti(ValorePastiRepositoryImpl())
@ -26,7 +26,11 @@ fun Application.configureRouting() {
SlotOrariRepositoryImpl(),
PrenotazioniPastiDettaglioRepositoryImpl(),
ViewPrenotazioniPastiRepositoryImpl())
annullaPrenotazioni(ViewPrenotazioniPastiRepositoryImpl(), PrenotazioniPastiDettaglioRepositoryImpl())
annullaPrenotazioni(ViewPrenotazioniPastiRepositoryImpl(),
PrenotazioniPastiDettaglioRepositoryImpl(),
TessereRepositoryImpl(),
ViewTessereAPIRepositoryImpl(),
DwhMovimentiRepositoryImpl())
verificaVassoio(SelezionaComposizioneRepositoryImpl())
}
}

View File

@ -6,14 +6,22 @@ import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import kotlinx.datetime.toJavaLocalDateTime
import kotlinx.datetime.toKotlinLocalDate
import kotlinx.datetime.toKotlinLocalDateTime
import kotlinx.serialization.Serializable
import org.jetbrains.exposed.sql.transactions.TransactionManager
import org.jetbrains.exposed.sql.transactions.transaction
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
fun Route.annullaPrenotazioni(
viewPrenotazioniPastiRepository: ViewPrenotazioniPastiRepositoryImpl,
prenotazioniPastiDettaglioRepository: PrenotazioniPastiDettaglioRepositoryImpl
prenotazioniPastiDettaglioRepository: PrenotazioniPastiDettaglioRepositoryImpl,
tessereRepository: TessereRepositoryImpl,
viewTessereAPIRepository: ViewTessereAPIRepositoryImpl,
dwhMovimentiRepository: DwhMovimentiRepositoryImpl
) {
route("/api/annullaPrenotazioni") {
authenticate("auth-jwt") {
@ -54,7 +62,56 @@ fun Route.annullaPrenotazioni(
val listaProdottiPrenotati =
prenotazioniPastiDettaglioRepository.listaDettagliByIdPrenotazione(idPrenotazione.toLong())
val tessera = viewTessereAPIRepository.tesseraById(prenotazione.idTessera)
if (tessera == null) {
call.respond(
HttpStatusCode.BadRequest,
"Prenotazione non annullata: tessera collegata alla prenotazione non trovata"
)
return@patch
}
//recupero i dati di tessera e utente
val datiUtenteTessera = transaction {
val query = """
SELECT u.cognome, u.nome, a.nome as azienda, cu.nome as categoria_utenti, f.nome as fascia
FROM tessere t
LEFT JOIN utenti u ON t.id_utente = u.id
LEFT JOIN categorie_utenti cu ON u.id_categoria = cu.id
LEFT JOIN aziende a ON cu.id_azienda = a.id
LEFT JOIN categorie_utenti_fasce cuf ON cuf.id_categoria_utenti = cu.id
LEFT JOIN fasce f ON cuf.id_fascia = f.id
WHERE t.id = ?
""".trimIndent()
val connection = TransactionManager.current().connection
val preparedStatement = connection.prepareStatement(query, true)
preparedStatement[1] = tessera.id
val rs = preparedStatement.executeQuery()
if (rs.next()) {
DatiUtenteTessera(
cognome = rs.getString("cognome"),
nome = rs.getString("nome"),
azienda = rs.getString("azienda"),
categoriaUtenti = rs.getString("categoria_utenti"),
fascia = rs.getString("fascia")
)
} else null
}
if (datiUtenteTessera == null) {
call.respond(
HttpStatusCode.BadRequest,
"Prenotazione non annullata: dati utente tessera non trovati"
)
return@patch
}
//aggiorna lo stato di ogni prodotto per annullare la prenotazione
try {
listaProdottiPrenotati.forEach { el ->
val prodottoDaAggiornare = PrenotazioniPastiDettaglio(
el.id,
@ -64,17 +121,84 @@ fun Route.annullaPrenotazioni(
)
prenotazioniPastiDettaglioRepository.update(prodottoDaAggiornare)
}
} catch (e: Exception) {
println("Annulamento prenotazione non completato. Errore durante l'update dei dettagli: ${e.message}")
call.respond(HttpStatusCode.InternalServerError, "Errore durante l'update dei dettagli: ${e.message}")
}
//effettuare l'aggiornamento del saldo della tessera
val nuovoSaldo = tessera.saldo.plus(prenotazione.importoPagato)
try {
tessereRepository.update(
Tessere(
tessera.id,
nuovoSaldo,
LocalDateTime.now().toKotlinLocalDateTime()
)
)
} catch (e: Exception) {
println("Annulamento prenotazione non completato. Errore durante l'update della tessera: ${e.message}")
call.respond(HttpStatusCode.InternalServerError, "Errore durante l'update della tessera: ${e.message}")
}
//effettuare l'inserimento del movimento di storno
try {
dwhMovimentiRepository.insert(
DwhMovimenti(
-1L,
tessera.id,
tessera.numero,
"Storno prenotazione pre pagata",
LocalDateTime.now().toKotlinLocalDateTime(),
prenotazione.id,
"App",
"0",
tessera.saldo,
prenotazione.importoPagato,
tessera.saldo + prenotazione.importoPagato,
tessera.punti.toLong(),
0,
tessera.punti.toLong() + 0,
0,
prenotazione.vassoio,
datiUtenteTessera.cognome,
datiUtenteTessera.nome,
tessera.codiceFiscale,
datiUtenteTessera.azienda,
datiUtenteTessera.categoriaUtenti,
datiUtenteTessera.fascia,
3, //Storno
LocalDate.now().toKotlinLocalDate(),
"Standard",
1
)
)
} catch (e: Exception) {
println("Annulamento prenotazione non completato. Errore durante l'insert del movimento: ${e.message}")
call.respond(HttpStatusCode.InternalServerError, "Errore durante l'insert del movimento: ${e.message}")
}
call.respond(HttpStatusCode.OK, "Prenotazione $idPrenotazione annullata")
}
catch (e: IllegalArgumentException) {
} catch (e: IllegalArgumentException) {
call.respond(HttpStatusCode.NotFound, "Prenotazione non trovata: ${e.message}")
}
}
} catch(e: Exception){
println("Annulamento prenotazione non completato. Errore generico: ${e.message}")
call.respond(HttpStatusCode.InternalServerError, "Errore generico: ${e.message}")
}
}
}
}
}
@Serializable
data class DatiUtenteTessera(
val cognome: String,
val nome: String,
val azienda: String,
val categoriaUtenti: String,
val fascia: String
)

View File

@ -1,6 +1,6 @@
package eu.maiora.routes
import eu.maiora.model.TessereRepositoryImpl
import eu.maiora.model.ViewTessereAPIRepositoryImpl
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.auth.*
@ -8,7 +8,7 @@ import io.ktor.server.response.*
import io.ktor.server.routing.*
fun Route.tessere(tessereRepository: TessereRepositoryImpl){
fun Route.tessere(tessereRepository: ViewTessereAPIRepositoryImpl){
route("/api/tessere"){
authenticate("auth-jwt") {
get("{cf}"){