Skip to content

Repository files navigation

Doshwork

Plateforme personnelle de gestion du patrimoine : portfolio, comptes bancaires (Open Banking), marchés live, dashboard consolidé — le tout en monorepo NestJS + Next.js.

Ce dépôt contient le socle du projet Doshwork. Il est structuré en monorepo : une API NestJS et un frontend Next.js cohabitent dans le dossier apps/.


Sommaire

  1. Stack
  2. Prérequis
  3. Structure du monorepo
  4. Démarrage local
  5. Scripts disponibles
  6. Conventions de nommage
  7. Workflow contributeur (git & stories)
  8. Déploiement production (Coolify)
  9. Notes d'avancement

Stack

Couche Technologie Version
Package manager Bun 1.3+
Runtime Node Node.js (via .nvmrc) 22 LTS
API NestJS 10.4
ORM Prisma 7
Base PostgreSQL 16
Frontend Next.js (App Router) 16.2
UI React 19.2
Styling TailwindCSS + shadcn/ui 3.x / latest
Langage TypeScript strict 5.x

Les versions sont figées dans les package.json de chaque app (^10.4, ^7, ^16.2, ^19.2) afin de garantir la parité dev/prod (NFR24).

⚠️ Pourquoi Node 22 ET Bun ? Bun est le package manager et le runner de scripts. Mais NestJS, Next.js et Prisma utilisent leur propre runtime Node (node:22-alpine en prod). Le .nvmrc garantit cette version côté dev, Bun reste le point d'entrée unique des commandes. Tous les outils cohabitent proprement.


