npm package: @salimtahayacine/database-seeder
Description: A secure Express middleware for database seeding with production protection
Author: Salim Taha Yassine
Latest version: 1.0.0

# 🌱 Database Seeder

[![npm version](https://badge.fury.io/js/%40salim-yassine%2Fdatabase-seeder.svg)](https://www.npmjs.com/package/@salim-yassine/database-seeder)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

Un middleware Express sécurisé pour gérer le seeding de base de données avec protection automatique en production.

## 🚀 Fonctionnalités

- ✅ **Sécurité intégrée** : Bloque automatiquement les requêtes en production
- ⚡ **Simple d'utilisation** : Une seule fonction à configurer
- 📊 **Monitoring** : Logs détaillés et temps d'exécution
- 🔧 **Flexible** : Compatible avec Mongoose, Sequelize, Prisma, SQL brut, etc.
- 📦 **TypeScript** : Définitions de types incluses

## 📦 Installation

```bash
npm install @salim-yassine/database-seeder
```

## 🎯 Utilisation

### Exemple avec Mongoose

```javascript
const express = require('express');
const databaseSeeder = require('@salim-yassine/database-seeder');
const User = require('./models/User');

const app = express();

// Définir votre logique de seeding
const seedDatabase = async () => {
  await User.deleteMany({}); // Nettoyer la collection
  
  const users = await User.insertMany([
    { name: 'Admin', email: 'admin@example.com', role: 'admin' },
    { name: 'User', email: 'user@example.com', role: 'user' }
  ]);
  
  return { inserted: users.length };
};

// Monter le routeur (accessible uniquement en développement)
app.use('/api/seed', databaseSeeder(seedDatabase));

app.listen(3000);
```

### Exemple avec Sequelize

```javascript
const seedDatabase = async () => {
  await User.destroy({ where: {}, truncate: true });
  
  const users = await User.bulkCreate([
    { name: 'Admin', email: 'admin@example.com' },
    { name: 'User', email: 'user@example.com' }
  ]);
  
  return { count: users.length };
};

app.use('/api/seed', databaseSeeder(seedDatabase));
```

### Exemple avec Prisma

```javascript
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

const seedDatabase = async () => {
  await prisma.user.deleteMany();
  
  const users = await prisma.user.createMany({
    data: [
      { name: 'Admin', email: 'admin@example.com' },
      { name: 'User', email: 'user@example.com' }
    ]
  });
  
  return users;
};

app.use('/api/seed', databaseSeeder(seedDatabase));
```

## 🔒 Sécurité

Le module **bloque automatiquement** toute tentative de seeding si `NODE_ENV=production`.

```javascript
// En production, cette requête retournera une erreur 403
POST /api/seed
// Response: 403 Forbidden
{
  "success": false,
  "error": "DANGER: Database seeding is strictly disabled in production environment."
}
```

## 📡 API

### Endpoint POST

Une fois monté, le routeur expose un endpoint POST :

```bash
# Exécuter le seeding
curl -X POST http://localhost:3000/api/seed
```

### Réponse en cas de succès

```json
{
  "success": true,
  "message": "Database seeded successfully.",
  "duration": "1234ms",
  "data": {
    "inserted": 2
  }
}
```

### Réponse en cas d'erreur

```json
{
  "success": false,
  "message": "An error occurred during database seeding.",
  "error": "Connection refused"
}
```

## 🛠️ Configuration TypeScript

```typescript
import express from 'express';
import databaseSeeder from '@salim-yassine/database-seeder';

const app = express();

const seedDatabase = async (): Promise<{ count: number }> => {
  // Votre logique ici
  return { count: 10 };
};

app.use('/api/seed', databaseSeeder(seedDatabase));
```

## ⚙️ Variables d'environnement

```bash
# Développement (seeding autorisé)
NODE_ENV=development

# Production (seeding bloqué)
NODE_ENV=production
```

## 🧪 Tests

```bash
# En développement
npm run dev
# Puis : curl -X POST http://localhost:3000/api/seed

# Vérifier le blocage en production
NODE_ENV=production npm start
# Puis : curl -X POST http://localhost:3000/api/seed
# Devrait retourner 403 Forbidden
```

## 📝 Bonnes pratiques

1. **Toujours utiliser en développement uniquement**
2. **Ne jamais exposer ce endpoint en production**
3. **Utiliser des variables d'environnement pour les données sensibles**
4. **Nettoyer les données existantes avant le seeding**

## 🤝 Contribution

Les contributions sont les bienvenues ! N'hésitez pas à :

1. Fork le projet
2. Créer une branche (`git checkout -b feature/AmazingFeature`)
3. Commit vos changements (`git commit -m 'Add some AmazingFeature'`)
4. Push vers la branche (`git push origin feature/AmazingFeature`)
5. Ouvrir une Pull Request

## 📄 Licence

MIT © [Salim Taha Yassine](https://github.com/salimtahayacine)

## 🐛 Bugs & Support

Pour signaler un bug ou demander de l'aide :
- [Issues GitHub](https://github.com/salimtahayacine/Module_Seeder/issues)

## 👨‍💻 Auteur

**Salim Taha Yassine**
- Full Stack Developer (Java Spring Boot / Angular / Ionic)
- Passionné par DevOps, DevSecOps et Cybersécurité
- GitHub: [@salimtahayacine](https://github.com/salimtahayacine)