Compare commits

..

No commits in common. "8af255bea01594d62ce3da202af5f39036b19261" and "96afe62837da3080cad45a60f3f28609e0b3e735" have entirely different histories.

12 changed files with 10 additions and 214 deletions

View File

@ -1,6 +1,9 @@
package eu.maiora.db package eu.maiora.db
import eu.maiora.model.* import eu.maiora.model.Accounts
import eu.maiora.model.Movimenti
import eu.maiora.model.Parametri
import eu.maiora.model.Tessere
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
@ -59,15 +62,6 @@ object MovimentiTable : IdTable<Long>("view_movimenti_api"){
val puntiPost = integer("punti_post") 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")
}
class AccountsDAO(id: EntityID<Int>) :IntEntity(id) { class AccountsDAO(id: EntityID<Int>) :IntEntity(id) {
companion object : IntEntityClass<AccountsDAO>(AccountsTable) companion object : IntEntityClass<AccountsDAO>(AccountsTable)
@ -110,16 +104,6 @@ class MovimentiDao(id: EntityID<Long>) :LongEntity(id) {
var puntiPost by MovimentiTable.puntiPost 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
}
fun accountsDaoToModel(dao: AccountsDAO) = Accounts( fun accountsDaoToModel(dao: AccountsDAO) = Accounts(
dao.id.value, dao.id.value,
@ -164,15 +148,6 @@ fun movimentiDaoToModel(dao: MovimentiDao) :Movimenti{
) )
} }
fun composizioniDaoToModel(dao: ComposizioniDao) =Composizioni(
dao.id.value,
dao.idVassoio,
dao.vassoio,
dao.idCategoria,
dao.categoria,
dao.quantita
)

View File

@ -1,13 +0,0 @@
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

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

View File

@ -1,14 +0,0 @@
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

@ -1,12 +0,0 @@
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

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

View File

@ -1,31 +0,0 @@
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,15 +1,12 @@
package eu.maiora.plugins package eu.maiora.plugins
import eu.maiora.model.*
import eu.maiora.model.AccountsRepositoryImpl import eu.maiora.model.AccountsRepositoryImpl
import eu.maiora.model.MovimentiRepositoryImpl import eu.maiora.model.MovimentiRepositoryImpl
import eu.maiora.model.ParametriRepositoryImpl import eu.maiora.model.ParametriRepositoryImpl
import eu.maiora.model.TessereRepositoryImpl import eu.maiora.model.TessereRepositoryImpl
import eu.maiora.routes.auth import eu.maiora.routes.auth
import eu.maiora.routes.composizioni
import eu.maiora.routes.movimenti import eu.maiora.routes.movimenti
import eu.maiora.routes.tessere import eu.maiora.routes.tessere
import eu.maiora.routes.valorePasti
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.*
@ -23,7 +20,5 @@ fun Application.configureRouting() {
auth(AccountsRepositoryImpl()) auth(AccountsRepositoryImpl())
tessere(TessereRepositoryImpl()) tessere(TessereRepositoryImpl())
movimenti(MovimentiRepositoryImpl()) movimenti(MovimentiRepositoryImpl())
composizioni(ComposizioniRepositoryImpl())
valorePasti(ValorePastiRepositoryImpl())
} }
} }

View File

@ -31,7 +31,7 @@ fun Route.auth(accountsRepository: AccountsRepositoryImpl) {
logger.info( logger.info(
"param: " + "param: " +
receivedResponse.param receivedResponse.param
) );
// Decodifica la stringa da Base64 a oggetto Credentials // Decodifica la stringa da Base64 a oggetto Credentials
val decodedBytes = Base64.getDecoder().decode(receivedResponse.param) val decodedBytes = Base64.getDecoder().decode(receivedResponse.param)

View File

@ -1,20 +0,0 @@
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

@ -1,50 +0,0 @@
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)
call.respond( ValorePasti(idTessera.toLong(),
idVassoio.toLong(), data,
prezzo.replace(',', '.').toDouble(),
punti.toInt()))
}
}
}
}

View File

@ -1,43 +1,19 @@
<configuration> <configuration>
<!-- Appender per la console -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder> <encoder>
<pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> <pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!-- Appender per il file di log con rotazione basata su tempo e dimensione --> <file>./logFile.log</file>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./log/logFile.log</file> <!-- File di log principale -->
<append>true</append> <append>true</append>
<!-- RollingPolicy per dimensione e tempo -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- Pattern per il nome dei file ruotati: include la data -->
<FileNamePattern>./log/logFile.%d{yyyy-MM-dd}.%i.log</FileNamePattern> <!-- %i è il numero di file generato -->
<!-- Limita la dimensione del file a 100MB -->
<maxFileSize>100MB</maxFileSize> <!-- Ruota il file quando raggiunge 100MB -->
<!-- Conserva i log per due settimane -->
<maxHistory>15</maxHistory> <!-- Limita a 15 giorni i log archiviati -->
<!-- Limita la dimensione totale dei file di log a 5GB -->
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<encoder> <encoder>
<pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> <pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
<root level="trace">
<!-- Configurazione del livello di log --> <appender-ref ref="FILE"/>
<root level="DEBUG">
<appender-ref ref="ROLLING_FILE"/>
<appender-ref ref="STDOUT"/> <appender-ref ref="STDOUT"/>
</root> </root>
<logger name="io.netty" level="INFO"/> <logger name="io.netty" level="INFO"/>
</configuration> </configuration>