une application mettant en œuvre une prise de contact entre un demandeur de services et son éventuel prestataire associé.
  • C# 41%
  • JavaScript 31.1%
  • HTML 10.4%
  • SCSS 6.1%
  • Less 5%
  • Other 6.3%
Find a file
Paul Schneider 6e7e04141b
feat(api-client): add UserSearchClient for /api/user-search
Adds the client-side half of the user-search endpoint landed
on the server in b3056f1c (commit 6 on this branch). The
client mirrors the server's filter contract:

- query: substring match on FullName or UserName
- email: exact match on Email
- take: 1..100, default 25

Empty (query + email) short-circuits to an empty list
client-side rather than letting the server return the first
`take` users alphabetically — the address-book UX is
"type to search", not "show me a directory".

The DTO (Yavsc.Api.Client.Dtos.UserSearchResultDto) is a flat
shape (Id, UserName, FullName, Avatar, Email) with no
navigation properties; field names match the JSON the server
emits so deserialisation is a no-op.

PostIt wiring:
- App.axaml.cs constructs a UserSearchClient singleton and
  registers it alongside CircleApiClient and BlogAclApiClient.
- The PostIt.csproj ProjectReference to Yavsc.Api.Client was
  in place before this commit on feat/postit-acl; the rebase
  of feat/app-invite on top of feat/postit-acl dropped it.
  This commit re-adds it.
2026-08-18 00:34:29 +01:00
.forgejo/workflows ci(forgejo): put asset name in URL query string, not as curl arg 2026-08-18 00:31:25 +01:00
.github fix(ci): fix validate-release CHANGELOG channel check to inspect heading line 2026-08-18 00:31:23 +01:00
.vscode Le créateur vient de l'authentification, donc on ne le prend pas du post 2026-08-02 23:02:54 +01:00
assets allow_failure: true 2021-06-07 01:33:04 +01:00
contrib WIP audiences 2026-07-12 02:42:13 +01:00
doc Blog: add test guarding the display-template fix + document test architecture 2026-07-11 19:59:03 +01:00
external dotnet-android-build-image: pin to <sha-ou-tag> 2026-08-16 12:49:50 +01:00
src feat(api-client): add UserSearchClient for /api/user-search 2026-08-18 00:34:29 +01:00
.dockerignore could fix the CI 2026-07-06 01:06:50 +01:00
.editorconfig refact 2026-06-20 19:51:22 +01:00
.env.sample do not override appsettings-*.*.json 2026-06-19 16:18:39 +01:00
.eslintrc.json cs requires uname 2017-03-17 22:42:50 +01:00
.gitattributes a default attr set from GitHub 2017-07-12 12:12:39 +02:00
.gitignore Tests: route Yavsc.Org test host through Testing environment 2026-07-11 20:50:39 +01:00
.gitmodules submodule: switch URL from SSH to HTTPS for forgejo anonymous access 2026-08-16 13:26:12 +01:00
.jshintrc initial 2019-09-08 01:36:45 +01:00
CHANGELOG.md chore(release): update 1.0.6 CHANGELOG section (image v2, jq fix) 2026-08-18 00:31:25 +01:00
CONTRIBUTING.md contributing+roadmap: document smoke tests per BC, tick off Jalon 0 2026-06-27 21:04:26 +01:00
Directory.Build.props Activity protection 2026-08-10 18:12:59 +01:00
Directory.Packages.props Revert "repoduces the bug" 2026-07-11 22:17:58 +01:00
docker-compose.yaml docker-compose: explicit source/target mapping for build secrets 2026-06-27 18:25:26 +01:00
Dockerfile dockerfile: drop inline 'dotnet nuget add source isn.pschneider.fr' 2026-08-16 14:10:10 +01:00
Dockerfile.backend dockerfile: drop inline 'dotnet nuget add source isn.pschneider.fr' 2026-08-16 14:10:10 +01:00
dotnet-tools.json a scoring model 2026-05-24 19:35:35 +01:00
esbuild.config.mjs refac: load jQuery + Bootstrap as global scripts in _Layout 2026-06-14 15:16:16 +01:00
INSTALL.md docs: add npm install + build:js to install procedure 2026-06-14 14:11:59 +01:00
LICENSE Licence WTFPL 2025-02-24 21:26:21 +00:00
Makefile Identity reloaded 2026-07-05 23:56:10 +01:00
NuGet.config nuget: add NuGet.config pointing at isn.pschneider.fr 2026-08-16 13:35:44 +01:00
package.json refac: separate front assets into esbuild bundles 2026-06-14 14:11:33 +01:00
README.md migration 2026-07-06 03:17:23 +01:00
ROADMAP.md contributing+roadmap: document smoke tests per BC, tick off Jalon 0 2026-06-27 21:04:26 +01:00
SECURITY.md Create SECURITY.md 2026-06-27 18:28:42 +01:00
yavsc.sln feat(tests): scaffold Yavsc.Blogs.Tests with BlogsWebServerFixture 2026-07-06 21:49:53 +01:00

