add JDMI service and module #12

Merged
malopieds merged 27 commits from 6-jdmi into master 2026-03-05 18:34:45 +01:00
Owner
No description provided.
malopieds changed title from WIP: add JDMI service and module to add JDMI service and module 2026-02-21 20:48:47 +01:00
@ -0,0 +16,4 @@
@ApplicationScoped
@Path("/jdmi")
class TestJDMI (
Author
Owner

Renomer ici, on va rester dans le package (dossier) rest, avec des nom clairs, JdmiResource.kt (same pour la classe)

Renomer ici, on va rester dans le package (dossier) rest, avec des nom clairs, JdmiResource.kt (same pour la classe)
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +20,4 @@
private val jdmiService: JdmiService,
private val siteService: SiteService
){
@Path("/get/{id}")
Author
Owner

par nommenclature, pas besoin de mettre /get t'as deja le "verbe" dans la mathode (@GET), donc ici juste un /{id}

par nommenclature, pas besoin de mettre /get t'as deja le "verbe" dans la mathode (@GET), donc ici juste un `/{id}`
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +28,4 @@
.build()
}
@Path("/getbysite/{id}")
Author
Owner

Alors ici c'est pas clair, c'est dans la meme categorie que jdmi pour l'id, mais ici c'est pour le site, donc pas sa place dans le fichier jdmi

Alors ici c'est pas clair, c'est dans la meme categorie que jdmi pour l'id, mais ici c'est pour le site, donc pas sa place dans le fichier jdmi
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +31,4 @@
@Path("/getbysite/{id}")
@GET
fun testBySite(@PathParam("id") id: Int): Response {
var site: SiteModel = siteService.getObjById(id)
Author
Owner

Pas de var ici, tu changes pas ton objet

Pas de var ici, tu changes pas ton objet
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +40,4 @@
@Path("/getAll")
@GET
fun testAll(): Response {
Author
Owner

pareil qu'avant, pas de getAll, implicitement le getAll se fait sur la resource de base (ici /jdmi). C'est dans cet endpoint que tu peux ajouter des filtres avec des query params, par exemple pour by site tu rajoute ?site=... sur le getAll pour avoir toutes les jdmi qui sont associe au site

pareil qu'avant, pas de getAll, implicitement le getAll se fait sur la resource de base (ici /jdmi). C'est dans cet endpoint que tu peux ajouter des filtres avec des query params, par exemple pour by site tu rajoute ?site=... sur le getAll pour avoir toutes les jdmi qui sont associe au site
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +46,4 @@
.build()
}
@Path("/create")
Author
Owner

Pareil, pas de /create juste un post sur le /jdmi suffit et c'est implicitement dis que tu creeais une resource, via ton post

Pareil, pas de `/create` juste un post sur le `/jdmi` suffit et c'est implicitement dis que tu creeais une resource, via ton post
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +55,4 @@
.build()
}
@Path("/update/{id}")
Author
Owner