Prérequis

  • Bun ≥ 1.3 (installation : curl -fsSL https://bun.com/install | bash ou brew install oven-sh/bun/bun)
  • Node.js 22 LTS (voir .nvmrc ; nvm use pour basculer)
  • Docker (requis à partir de la Story 1.3 pour Postgres local)
  • Un éditeur respectant .editorconfig et .prettierrc

ℹ️ Les Dockerfiles et docker compose up ne sont pas encore opérationnels à ce stade (Story 1.1). Ils sont livrés en Story 1.2 (Dockerfiles multi-stage) puis Story 1.3 (compose dev). Pour l'instant, démarrage via bun run start:dev / bun run dev (voir plus bas).

📌 Règle projet : utilise exclusivement Bun. Pas de npm, yarn ou pnpm. Voir AGENTS.md pour les détails (règle appliquée par tous les agents IA sur ce repo).


Structure du monorepo

DOSHWORK/
├── .github/
│   └── workflows/          # CI GitHub Actions (rempli en Stories 1.11 & 10.4)
├── apps/
│   ├── api/                # API NestJS 10.4 (+ Prisma 7)
│   │   ├── prisma/
│   │   │   └── schema.prisma
│   │   ├── src/
│   │   │   ├── app.controller.ts
│   │   │   ├── app.module.ts
│   │   │   ├── app.service.ts
│   │   │   └── main.ts
│   │   ├── .env.example
│   │   ├── .dockerignore
│   │   ├── .eslintrc.js
│   │   ├── package.json
│   │   └── tsconfig.json
│   └── web/                # Frontend Next.js 16.2
│       ├── public/
│       ├── src/
│       │   ├── app/        # App Router : layout.tsx, page.tsx, globals.css
│       │   ├── components/
│       │   │   ├── atoms/
│       │   │   ├── molecules/
│       │   │   ├── organisms/
│       │   │   ├── layouts/
│       │   │   └── ui/     # composants shadcn/ui (générés à la demande)
│       │   ├── hooks/
│       │   ├── lib/        # api.ts (fetch wrapper), utils.ts (cn())
│       │   └── types/
│       ├── .env.example
│       ├── .dockerignore
│       ├── eslint.config.mjs   # ESLint 9 flat config
│       ├── components.json # shadcn/ui
│       ├── next.config.js
│       ├── package.json
│       ├── tailwind.config.ts
│       └── tsconfig.json
├── docker-compose.yml       # Placeholder — rempli en Story 1.3
├── docker-compose.prod.yml  # Placeholder — rempli en Story 10.1
├── .editorconfig
├── .gitignore
├── .nvmrc                   # Node 22
├── .prettierrc
├── bun.lock                 # Lockfile Bun unique (workspace)
├── package.json             # Workspace Bun racine (workspaces: ["apps/*"])
└── README.md

Cette structure suit strictement DCT §3 (Structure du Projet).

Écarts volontaires (différés à une story ultérieure) :

  • Les modules métier NestJS (auth, users, assets, lots, bank, market, mailer, common, prisma) ne sont pas scaffoldés ici : ils arrivent au fil des Epics 2-6.
  • Les route groups (auth)/ et (dashboard)/ ainsi que settings/ et account/ côté web arrivent en Stories 1.7 / 2.12 / 9.x.
  • Les workflows GitHub Actions (CI, déploiement) sont livrés en Stories 1.11 et 10.4.

Démarrage local

# 1. (optionnel mais recommandé) s'aligner sur Node 22
nvm use

# 2. Installation des deux apps via le workspace Bun racine
bun install                       # installe apps/api + apps/web en une passe

# 3. API — backend NestJS
cp apps/api/.env.example apps/api/.env           # ajustez DATABASE_URL
bun --filter @doshwork/api prisma:generate       # génère le client Prisma
bun run api:dev                                  # http://localhost:3001

# 4. Web — frontend Next.js (dans un autre terminal)
cp apps/web/.env.example apps/web/.env.local
bun run web:dev                                  # http://localhost:3000

ℹ️ Le workspace Bun racine (package.json + bun.lock à la racine) permet d'installer les deux apps en une seule passe, avec un lockfile unique qui résout les versions partagées. bun --filter @doshwork/<app> <script> cible une app précise.

  • L'API répond Hello World sur GET http://localhost:3001/.
  • Le frontend affiche une page d'accueil "Doshwork" sur http://localhost:3000.

🐳 À partir de la Story 1.3, la commande docker compose up démarrera automatiquement Postgres + API + Web en mode développement. Pour l'instant, chaque app est lancée manuellement.


Build Docker (avant Story 1.3)

Les deux apps disposent désormais (Story 1.2) d'un Dockerfile multi-stage (depsbuilderdevelopment / production) basé sur node:22-alpine. Le stage deps (invalidé uniquement lorsque package.json ou bun.lock changent) alimente à la fois development (hot-reload via volume bind en Story 1.3) et builder. Le stage builder compile ensuite les artefacts consommés par le stage production.

Les 8 builds à vérifier en local (4 par app) :

# apps/api — NestJS 10.4 + Prisma 7
docker build --target deps        -t doshwork-api:deps        apps/api/
docker build --target builder     -t doshwork-api:builder     apps/api/
docker build --target development -t doshwork-api:dev         apps/api/
docker build --target production  -t doshwork-api:prod        apps/api/

# apps/web — Next.js 16.2 standalone
docker build --target deps        -t doshwork-web:deps        apps/web/
docker build --target builder     -t doshwork-web:builder     apps/web/
docker build --target development -t doshwork-web:dev         apps/web/
docker build --target production  -t doshwork-web:prod        apps/web/

🥟 Bun-en-Docker (obligatoire) : Bun est installé via l'installeur officiel dans chaque stage qui en a besoin, et bunx --bun prisma ... remplace npx prisma .... Justification et règle projet : AGENTS.md §1 et §8.

⚠️ docker compose up n'est pas encore opérationnel : il sera livré en Story 1.3 (ajout du service db Postgres 16 + health checks + volumes). Ces docker build standalones suffisent à ce stade pour valider la parité dev/prod (NFR24).


Scripts disponibles

Toutes les commandes se lancent avec Bun (bun run <script> ou bun <script>).

Racine (workspace)

Script Description
bun install Installe les deux apps via le workspace Bun
bun run api:dev Démarre l'API (raccourci de bun --filter @doshwork/api start:dev)
bun run web:dev Démarre le frontend (raccourci de bun --filter @doshwork/web dev)
bun run lint Lint sur les deux apps (bun --filter '*' lint)
bun run build Build les deux apps
bun run test Tests sur les deux apps

apps/api

Script Description
bun run start Démarre l'API (production-ready local, sans watch)
bun run start:dev Démarre l'API en mode watch (port 3001 par défaut)
bun run start:prod Lance node dist/main (après bun run build)
bun run build Compile TypeScript → dist/
bun run lint ESLint sur src/ et test/
bun run format Prettier sur src/ et test/
bun run test Jest (tests unitaires scaffoldés par @nestjs/cli)
bun run prisma:generate Génère le client Prisma (@prisma/client)
bun run prisma:migrate:dev (futur — Story 1.4) Crée une migration en développement
bun run prisma:migrate:deploy (futur — Story 10.x) Applique les migrations en prod

Pour les commandes Prisma directes (Studio, introspect…), utiliser bunx --bun prisma <cmd>.

apps/web

Script Description
bun run dev Démarre Next.js en dev (Turbopack, port 3000)
bun run build Build production
bun run start Lance le build production (next start)
bun run lint ESLint (config Next.js, flat config)
bun run format Prettier
bun run test Placeholder (suite Playwright E2E livrée Story 10.10)

Conventions de nommage

Le projet applique strictement les conventions définies en DCT §13.

Contexte Convention Exemple
Base de données snake_case investment_lots, bank_transactions
Modèles Prisma PascalCase InvestmentLot, BankAccount
Variables/fonctions TS camelCase investmentLot, fetchAssets()
Composants React PascalCase.tsx AddLotModal.tsx, StatCard.tsx
Hooks React useCamelCase.ts usePortfolio.ts, useMarket.ts
Endpoints REST kebab-case /bank-accounts, /investment-lots
Variables d'env SCREAMING_SNAKE_CASE DATABASE_URL, JWT_SECRET
Fichiers utilitaires camelCase.ts apiFetch.ts, formatCurrency.ts

Ces règles sont vérifiées :

  • côté TypeScript par les configurations ESLint (@typescript-eslint/no-explicit-any: error, règles Next.js) ;
  • côté code par revue lors des code reviews (pas d'automatisation à ce stade).

Workflow contributeur (git & stories)

📘 Référence complète : docs/CONTRIBUTING.mdAGENTS.md

Deux branches permanentes

Branche Rôle Règle
PROD Production. Recoit uniquement des merges depuis DEV. 🛑 Aucun commit direct.
DEV Staging / intégration. Base de toute branche story. 🛑 Aucun commit direct.

🚨 Avant toute implémentation d'une story

git checkout DEV
git pull --rebase origin DEV 2>/dev/null || true
git checkout -b alpha/feat/<story-key>   # format STRICT, voir ci-dessous

Nommage des branches — format strict

<version>/<action>/<nom-descriptif>
  • Pendant alpha (actuel) : alpha/feat/1-2-dockerfiles-multi-stage-…
  • Pendant beta : beta/feat/…
  • Après v1.0 (SemVer) : v1.0.12/feat/Bank-bank-transactions-id-re-categorisation

Types d'action : feat, fix, refactor, perf, docs, test, chore, style, hotfix.

Convention de commit (Conventional Commits en français)

<type>(<scope>): <sujet impératif en français, ≤ 72 car>

<corps expliquant le pourquoi>

Story: <story-key>

À la fin de chaque story — OBLIGATOIRE

  1. Tasks/Subtasks cochées, File List rempli, Completion Notes, Change Log
  2. Status du fichier story passé à review
  3. _bmad-output/implementation-artifacts/sprint-status.yaml mis à jour (<story-key>: review + last_updated)
  4. bun run lint + bun run build + bun run test
  5. Commit final structuré (HEREDOC)
  6. Push de la branche + demande de review

🛑 Oublier la mise à jour de sprint-status.yaml est l'erreur la plus fréquente. ZÉRO TOLÉRANCE.


Déploiement production (Coolify)

La production est déployée depuis la branche PROD sur le VPS via Coolify (webhook GitHub, sans workflow deploy.yml). Procédure complète, smoke tests et rollback : docs/ops/deploy.md.

Secrets et références DB : docs/infra/secrets-management.md · installation Coolify : docs/infra/coolify-setup.md.


Migrations & Seed

Disponible depuis la Story 1.4. Requiert que docker compose up -d db soit démarré.

Appliquer les migrations

cd apps/api
bunx --bun prisma migrate dev --name <nom>   # développement (génère + applique)
bunx --bun prisma migrate deploy             # production (applique seulement)

Lancer le seed admin

# S'assurer que .env contient ADMIN_EMAIL et ADMIN_PASSWORD
cd apps/api
bunx --bun prisma db seed

Le seed est idempotent : une 2ème exécution ne crée pas de doublon (utilise upsert sur l'email).

Variables d'environnement requises pour le seed

# Dans apps/api/.env (non committé — copier depuis .env.example)
ADMIN_EMAIL=admin@doshwork.local
ADMIN_PASSWORD=<votre-mot-de-passe-fort>

Notes d'avancement

Ce README reflète l'état après la Story 1.4 : schéma Prisma initial (User + enums) + migration + seed. Les fonctionnalités métier (auth, portfolio, banking, market, dashboard…) sont livrées Epic par Epic.


Projet : Doshwork · Package manager : Bun 1.3+ · Stack : NestJS 10.4 · Next.js 16.2 · Prisma 7 · PostgreSQL 16

About

No description, website, or topics provided.

Resources

Contributing

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages