Add Ktor Client - #5
Conversation
Ziedelth
left a comment
There was a problem hiding this comment.
Review Hermes — PR #5 « Add Ktor Client »
Verdict : Commentaire — 1 violation de guideline, 1 point qualité. ⚙️ Code compilé avec succès (:ktor:compileTestKotlin BUILD SUCCESSFUL, 3 sous-agents indépendants).
🔴 Guidelines
- ktor/src/main/kotlin/Client.kt:16 — Fonction publique
createHttpClient()sans KDoc → violeguidelines/KOTLIN_CONVENTIONS.md(« Add KDoc comments to all public framework classes, interfaces, annotations, and functions ») etAGENTS.md. Le module applique déjà cette convention (cf.Modules.kt).
🟠 Qualité / maintenabilité
- ktor/src/main/kotlin/Client.kt:24 — Config de sérialisation dupliquée et divergente du serveur. Le framework fournit déjà
configureContentNegotiation()(Modules.kt:28,json()/protobuf()/cbor()par défaut) ; ici elle est ré-implémentée avec des options différentes (encodeDefaults=true,explicitNulls=false,isLenient=true,ignoreUnknownKeys=true). → Conflit DRY + « reuse existing project patterns » (CODE_STYLE.md), et risque de désalignement wire client↔serveur.
⚠️ Points incertains / à clarifier (à définir ensemble)
- Tests : aucun test ajouté pour
createHttpClient()alors que le module aktor/src/test/kotlin/+ conventionsTESTING.md. À confirmer si tout API publique du framework exige un test. api(libs.bundles.ktorClientEcosystem)(ktor/build.gradle.kts) : expose tout le bundle (moteur OkHttp + 3 sérialisations) aux consommateurs viaapi. Cohérent avec le serveur (api(ktorServerEcosystem)), mais peut-être à restreindre (implementation) pour une partie.- Portée module :
ARCHITECTURE.mddécritktorcomme « Ktor Server » ; ajout d'un client. Voulu dans ce module, ou futur module dédié ? - Fonction top-level
createHttpClient()vs objet/factory (les patterns existants utilisent objets/KDoc, ex.ControllerBinder). isLenient=trueen production côté client : accepte du JSON relâché ; à confirmer comme choix.- Saut de ligne final manquant dans
Client.ktetktor/build.gradle.kts(aucun linter configuré pour trancher). - Compatibilité wire :
encodeDefaults=true+explicitNulls=falsecôté client vs défauts côté serveur → vérifier un round-trip réel Json/CBOR/ProtoBuf.
Révisé par Hermes (2 sous-agents guidelines/structure + 1 correctness/tests + compilation).
| import kotlinx.serialization.protobuf.ProtoBuf | ||
|
|
||
| @OptIn(ExperimentalSerializationApi::class) | ||
| fun createHttpClient(): HttpClient = |
There was a problem hiding this comment.
🔴 Guidelines : createHttpClient() est une fonction publique du framework sans KDoc → viole guidelines/KOTLIN_CONVENTIONS.md (« Add KDoc comments to all public framework classes, interfaces, annotations, and functions ») et AGENTS.md. Ajouter un KDoc documentant la config (timeouts, sérialisation) et le contrat.
| socketTimeoutMillis = 30_000 | ||
| } | ||
|
|
||
| install(ContentNegotiation) { |
There was a problem hiding this comment.
🟠 Maintenabilité : config de sérialisation dupliquée et divergente du serveur — Modules.kt:28 configureContentNegotiation() utilise json()/protobuf()/cbor() par défaut. Factoriser/réutiliser plutôt que dupliquer (DRY) ; risque de désalignement de wire client↔serveur (encodeDefaults/explicitNulls différents).
| encodeDefaults = true | ||
| ignoreUnknownKeys = true | ||
| isLenient = true | ||
| explicitNulls = false |
There was a problem hiding this comment.
🔴 Correctness (wire) — précisé par le sous-agent #3 : explicitNulls = false côté client fait que les champs nullables (sans valeur par défaut) sont omis à l'encodage, alors que le serveur de référence (Modules.kt -> configureContentNegotiation, json() par défaut) est strict -> un champ nullable null encodé par ce client sera refusé par le serveur (MissingFieldException). Désalignement asymétrique client<->serveur réel. Le plus sûr : une config de sérialisation partagée (une seule source de vérité, réutilisée par Modules.kt et ce client), ou des champs nullables avec valeur par défaut.
|
Points tranchés suite à ta revue (intégrés dans les guidelines, PR #6) :
Restent valides (à corriger) :
👉 Suggestions : KDoc + factoriser une config de sérialisation partagée (une seule source de vérité réutilisée par |
35e8f89 to
01909d2
Compare
01909d2 to
9bd4ff2
Compare
No description provided.