Checkpoint: Migration OAuth Manus vers authentification locale (80% complété) - Pages login/register créées, backend JWT implémenté, guides de déploiement ajoutés. Reste à corriger les doublons dans db.ts et finaliser AdminUsers.

This commit is contained in:
Manus Sandbox
2025-11-19 04:39:07 -05:00
parent 9d67724e83
commit 28727171ae
17 changed files with 2168 additions and 87 deletions

View File

@@ -42,77 +42,72 @@ export async function getDb() {
return _db;
}
export async function upsertUser(user: InsertUser): Promise<void> {
if (!user.openId) {
throw new Error("User openId is required for upsert");
/**
* Crée un nouvel utilisateur avec email/mot de passe
*/
export async function createUser(user: InsertUser): Promise<number> {
if (!user.email) {
throw new Error("User email is required");
}
if (!user.password) {
throw new Error("User password is required");
}
const db = await getDb();
if (!db) {
console.warn("[Database] Cannot upsert user: database not available");
return;
throw new Error("Database not available");
}
try {
const values: InsertUser = {
openId: user.openId,
};
const updateSet: Record<string, unknown> = {};
const textFields = ["name", "email", "loginMethod"] as const;
type TextField = (typeof textFields)[number];
const assignNullable = (field: TextField) => {
const value = user[field];
if (value === undefined) return;
const normalized = value ?? null;
values[field] = normalized;
updateSet[field] = normalized;
};
textFields.forEach(assignNullable);
if (user.lastSignedIn !== undefined) {
values.lastSignedIn = user.lastSignedIn;
updateSet.lastSignedIn = user.lastSignedIn;
}
if (user.role !== undefined) {
values.role = user.role;
updateSet.role = user.role;
} else if (user.openId === ENV.ownerOpenId) {
values.role = 'admin';
updateSet.role = 'admin';
}
if (!values.lastSignedIn) {
values.lastSignedIn = new Date();
}
if (Object.keys(updateSet).length === 0) {
updateSet.lastSignedIn = new Date();
}
await db.insert(users).values(values).onDuplicateKeyUpdate({
set: updateSet,
});
const result = await db.insert(users).values(user);
return Number(result[0].insertId);
} catch (error) {
console.error("[Database] Failed to upsert user:", error);
console.error("[Database] Failed to create user:", error);
throw error;
}
}
export async function getUserByOpenId(openId: string) {
/**
* Récupère un utilisateur par son email
*/
export async function getUserByEmail(email: string) {
const db = await getDb();
if (!db) {
console.warn("[Database] Cannot get user: database not available");
return undefined;
}
const result = await db.select().from(users).where(eq(users.openId, openId)).limit(1);
const result = await db.select().from(users).where(eq(users.email, email)).limit(1);
return result.length > 0 ? result[0] : undefined;
}
/**
* Récupère un utilisateur par son ID
*/
export async function getUserById(id: number) {
const db = await getDb();
if (!db) {
console.warn("[Database] Cannot get user: database not available");
return undefined;
}
const result = await db.select().from(users).where(eq(users.id, id)).limit(1);
return result.length > 0 ? result[0] : undefined;
}
/**
* Met à jour le dernier login d'un utilisateur
*/
export async function updateUserLastSignedIn(userId: number): Promise<void> {
const db = await getDb();
if (!db) {
console.warn("[Database] Cannot update user: database not available");
return;
}
await db.update(users).set({ lastSignedIn: new Date() }).where(eq(users.id, userId));
}
// ==================== FORMATIONS ====================
export async function createFormation(data: InsertFormation) {
@@ -383,14 +378,6 @@ export async function deleteInscription(id: number) {
// ==================== GESTION DES UTILISATEURS ====================
export async function createUser(data: InsertUser) {
const db = await getDb();
if (!db) throw new Error("Database not available");
const result = await db.insert(users).values(data);
return result;
}
export async function getAllUsers() {
const db = await getDb();
if (!db) return [];
@@ -398,14 +385,6 @@ export async function getAllUsers() {
return await db.select().from(users);
}
export async function getUserById(id: number) {
const db = await getDb();
if (!db) return undefined;
const result = await db.select().from(users).where(eq(users.id, id)).limit(1);
return result.length > 0 ? result[0] : undefined;
}
export async function updateUser(id: number, data: Partial<InsertUser>) {
const db = await getDb();
if (!db) throw new Error("Database not available");