import {Database, RunResult, SQLiteValue} from 'node-sqlite3-wasm'; import System from "../System"; export interface UserInfosQueryResponse extends Record { first_name: string; last_name: string; username: string; email: string; plateform: string; term_accepted: number; account_verified: number; user_meta: string; author_name: string; writing_lang: number, writing_level: number, rite_points: number, user_group: number, credits_balance: number, } export interface CredentialResponse { valid: boolean; message?: string; user?: UserResponse; } interface UserResponse { id: string; name: string; last_name: string; username: string; email: string; account_verified: boolean; } export interface UserAccountQuery extends Record { first_name: string; last_name: string; username: string author_name: string; email: string; user_meta: string; } export interface GuideTourResult extends Record { step_tour: string; } export default class UserRepo { public static insertUser(uuId: string, firstName: string, lastName: string, username: string, originUsername: string, email: string, originEmail: string, lang: 'fr' | 'en' = 'fr'): string { let result: RunResult; try { const db: Database = System.getDb(); const query = `INSERT INTO erit_users (user_id, first_name, last_name, username, email, origin_email, origin_username, term_accepted, account_verified) VALUES (?, ?, ?, ?, ?, ?, ?, 0, 1)`; const values: (string | null | number)[] = [uuId, firstName, lastName, username, email, originEmail, originUsername]; result = db.run(query, values); } catch (e: unknown) { if (e instanceof Error) { console.error(`DB Error: ${e.message}`); throw new Error(lang === 'fr' ? `Impossible d'enregistrer l'utilisateur.` : `Unable to register user.`); } else { console.error("An unknown error occurred."); throw new Error(lang === 'fr' ? "Une erreur inconnue s'est produite." : "An unknown error occurred."); } } if (result.changes > 0) { return uuId; } else { throw new Error(lang === 'fr' ? `Une erreur s'est produite lors de l'enregistrement de l'utilisateur.` : `Error registering user.`); } } public static fetchUserInfos(userId: string, lang: 'fr' | 'en' = 'fr'): UserInfosQueryResponse { let result; try { const db: Database = System.getDb(); result = db.get('SELECT `first_name`, `last_name`, `username`, `email`, `plateform`, `term_accepted`, `account_verified`, user_meta, author_name, erite_points AS rite_points, user_group, credits_balance FROM `erit_users` AS users LEFT JOIN user_preferences AS preference ON users.user_id=preference.user_id WHERE users.user_id=?', [userId]); } catch (e: unknown) { if (e instanceof Error) { console.error(`DB Error: ${e.message}`); throw new Error(lang === 'fr' ? `Impossible de récupérer les informations utilisateur.` : `Unable to retrieve user information.`); } else { console.error("An unknown error occurred."); throw new Error(lang === 'fr' ? "Une erreur inconnue s'est produite." : "An unknown error occurred."); } } if (!result) { throw new Error(lang === 'fr' ? `Utilisateur non trouvé.` : `User not found.`); } return result as UserInfosQueryResponse; } public static updateUserInfos(userId: string, firstName: string, lastName: string, username: string, originUsername: string, email: string, originEmail: string, originalAuthorName: string, authorName: string, lang: 'fr' | 'en' = 'fr'): boolean { try { const db: Database = System.getDb(); const result: RunResult = db.run('UPDATE `erit_users` SET `first_name`=?, `last_name`=?, `username`=?, email=?,`origin_username`=?, origin_author_name=? ,author_name=? WHERE user_id=? AND `origin_email`=?', [firstName, lastName, username, email, originUsername, originalAuthorName, authorName, userId, originEmail]); return result.changes > 0; } catch (e: unknown) { if (e instanceof Error) { console.error(`DB Error: ${e.message}`); throw new Error(lang === 'fr' ? `Impossible de mettre à jour les informations utilisateur.` : `Unable to update user information.`); } else { console.error("An unknown error occurred."); throw new Error(lang === 'fr' ? "Une erreur inconnue s'est produite." : "An unknown error occurred."); } } } public static fetchAccountInformation(userId: string, lang: 'fr' | 'en' = 'fr'): UserAccountQuery { let result; try { const db: Database = System.getDb(); result = db.get('SELECT `first_name`, `last_name`, `username`,`author_name`, `email`,`user_meta` FROM `erit_users` WHERE user_id=?', [userId]); } catch (e: unknown) { if (e instanceof Error) { console.error(`DB Error: ${e.message}`); throw new Error(lang === 'fr' ? `Impossible de récupérer les informations du compte.` : `Unable to retrieve account information.`); } else { console.error("An unknown error occurred."); throw new Error(lang === 'fr' ? "Une erreur inconnue s'est produite." : "An unknown error occurred."); } } if (!result) { throw new Error(lang === 'fr' ? `Compte non trouvé.` : `Account not found.`); } return result as UserAccountQuery; } }