Skip to content

Add Ktor Client - #5

Merged
Ziedelth merged 2 commits into
masterfrom
feat/ktor-client
Aug 10, 2026
Merged

Add Ktor Client#5
Ziedelth merged 2 commits into
masterfrom
feat/ktor-client

Conversation

@Ziedelth

@Ziedelth Ziedelth commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

No description provided.

@Ziedelth Ziedelth left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 → viole guidelines/KOTLIN_CONVENTIONS.md (« Add KDoc comments to all public framework classes, interfaces, annotations, and functions ») et AGENTS.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 a ktor/src/test/kotlin/ + conventions TESTING.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 via api. Cohérent avec le serveur (api(ktorServerEcosystem)), mais peut-être à restreindre (implementation) pour une partie.
  • Portée module : ARCHITECTURE.md décrit ktor comme « 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=true en production côté client : accepte du JSON relâché ; à confirmer comme choix.
  • Saut de ligne final manquant dans Client.kt et ktor/build.gradle.kts (aucun linter configuré pour trancher).
  • Compatibilité wire : encodeDefaults=true + explicitNulls=false cô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 =

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 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) {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 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).

Comment thread ktor/src/main/kotlin/Client.kt Outdated
encodeDefaults = true
ignoreUnknownKeys = true
isLenient = true
explicitNulls = false

@Ziedelth Ziedelth Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 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.

@Ziedelth

Ziedelth commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

Points tranchés suite à ta revue (intégrés dans les guidelines, PR #6) :

  • api(...) est voulu : le framework partage ses dépendances avec les services consommateurs, plus seulement implementation.
  • Portée module : le module ktor couvre Ktor server + client, pas seulement serveur.

Restent valides (à corriger) :

  • 🔴 Client.kt:16 — KDoc manquant sur createHttpClient() (guidelines KOTLIN_CONVENTIONS.md).
  • 🔴 Client.kt:24/:29 — config de sérialisation dupliquée et divergente du serveur + désalignement wire (explicitNulls=false).

👉 Suggestions : KDoc + factoriser une config de sérialisation partagée (une seule source de vérité réutilisée par Modules.kt et ce client).

@Ziedelth
Ziedelth merged commit 0eedac3 into master Aug 10, 2026
2 checks passed
@Ziedelth
Ziedelth deleted the feat/ktor-client branch August 10, 2026 07:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant