targo-backend/scripts/import-users-from-csv.ts

106 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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 limport CSV → DB', err);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});