pas de update ici, juste /{id} et pas un POST mais un PUT (dans le cas ou tu modifie toute l'entite, si c'est juste une champ theoriquement ca devrait etre un PATCH mais c'est pas si deep)

pas de update ici, juste /{id} et pas un `POST` mais un `PUT` (dans le cas ou tu modifie toute l'entite, si c'est juste une champ theoriquement ca devrait etre un `PATCH` mais c'est pas si deep)
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +66,4 @@
}
@Path("/delete/{id}")
@POST
Author
Owner

un @DELETE et pas de /delete

un `@DELETE` et pas de `/delete`
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +1,80 @@
package org.la.banquise.intra
Author
Owner

Exactement les memes retours que dans le fichier jdmi

Exactement les memes retours que dans le fichier jdmi
thomas.le-magoariec marked this conversation as resolved
@ -1,5 +1,6 @@
package org.la.banquise.intra.common.models
import jakarta.enterprise.context.ApplicationScoped
Author
Owner

C'est un import pas utilise, a remove

C'est un import pas utilise, a remove
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +29,4 @@
api(project(":common"))
implementation("io.quarkus:quarkus-kotlin")
// implementation("io.quarkus:quarkus-oidc")
// implementation("io.quarkus:quarkus-security-jpa")
Author
Owner

Tu peux enlever ces deux la

Tu peux enlever ces deux la
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +17,4 @@
private val siteRepository: SiteRepository
) {
fun getById(id: Int): GetJdmiResponse {
val jdmi: JdmiModel = jdmiRepository.findById(id) ?: return GetJdmiResponse()
Author
Owner

Theoriquement ici, on va vouloir avec une erreur, un 404 ou une connerie dans le genre, faudrait que j'essaye de faire de la gestion d'erreur un de ces 4, je prefere limite qu'il me pete a la gueule une 500 que de recevoir un objet avec rien dedans. Au pire on le passe en nullable et tu renvoies un null et c'est "moins" pire

Theoriquement ici, on va vouloir avec une erreur, un 404 ou une connerie dans le genre, faudrait que j'essaye de faire de la gestion d'erreur un de ces 4, je prefere limite qu'il me pete a la gueule une 500 que de recevoir un objet avec rien dedans. Au pire on le passe en nullable et tu renvoies un null et c'est "moins" pire
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +31,4 @@
fun getBySite(site: SiteModel): List<GetJdmiResponse> {
val jdmis: List<JdmiModel> = jdmiRepository.findBySite(site)
var jdmisReponse: MutableList<GetJdmiResponse> = ArrayList()
Author
Owner

pas de var, c'est ce qu'il y a a l'interieur de la liste qui change pas la liste en elle meme. Utilise un var sur une liste si tu changes l'objet reel genre jdmisResponse = listOf(sasnjkcasn). En plus de ca privilegie l'utilisation du kotlin reel et pas du java, avec mutableListOf()

pas de var, c'est ce qu'il y a a l'interieur de la liste qui change pas la liste en elle meme. Utilise un var sur une liste si tu changes l'objet reel genre `jdmisResponse = listOf(sasnjkcasn)`. En plus de ca privilegie l'utilisation du kotlin reel et pas du java, avec `mutableListOf()`
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +55,4 @@
fun createJdmi(params: CreateJdmiRequest): Int {
val site: SiteModel? = siteRepository.findById(params.site) //?: return -1
var jdmi = JdmiModel().apply {
Author
Owner

pas de var

pas de var
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +70,4 @@
}
@Transactional
fun updateJdmi(id: Int, params: UpdateJdmiRequest): Int {
Author
Owner

Au futur, on retournera pas des int dans ces cas la, soit ca passe et tout va bien, soit on va throw qqch

Au futur, on retournera pas des int dans ces cas la, soit ca passe et tout va bien, soit on va throw qqch
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +75,4 @@
val jdmi = jdmiRepository.findById(id) ?: return 404
if (params.site != null) {
val site = siteRepository.findById(params.site!!)
Author
Owner

T'utilise jamais ton site la, ca sert a quoi ?

T'utilise jamais ton site la, ca sert a quoi ?

c'est une bonne question

c'est une bonne question
Author
Owner

C'est quoi la questio ?

C'est quoi la questio ?
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +14,4 @@
private val siteRepository: SiteRepository
) {
fun getById(id: Int): GetSiteResponse {
val site: SiteModel = siteRepository.findById(id) ?: return GetSiteResponse()
Author
Owner

Pareil, pas de return d'objet vide, soit on explose soit on throw

Pareil, pas de return d'objet vide, soit on explose soit on throw
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +16,4 @@
fun getById(id: Int): GetSiteResponse {
val site: SiteModel = siteRepository.findById(id) ?: return GetSiteResponse()
if (site == null) {
Author
Owner

Pas utile ici les debug

Pas utile ici les debug
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +54,4 @@
)
}
fun getAllSites(): List<SiteModel> = siteRepository.getAll()
Author
Owner

la methode listAll existe pour faire ca directement

la methode `listAll` existe pour faire ca directement
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +8,4 @@
@ApplicationScoped
class JdmiRepository : PanacheRepository<JdmiModel> {
fun findById(id: Int): JdmiModel? {
Author
Owner

findById existe deja (mais prends un Long, vu que c'est le type de base de ton @id

findById existe deja (mais prends un Long, vu que c'est le type de base de ton @id
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +13,4 @@
}
fun findBySite(site: SiteModel): List<JdmiModel> {
return find("site_id", site).list()
Author
Owner

enleve la partie .list et mets juste une list() a la place du find

enleve la partie .list et mets juste une list() a la place du find
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +16,4 @@
return find("site_id", site).list()
}
fun getAll(): List<JdmiModel> = findAll().list()
Author
Owner

listall

listall
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +6,4 @@
@ApplicationScoped
class SiteRepository : PanacheRepository<SiteModel> {
fun findById(id: Int): SiteModel? {
Author
Owner

findbyid existe deja avec un Long

findbyid existe deja avec un Long

?

?
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +18,4 @@
return find("name", name).firstResult()
}
fun getAll(): List<SiteModel> = findAll().list()
Author
Owner

listall

listall
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +4,4 @@
import java.time.LocalDateTime
data class CreateJdmiRequest (
var site: Int = 0,
Author
Owner

Encore un truc qu'on verra peut etre plus tard, mais tu veux pas forcement mettre des valeurs par defaut mais plutot de la verification que t'as tous les champs, ici tu fais le cas contraire, si un champ existe pas ca renvoie quand meme comme si c'etait une bonne requete

Encore un truc qu'on verra peut etre plus tard, mais tu veux pas forcement mettre des valeurs par defaut mais plutot de la verification que t'as tous les champs, ici tu fais le cas contraire, si un champ existe pas ca renvoie quand meme comme si c'etait une bonne requete
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +1,11 @@
package org.la.banquise.intra.jdmi.rest.request
data class CreateSiteRequest(
var name: String = "",
Author
Owner

same

same
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +4,4 @@
import java.time.LocalDateTime
data class GetJdmiResponse (
var id: Int = 0,
Author
Owner

same

same
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +1,7 @@
package org.la.banquise.intra.jdmi.rest.response
data class GetSiteResponse(
var id: Int = 0,
Author
Owner

same

same
thomas.le-magoariec marked this conversation as resolved
Author
Owner

En general dans les resource, je prefere qu'on specifie le type de retour reel plutot que Response, l'objet direct, sinon l'openapi genere y'a rien dans la response. A part ca dans les resource y'a quelques trucs a fix en plus de ce que je t'ai remonte (surtout sur les actions post, ce qui est renvoye dedans). Y'a d'autres trucs qu'il faut que je mette en place pour d'autre retours, du style les mapper donc c'est pas grave pour cette partie.

Le kls_database.db faut le mettre dans le gitignore il va nous rendre fous sinon

En general dans les resource, je prefere qu'on specifie le type de retour reel plutot que Response, l'objet direct, sinon l'openapi genere y'a rien dans la response. A part ca dans les resource y'a quelques trucs a fix en plus de ce que je t'ai remonte (surtout sur les actions post, ce qui est renvoye dedans). Y'a d'autres trucs qu'il faut que je mette en place pour d'autre retours, du style les mapper donc c'est pas grave pour cette partie. Le kls_database.db faut le mettre dans le gitignore il va nous rendre fous sinon
@ -0,0 +1,7 @@
package org.la.banquise.intra.jdmi.rest.response
data class GetSiteResponse(
Author
Owner

@RegisterForReflection sur tes reponses (pour le build natif)

Edit:
mets les aussi dans les request, just to be sure

@RegisterForReflection sur tes reponses (pour le build natif) Edit: mets les aussi dans les request, just to be sure
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +93,4 @@
fun deleteJdmi(id: Int): Int {
val jdmi = jdmiRepository.findById(id) ?: return 404
jdmiRepository.delete(jdmi)
Author
Owner

On va plutot venir les "soft delete", ca evite les fausses manip (on a une colonne deleted_at qui est a null de base et si deleted on la mets a l'heure du delete)

On va plutot venir les "soft delete", ca evite les fausses manip (on a une colonne deleted_at qui est a null de base et si deleted on la mets a l'heure du delete)

flemme de fix je le ferai plus tard

flemme de fix je le ferai plus tard
thomas.le-magoariec marked this conversation as resolved
malopieds left a comment
Author
Owner

Tes tests ont pas l'air de passer:

    java.lang.NullPointerException at JdmiResourceTest.kt:171```
Tes tests ont pas l'air de passer: ```JdmiResourceTest > testUpdate1Field() FAILED java.lang.NullPointerException at JdmiResourceTest.kt:171```
@ -0,0 +31,4 @@
}
@GET
fun getBySite(@QueryParam("site") site: Int): Response {
Author
Owner

Ici c'est un getAll en soit, avec un filtre par site. Donc la fonctonn c'est getAll et ton site c'est un nullable. T'as pas d'endpoints pour tous les avoir sinon.

Ici c'est un getAll en soit, avec un filtre par site. Donc la fonctonn c'est getAll et ton site c'est un nullable. T'as pas d'endpoints pour tous les avoir sinon.
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +32,4 @@
@GET
@Produces(MediaType.APPLICATION_JSON)
fun getBy(@QueryParam("name") name: String?, @QueryParam(value = "address") address: String?): Response {
if (address != null) {
Author
Owner

Passe le tout dans le service et fait tes checks la bas. Tu peux utiliser une syntaxe kotlin avec name?.let { tontrucici }. Pareil ici appelle ta fonction getAll

Passe le tout dans le service et fait tes checks la bas. Tu peux utiliser une syntaxe kotlin avec `name?.let { tontrucici }`. Pareil ici appelle ta fonction getAll
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +53,4 @@
}
fun getAllJdmi(): List<JdmiModel> {
return jdmiRepository.getAll()
Author
Owner

juste listAll ici 😭

juste listAll ici 😭
thomas.le-magoariec marked this conversation as resolved
@ -0,0 +12,4 @@
return list("site", site)
}
fun getAll(): List<JdmiModel> = listAll()
Author
Owner

useless en soit

useless en soit
thomas.le-magoariec marked this conversation as resolved
malopieds merged commit 4c86e15d7e into master 2026-03-05 18:34:45 +01:00
malopieds deleted branch 6-jdmi 2026-03-05 18:34:45 +01:00
malopieds referenced this pull request from a commit 2026-03-05 18:34:46 +01:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
banquise/intra-back!12
No description provided.