106 lines
2.6 KiB
TypeScript
106 lines
2.6 KiB
TypeScript
// src/scripts/import-users-from-csv.ts
|
||
import { PrismaClient, Roles } from '@prisma/client';
|
||
import * as fs from 'fs';
|
||
import * as path from 'path';
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
// ⚙️ Chemin vers ton CSV (à adapter selon où tu le mets)
|
||
const CSV_PATH = path.resolve(__dirname, 'data/export_employee_table.csv');
|
||
|
||
// Type aligné sur les colonnes du CSV
|
||
type CsvUserRow = {
|
||
email: string;
|
||
first_name: string;
|
||
last_name: string;
|
||
phone_number: string;
|
||
};
|
||
|
||
// Petit parseur de ligne CSV sans dépendance
|
||
function splitCsvLine(line: string): string[] {
|
||
const result: string[] = [];
|
||
let current = '';
|
||
let inQuotes = false;
|
||
|
||
for (let i = 0; i < line.length; i++) {
|
||
const char = line[i];
|
||
|
||
if (char === '"') {
|
||
// guillemet échappé ""
|
||
if (inQuotes && line[i + 1] === '"') {
|
||
current += '"';
|
||
i++; // on saute le deuxième
|
||
} else {
|
||
inQuotes = !inQuotes;
|
||
}
|
||
} else if (char === ',' && !inQuotes) {
|
||
result.push(current);
|
||
current = '';
|
||
} else {
|
||
current += char;
|
||
}
|
||
}
|
||
|
||
result.push(current);
|
||
return result.map((v) => v.trim());
|
||
}
|
||
|
||
async function main() {
|
||
// 1. Lecture du fichier CSV
|
||
const fileContent = fs.readFileSync(CSV_PATH, 'utf-8');
|
||
|
||
const lines = fileContent
|
||
.split(/\r?\n/)
|
||
.map((l) => l.trim())
|
||
.filter((l) => l.length > 0);
|
||
|
||
if (lines.length <= 1) {
|
||
console.error('CSV vide ou seulement un header');
|
||
return;
|
||
}
|
||
|
||
// 2. Header (noms de colonnes) -> ["email", "first_name", "last_name", "phone_number"]
|
||
const header = splitCsvLine(lines[0]);
|
||
const dataLines = lines.slice(1);
|
||
|
||
// 3. Conversion de chaque ligne en objet { email, first_name, last_name, phone_number }
|
||
const records: CsvUserRow[] = dataLines.map((line) => {
|
||
const values = splitCsvLine(line);
|
||
const row: any = {};
|
||
|
||
header.forEach((col, idx) => {
|
||
row[col] = values[idx] ?? '';
|
||
});
|
||
|
||
return row as CsvUserRow;
|
||
});
|
||
|
||
// 4. Mapping vers le format attendu par Prisma (model Users)
|
||
const data = records.map((row) => ({
|
||
email: row.email.trim(),
|
||
first_name: row.first_name.trim(),
|
||
last_name: row.last_name.trim(),
|
||
phone_number: row.phone_number.trim(),
|
||
role: Roles.EMPLOYEE,
|
||
// residence: null,
|
||
}));
|
||
|
||
console.log(`➡️ ${data.length} lignes trouvées dans le CSV`);
|
||
console.log('Exemple importé :', data[0]);
|
||
|
||
const result = await prisma.users.createMany({
|
||
data,
|
||
});
|
||
|
||
console.log(`✅ ${result.count} utilisateurs insérés dans la DB`);
|
||
}
|
||
|
||
main()
|
||
.catch((err) => {
|
||
console.error('Erreur pendant l’import CSV → DB', err);
|
||
process.exit(1);
|
||
})
|
||
.finally(async () => {
|
||
await prisma.$disconnect();
|
||
});
|