Yavsc

C'est une application mettant en oeuvre une prise de contact entre un demandeur de services et son éventuel prestataire associé.

Statut actuel des actions GitHub

  • Build and Push Yavsc Apk

  • Build and Push Yavsc Production Image

  • CodeQL Advanced

Documentation

L'architecture, la roadmap et les détails métier sont documentés sous doc/. Voir l'index de la documentation pour le sommaire complet. La racine de l'architecture est Architecture.md.

Construction et déploiement

Construction

 dotnet build

et, pour execution en environment de développement

~/workspace/yavsc/Yavsc @ ASPNETCORE_ENV=Development dotnet run

Tests

Utilisez GNU/Makefile (et visitez le code, dans le dossier test ):

[TODO] Depuis le répertoire racine:

make test

Installation / Déploiement / Développement

les services et l'API

La Prod

cd srv/Yavsc : make pushInProd CONFIGURATION=Release.

puis, pour une première installation make install_service.

Fonctionnalités (encore en cours de développement)

Elle est censée aboutir à une prise commande, un payement du client, à une collecte du retour du client, et à un paiement du prestataire de services.

Elle comprendra une gestion des litiges.

Elle expose une messagerie instantanée, disponible depuis un navigateur Web ou depuis lapplication mobile, pouvant garantir la preservation du secret sur toute information personnelle, du client comme du prestataire.

Le client et le prestataire sont dès l'inscription formellement identifiés par l'application : ils sont authentifiés sur la base d'un compte nominatif, et ce n'est qu'au moment de leur premier acte de facturation qu'une vérification renforcée est déclenchée (KYC light côté client, validation du profil professionnel côté prestataire).

Plus précisément :

  • pour le client, lors de la validation d'une commande facturée (de prestation à un prestataire, ou autre).
  • pour le prestataire, lors de la validation de son profil professionnel, qui implique lacquittement de son adhésion forfaitaire.

La séquence logique (et simplifiable) d'une prestation canonique (sans annulation ni reclamation) est la suivante :

  1. Une commande intervient auprès d'un prestataire, elle est chiffrée et le paiement est provisionné par PayPal, non collecté.
  2. Notifié, le prestataire valide un devis, avec arrhes ou avance. il signe son devis, qui peu contenir des documents attachés à faire signer par le client, un ou des contrats, stockés au format Markdown par le prestataire dans ses contrats à faire signer.
  3. à son tour, le client est notifié et signe le devis aussi
  4. Les arrhes ou avances sont débitées sur le champ
  5. 10 jours avant la date de la prestation le reste du paiement est collecté

Dans le cas des arrhes, à tout moment, jusqu'avant la date et l'heure de la prestation, le client ou le prestataire peuvent annuler:

  • Le prestataire peut le faire, en rendant les arrhes majorées de 20%
  • Le client peut le faire, en perdant les arrhes.
  • Le prestataire peut déléguer à une équipe de son choix un filtrage des demandes des clients.

