feat: Configuration initiale du projet NestJS - Ajout des fichiers de configuration (package.json, tsconfig, eslint, prettier) et de la structure de base
This commit is contained in:
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
node_modules
|
||||||
|
# Keep environment variables out of version control
|
||||||
|
.env
|
||||||
|
|
||||||
|
/generated/prisma
|
||||||
4
.prettierrc
Normal file
4
.prettierrc
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "all"
|
||||||
|
}
|
||||||
187
README.md
Normal file
187
README.md
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
# 🏭 API d'Inventaire Industriel
|
||||||
|
|
||||||
|
API NestJS pour la gestion d'inventaire industriel avec architecture hiérarchique des machines, composants et pièces.
|
||||||
|
|
||||||
|
## 🚀 Installation
|
||||||
|
|
||||||
|
### Prérequis
|
||||||
|
- Node.js 18+
|
||||||
|
- PostgreSQL
|
||||||
|
- Fedora Linux (pour le script d'installation automatique)
|
||||||
|
|
||||||
|
### Configuration rapide
|
||||||
|
|
||||||
|
1. **Installer les dépendances**
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Configurer la base de données PostgreSQL**
|
||||||
|
```bash
|
||||||
|
# Option 1: Installation automatique (Fedora)
|
||||||
|
chmod +x setup-database.sh
|
||||||
|
./setup-database.sh
|
||||||
|
|
||||||
|
# Option 2: Installation manuelle
|
||||||
|
sudo dnf install postgresql postgresql-server postgresql-contrib
|
||||||
|
sudo postgresql-setup --initdb
|
||||||
|
sudo systemctl start postgresql
|
||||||
|
sudo systemctl enable postgresql
|
||||||
|
|
||||||
|
# Créer la base de données
|
||||||
|
sudo -u postgres psql -c "CREATE DATABASE inventory_db;"
|
||||||
|
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'password';"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Générer le client Prisma et appliquer les migrations**
|
||||||
|
```bash
|
||||||
|
npx prisma generate
|
||||||
|
npx prisma migrate dev --name init
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Démarrer l'API**
|
||||||
|
```bash
|
||||||
|
npm run start:dev
|
||||||
|
```
|
||||||
|
|
||||||
|
L'API sera disponible sur `http://localhost:3000/api`
|
||||||
|
|
||||||
|
## 📊 Structure de la base de données
|
||||||
|
|
||||||
|
### Entités principales
|
||||||
|
- **Site** : Représente un site/usine
|
||||||
|
- **Machine** : Appartient à un site, peut contenir des composants et des pièces
|
||||||
|
- **Composant** : Peut appartenir à une machine ou à un autre composant (arborescence infinie)
|
||||||
|
- **Piece** : Peut appartenir à une machine ou à un composant
|
||||||
|
- **TypeMachine/TypeComposant/TypePiece** : Définissent l'architecture et les champs personnalisés
|
||||||
|
- **Document** : Fichiers/images liés aux éléments
|
||||||
|
- **CustomField/CustomFieldValue** : Champs personnalisés dynamiques
|
||||||
|
|
||||||
|
### Relations
|
||||||
|
```
|
||||||
|
Site → Machine → Composant → Sous-composant → ...
|
||||||
|
↓ ↓
|
||||||
|
Machine → Piece
|
||||||
|
Composant → Piece
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔌 API Endpoints
|
||||||
|
|
||||||
|
### Sites
|
||||||
|
- `GET /api/sites` - Liste tous les sites avec leur hiérarchie complète
|
||||||
|
- `GET /api/sites/:id` - Détails d'un site
|
||||||
|
- `POST /api/sites` - Créer un site
|
||||||
|
- `PATCH /api/sites/:id` - Modifier un site
|
||||||
|
- `DELETE /api/sites/:id` - Supprimer un site
|
||||||
|
|
||||||
|
### Machines
|
||||||
|
- `GET /api/machines` - Liste toutes les machines
|
||||||
|
- `GET /api/machines/:id` - Détails d'une machine
|
||||||
|
- `POST /api/machines` - Créer une machine
|
||||||
|
- `PATCH /api/machines/:id` - Modifier une machine
|
||||||
|
- `DELETE /api/machines/:id` - Supprimer une machine
|
||||||
|
|
||||||
|
### Composants
|
||||||
|
- `GET /api/composants` - Liste tous les composants
|
||||||
|
- `GET /api/composants/:id` - Détails d'un composant
|
||||||
|
- `POST /api/composants` - Créer un composant
|
||||||
|
- `PATCH /api/composants/:id` - Modifier un composant
|
||||||
|
- `DELETE /api/composants/:id` - Supprimer un composant
|
||||||
|
|
||||||
|
### Pièces
|
||||||
|
- `GET /api/pieces` - Liste toutes les pièces
|
||||||
|
- `GET /api/pieces/:id` - Détails d'une pièce
|
||||||
|
- `POST /api/pieces` - Créer une pièce
|
||||||
|
- `PATCH /api/pieces/:id` - Modifier une pièce
|
||||||
|
- `DELETE /api/pieces/:id` - Supprimer une pièce
|
||||||
|
|
||||||
|
### Types
|
||||||
|
- `GET /api/types/machines` - Liste tous les types de machines
|
||||||
|
- `GET /api/types/composants` - Liste tous les types de composants
|
||||||
|
- `GET /api/types/pieces` - Liste tous les types de pièces
|
||||||
|
- `POST /api/types/machines` - Créer un type de machine
|
||||||
|
- `POST /api/types/composants` - Créer un type de composant
|
||||||
|
- `POST /api/types/pieces` - Créer un type de pièce
|
||||||
|
|
||||||
|
### Documents
|
||||||
|
- `GET /api/documents` - Liste tous les documents
|
||||||
|
- `POST /api/documents` - Uploader un document
|
||||||
|
- `DELETE /api/documents/:id` - Supprimer un document
|
||||||
|
|
||||||
|
## 🛠️ Développement
|
||||||
|
|
||||||
|
### Scripts disponibles
|
||||||
|
```bash
|
||||||
|
npm run start # Démarrer en mode production
|
||||||
|
npm run start:dev # Démarrer en mode développement avec hot reload
|
||||||
|
npm run build # Compiler le projet
|
||||||
|
npm run test # Lancer les tests
|
||||||
|
npm run test:e2e # Lancer les tests end-to-end
|
||||||
|
npm run test:cov # Lancer les tests avec couverture
|
||||||
|
```
|
||||||
|
|
||||||
|
### Variables d'environnement
|
||||||
|
Créer un fichier `.env` :
|
||||||
|
```env
|
||||||
|
DATABASE_URL="postgresql://postgres:password@localhost:5432/inventory_db?schema=public"
|
||||||
|
PORT=3000
|
||||||
|
NODE_ENV=development
|
||||||
|
```
|
||||||
|
|
||||||
|
### Prisma
|
||||||
|
```bash
|
||||||
|
npx prisma studio # Interface graphique pour la base de données
|
||||||
|
npx prisma migrate dev # Créer et appliquer une migration
|
||||||
|
npx prisma generate # Régénérer le client Prisma
|
||||||
|
npx prisma db push # Pousser les changements sans migration
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📁 Structure du projet
|
||||||
|
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── sites/ # Module de gestion des sites
|
||||||
|
├── machines/ # Module de gestion des machines
|
||||||
|
├── composants/ # Module de gestion des composants
|
||||||
|
├── pieces/ # Module de gestion des pièces
|
||||||
|
├── documents/ # Module de gestion des documents
|
||||||
|
├── types/ # Module de gestion des types
|
||||||
|
├── prisma/ # Configuration Prisma
|
||||||
|
└── shared/ # DTOs et utilitaires partagés
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Configuration Docker (optionnel)
|
||||||
|
|
||||||
|
Pour utiliser Docker avec PostgreSQL :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Démarrer PostgreSQL avec Docker
|
||||||
|
docker run --name postgres-inventory \
|
||||||
|
-e POSTGRES_PASSWORD=password \
|
||||||
|
-e POSTGRES_DB=inventory_db \
|
||||||
|
-p 5432:5432 \
|
||||||
|
-d postgres:15
|
||||||
|
|
||||||
|
# Modifier le DATABASE_URL dans .env
|
||||||
|
DATABASE_URL="postgresql://postgres:password@localhost:5432/inventory_db?schema=public"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 Fonctionnalités
|
||||||
|
|
||||||
|
- ✅ Architecture hiérarchique infinie (sites → machines → composants → sous-composants → pièces)
|
||||||
|
- ✅ Gestion des types avec champs personnalisés dynamiques
|
||||||
|
- ✅ Upload et gestion de documents
|
||||||
|
- ✅ Validation des données avec class-validator
|
||||||
|
- ✅ API REST complète avec NestJS
|
||||||
|
- ✅ Base de données PostgreSQL avec Prisma ORM
|
||||||
|
- ✅ Support CORS pour le frontend
|
||||||
|
- ✅ Structure modulaire et extensible
|
||||||
|
|
||||||
|
## 🚧 Prochaines étapes
|
||||||
|
|
||||||
|
- [ ] Implémentation complète des contrôleurs et services
|
||||||
|
- [ ] Gestion des champs personnalisés
|
||||||
|
- [ ] Upload de fichiers
|
||||||
|
- [ ] Tests unitaires et d'intégration
|
||||||
|
- [ ] Documentation Swagger/OpenAPI
|
||||||
|
- [ ] Frontend Nuxt 3
|
||||||
32
env.example
Normal file
32
env.example
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Configuration de la base de données
|
||||||
|
DATABASE_URL="postgresql://postgres:password@localhost:5432/inventory_db"
|
||||||
|
|
||||||
|
# Configuration du serveur
|
||||||
|
PORT=3000
|
||||||
|
NODE_ENV=development
|
||||||
|
|
||||||
|
# Configuration CORS
|
||||||
|
CORS_ORIGIN=http://localhost:3001
|
||||||
|
|
||||||
|
# Configuration de sécurité
|
||||||
|
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
|
||||||
|
JWT_EXPIRES_IN=7d
|
||||||
|
|
||||||
|
# Configuration de l'API
|
||||||
|
API_PREFIX=api
|
||||||
|
API_VERSION=v1
|
||||||
|
|
||||||
|
# Configuration des logs
|
||||||
|
LOG_LEVEL=debug
|
||||||
|
|
||||||
|
# Configuration de la validation
|
||||||
|
VALIDATION_WHITELIST=true
|
||||||
|
VALIDATION_FORBID_NON_WHITELISTED=true
|
||||||
|
VALIDATION_TRANSFORM=true
|
||||||
|
|
||||||
|
# Configuration de la base de données (optionnel pour le développement)
|
||||||
|
DB_HOST=localhost
|
||||||
|
DB_PORT=5432
|
||||||
|
DB_USERNAME=postgres
|
||||||
|
DB_PASSWORD=password
|
||||||
|
DB_NAME=inventory_db
|
||||||
34
eslint.config.mjs
Normal file
34
eslint.config.mjs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// @ts-check
|
||||||
|
import eslint from '@eslint/js';
|
||||||
|
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
|
||||||
|
import globals from 'globals';
|
||||||
|
import tseslint from 'typescript-eslint';
|
||||||
|
|
||||||
|
export default tseslint.config(
|
||||||
|
{
|
||||||
|
ignores: ['eslint.config.mjs'],
|
||||||
|
},
|
||||||
|
eslint.configs.recommended,
|
||||||
|
...tseslint.configs.recommendedTypeChecked,
|
||||||
|
eslintPluginPrettierRecommended,
|
||||||
|
{
|
||||||
|
languageOptions: {
|
||||||
|
globals: {
|
||||||
|
...globals.node,
|
||||||
|
...globals.jest,
|
||||||
|
},
|
||||||
|
sourceType: 'commonjs',
|
||||||
|
parserOptions: {
|
||||||
|
projectService: true,
|
||||||
|
tsconfigRootDir: import.meta.dirname,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rules: {
|
||||||
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
|
'@typescript-eslint/no-floating-promises': 'warn',
|
||||||
|
'@typescript-eslint/no-unsafe-argument': 'warn'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
8
nest-cli.json
Normal file
8
nest-cli.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/nest-cli",
|
||||||
|
"collection": "@nestjs/schematics",
|
||||||
|
"sourceRoot": "src",
|
||||||
|
"compilerOptions": {
|
||||||
|
"deleteOutDir": true
|
||||||
|
}
|
||||||
|
}
|
||||||
12266
package-lock.json
generated
Normal file
12266
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
81
package.json
Normal file
81
package.json
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
{
|
||||||
|
"name": "backend",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "",
|
||||||
|
"author": "",
|
||||||
|
"private": true,
|
||||||
|
"license": "UNLICENSED",
|
||||||
|
"scripts": {
|
||||||
|
"build": "nest build",
|
||||||
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
||||||
|
"start": "nest start",
|
||||||
|
"start:dev": "nest start --watch",
|
||||||
|
"start:debug": "nest start --debug --watch",
|
||||||
|
"start:prod": "node dist/main",
|
||||||
|
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
||||||
|
"test": "jest",
|
||||||
|
"test:watch": "jest --watch",
|
||||||
|
"test:cov": "jest --coverage",
|
||||||
|
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
||||||
|
"test:e2e": "jest --config ./test/jest-e2e.json"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@nestjs/common": "^11.0.1",
|
||||||
|
"@nestjs/config": "^4.0.2",
|
||||||
|
"@nestjs/core": "^11.0.1",
|
||||||
|
"@nestjs/platform-express": "^11.0.1",
|
||||||
|
"@nestjs/typeorm": "^11.0.0",
|
||||||
|
"@prisma/client": "^6.12.0",
|
||||||
|
"class-transformer": "^0.5.1",
|
||||||
|
"class-validator": "^0.14.2",
|
||||||
|
"pg": "^8.16.3",
|
||||||
|
"prisma": "^6.12.0",
|
||||||
|
"reflect-metadata": "^0.2.2",
|
||||||
|
"rxjs": "^7.8.1",
|
||||||
|
"typeorm": "^0.3.25"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@eslint/eslintrc": "^3.2.0",
|
||||||
|
"@eslint/js": "^9.18.0",
|
||||||
|
"@nestjs/cli": "^11.0.0",
|
||||||
|
"@nestjs/schematics": "^11.0.0",
|
||||||
|
"@nestjs/testing": "^11.0.1",
|
||||||
|
"@swc/cli": "^0.6.0",
|
||||||
|
"@swc/core": "^1.10.7",
|
||||||
|
"@types/express": "^5.0.0",
|
||||||
|
"@types/jest": "^29.5.14",
|
||||||
|
"@types/node": "^22.16.5",
|
||||||
|
"@types/supertest": "^6.0.2",
|
||||||
|
"eslint": "^9.18.0",
|
||||||
|
"eslint-config-prettier": "^10.0.1",
|
||||||
|
"eslint-plugin-prettier": "^5.2.2",
|
||||||
|
"globals": "^16.0.0",
|
||||||
|
"jest": "^29.7.0",
|
||||||
|
"prettier": "^3.4.2",
|
||||||
|
"source-map-support": "^0.5.21",
|
||||||
|
"supertest": "^7.0.0",
|
||||||
|
"ts-jest": "^29.2.5",
|
||||||
|
"ts-loader": "^9.5.2",
|
||||||
|
"ts-node": "^10.9.2",
|
||||||
|
"tsconfig-paths": "^4.2.0",
|
||||||
|
"typescript": "^5.7.3",
|
||||||
|
"typescript-eslint": "^8.20.0"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"moduleFileExtensions": [
|
||||||
|
"js",
|
||||||
|
"json",
|
||||||
|
"ts"
|
||||||
|
],
|
||||||
|
"rootDir": "src",
|
||||||
|
"testRegex": ".*\\.spec\\.ts$",
|
||||||
|
"transform": {
|
||||||
|
"^.+\\.(t|j)s$": "ts-jest"
|
||||||
|
},
|
||||||
|
"collectCoverageFrom": [
|
||||||
|
"**/*.(t|j)s"
|
||||||
|
],
|
||||||
|
"coverageDirectory": "../coverage",
|
||||||
|
"testEnvironment": "node"
|
||||||
|
}
|
||||||
|
}
|
||||||
4
tsconfig.build.json
Normal file
4
tsconfig.build.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
|
||||||
|
}
|
||||||
21
tsconfig.json
Normal file
21
tsconfig.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "commonjs",
|
||||||
|
"declaration": true,
|
||||||
|
"removeComments": true,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"target": "ES2023",
|
||||||
|
"sourceMap": true,
|
||||||
|
"outDir": "./dist",
|
||||||
|
"baseUrl": "./",
|
||||||
|
"incremental": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strictNullChecks": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"strictBindCallApply": false,
|
||||||
|
"noFallthroughCasesInSwitch": false
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user