Limitations

  • Aujourd'hui : une prestation par commande, sur un axe client → prestataire unique, sans sous-traitance. Cible roadmap : montages multi-parties (plusieurs clients et/ou plusieurs fournisseurs collaborant autour d'un même projet, avec sous-traitance validée par le client) — voir la ROADMAP.
  • Annulation : partielle et non testée. Côté client, HairCutCommandController.ClientCancel / ClientCancelConfirm supprime la commande sans déclencher de refund PayPal ni logique arrhes vs avance ; aucune action d'annulation côté prestataire. La description du README (arrhes +20%, avance non-annulable) n'est pas implémentée. Cible : câbler RefundTransaction et le workflow complet, voir ROADMAP.
  • Réclamation post-prestation : aucun support applicatif. Passée la date de la prestation, le client n'a aucun chemin dans l'UI pour signaler un litige — aucune route, aucun contrôleur, aucun modèle. La fonctionnalité de conciliation est planifiée au Jalon 5 (cf. doc/ddd-exploration-2026-06-14.md) : double vue client/prestataire, dossier de conciliation, décision. En attendant, tout passe par e-mail au propriétaire de l'installation.
  • Paiement : PayPal uniquement, via l'API NVP/SOAP. Aucun autre PSP n'est intégré (pas de Stripe, pas d'Adyen). L'API NVP/SOAP que PayPal a dépréciée au profit de REST reste fonctionnelle mais n'est plus recommandée par PayPal ; aucune migration n'est planifiée à court terme.
  • Périmètre métier étroit. Pas de saisie de structures de projets complexes ; pas de ticketing associé à la prestation.
  • Collecte centralisée. Tous les paiements PayPal transitent par le compte du propriétaire de l'installation — c'est le seul identifiant configuré côté PSP. Les professionnels apparaissent comme tierces parties du point de vue PayPal.
  • Pas de gestion de paie. Aucune édition de fiche de paye, ni paiement en masse. Seuls les paiements unitaires sus-cités sont supportés.

Paramétrage

Fichiers de configuration d'Yavsc.Org

Le paramétrage runtime d'Yavsc.Org se fait via appsettings-org.json, lu par ASP.NET Core selon la convention standard (appsettings.<ASPNETCORE_ENVIRONMENT>.json est fusionné par-dessus). Trois fichiers coexistent dans src/Yavsc.Org/, avec trois rôles distincts :

Fichier Rôle Commité ?
appsettings-org.json Modèle. Valeurs anonymisées ([Your domaine name], [YOURSMTPHOST], …). Sert de référence. Oui
appsettings-org.Development.json Surcharge locale pour ASPNETCORE_ENVIRONMENT=Development. Concrètement, Site.Authority et Site.ExternalUrl pointent sur https://localhost:5001, Site.Title/Slogan sont adaptés, et la ConnectionStrings.YavscConnection est fournie. Ignoré par .gitignore (appsettings-*.*.json) : chaque développeur crée le sien à partir de ce qui est documenté ici et du modèle appsettings-org.json. Non
appsettings-org-dist.json Généré par la cible copy-binaries du contrib/Makefile (alias make reinstall) à partir d'appsettings-org.json lors du déploiement, puis copié dans $(BASEAPPDIR). C'est un clone du modèle, juste renommé pour signaler « à éditer ». Non

Première installation sur un serveur :

make install_service        # construit, déploie, active systemd
cd $BASEAPPDIR              # voir contrib/.env
ls appsettings-org*.json    # -> appsettings-org-dist.json (le modèle, jamais éditer celui-là)
cp appsettings-org-dist.json appsettings-org.json
$EDITOR appsettings-org.json

Le Makefile renomme appsettings-org.json en appsettings-org-dist.json juste avant le cp -a vers $(BASEAPPDIR), et supprime la version appsettings-org.json du publish dir. Conséquence : un make reinstall ultérieur n'écrasera jamais ton appsettings-org.json édité — il recopiera un appsettings-org-dist.json neuf par-dessus, sans supprimer ton édition. Si tu veux repartir d'un modèle vierge, supprime d'abord appsettings-org.json du serveur ; sinon, laisse-le en place.

Valeurs minimales à renseigner pour un serveur de production :

  • Site.Authority — issuer OIDC visible de l'extérieur (URL exacte sous laquelle /.well-known/openid-configuration est servi, par exemple https://yavsc.pschneider.fr). C'est la valeur que PostIt et toutes les autres applications clientes passent dans Authority.
  • Site.ExternalUrl — URL canonique du serveur, utilisée pour générer les liens absolus dans les e-mails, construire les RedirectUris des clients OIDC tiers, etc. Depuis la migration PKCE de PostIt, le seed EF Core d'IdentityServer utilise Site.ExternalUrl pour autoriser une RedirectUri du client postit : cela permet à PostIt d'être lancé depuis une page web de Yavsc.Org (iframe launcher) sans rejet redirect_uri mismatch de l'OP.
  • ConnectionStrings.YavscConnection — chaîne de connexion PostgreSQL (utilisateur, mot de passe, hôte, base). Privilégier dotnet user-secrets ou des variables d'environnement ASPNETCORE_* plutôt qu'un mot de passe en clair dans le fichier.
  • Au démarrage, Yavsc.Org applique automatiquement ses migrations EF Core. Sur cette base de code, EF Core 10 peut encore lever un PendingModelChangesWarning malgré des migrations et snapshots déjà alignés ; ce faux positif est ignoré sur les contextes PostgreSQL pour éviter un démarrage inutilement en mode dégradé. Si une erreur de migration apparaît encore en production, elle doit être traitée comme une vraie divergence de schéma ou de connexion.
  • Smtp.* — hôte, port, identifiants SMTP pour l'envoi d'e-mails transactionnels.
  • Authentication.PayPal.* et Authentication.Google.* — clés d'API pour les fournisseurs d'identité externes utilisés dans les flows OAuth/OIDC.

Administration

Une fois le service disponible, s'enregistrer, et Visiter l'url /Administration/Take

Une nouvelle activité

On gère les activité en faisant partie du groupe des commerciaux (FrontOffice), on crée des activités en y associant des formulaires de commande et une classe de paramétrage de profiles professionnels.

Développement

Un nouvel environnement d'execution

L'impact de l'usage d'un nouveau nom denvironnement d'execution, à l'heure de cet écrit, ressemble à ceci:

  • Ajustement des listes denvironnements cités dans les pages:
    • ~/Views/Shared/_Layout.cshtml
    • ~/Views/Shared/_ValidationScriptsPartial.cshtml
    • ~/Views/Home/Index.cshtml
    • ~/Views/Home/About.cshtml

Remerciements

Photo de Dewang Guptasur Unsplash