true message
This commit is contained in:
@@ -20,16 +20,10 @@ export function registerOAuthRoutes(app: Express) {
|
||||
}
|
||||
|
||||
try {
|
||||
console.log("[OAuth] Starting callback with code:", code?.substring(0, 10) + "...");
|
||||
|
||||
const tokenResponse = await sdk.exchangeCodeForToken(code, state);
|
||||
console.log("[OAuth] Token exchange successful");
|
||||
|
||||
const userInfo = await sdk.getUserInfo(tokenResponse.accessToken);
|
||||
console.log("[OAuth] User info received:", { openId: userInfo.openId, email: userInfo.email, name: userInfo.name });
|
||||
|
||||
if (!userInfo.openId) {
|
||||
console.error("[OAuth] Missing openId in user info");
|
||||
res.status(400).json({ error: "openId missing from user info" });
|
||||
return;
|
||||
}
|
||||
@@ -41,17 +35,14 @@ export function registerOAuthRoutes(app: Express) {
|
||||
loginMethod: userInfo.loginMethod ?? userInfo.platform ?? null,
|
||||
lastSignedIn: new Date(),
|
||||
});
|
||||
console.log("[OAuth] User upserted successfully");
|
||||
|
||||
const sessionToken = await sdk.createSessionToken(userInfo.openId, {
|
||||
name: userInfo.name || "",
|
||||
expiresInMs: ONE_YEAR_MS,
|
||||
});
|
||||
console.log("[OAuth] Session token created");
|
||||
|
||||
const cookieOptions = getSessionCookieOptions(req);
|
||||
res.cookie(COOKIE_NAME, sessionToken, { ...cookieOptions, maxAge: ONE_YEAR_MS });
|
||||
console.log("[OAuth] Cookie set, redirecting to /");
|
||||
|
||||
res.redirect(302, "/");
|
||||
} catch (error) {
|
||||
|
||||
121
server/db.ts
121
server/db.ts
@@ -5,7 +5,6 @@ import {
|
||||
users,
|
||||
formations,
|
||||
apprenants,
|
||||
formateurs,
|
||||
sequences,
|
||||
datesFormation,
|
||||
inscriptions,
|
||||
@@ -19,13 +18,10 @@ import {
|
||||
InsertInscription,
|
||||
InsertFormation,
|
||||
InsertApprenant,
|
||||
InsertFormateur,
|
||||
InsertRappel,
|
||||
Sequence,
|
||||
DateFormation,
|
||||
Apprenant,
|
||||
Formation,
|
||||
Formateur,
|
||||
EmailTemplate,
|
||||
InsertEmailTemplate
|
||||
} from "../drizzle/schema";
|
||||
@@ -660,120 +656,3 @@ export async function updateEmailConfig(id: number, data: Partial<InsertEmailCon
|
||||
})
|
||||
.where(eq(emailConfig.id, id));
|
||||
}
|
||||
|
||||
// ===== FORMATEURS =====
|
||||
|
||||
/**
|
||||
* Récupérer tous les formateurs actifs
|
||||
*/
|
||||
export async function getFormateurs() {
|
||||
const db = await getDb();
|
||||
if (!db) return [];
|
||||
|
||||
const result = await db.select().from(formateurs).where(eq(formateurs.actif, true));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Créer un nouveau formateur
|
||||
*/
|
||||
export async function createFormateur(data: InsertFormateur) {
|
||||
const db = await getDb();
|
||||
if (!db) return null;
|
||||
|
||||
const result = await db.insert(formateurs).values(data);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprimer un formateur (désactivation logique)
|
||||
*/
|
||||
export async function deleteFormateur(id: number) {
|
||||
const db = await getDb();
|
||||
if (!db) return;
|
||||
|
||||
await db.update(formateurs).set({ actif: false }).where(eq(formateurs.id, id));
|
||||
}
|
||||
|
||||
// ===== RAPPELS =====
|
||||
|
||||
/**
|
||||
* Récupérer tous les rappels
|
||||
*/
|
||||
export async function getRappels() {
|
||||
const db = await getDb();
|
||||
if (!db) return [];
|
||||
|
||||
const { rappels } = await import("../drizzle/schema");
|
||||
const result = await db.select().from(rappels);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Créer un nouveau rappel
|
||||
*/
|
||||
export async function createRappel(data: InsertRappel) {
|
||||
const db = await getDb();
|
||||
if (!db) return null;
|
||||
|
||||
const { rappels } = await import("../drizzle/schema");
|
||||
const result = await db.insert(rappels).values(data);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mettre à jour un rappel
|
||||
*/
|
||||
export async function updateRappel(id: number, data: Partial<InsertRappel>) {
|
||||
const db = await getDb();
|
||||
if (!db) return;
|
||||
|
||||
const { rappels } = await import("../drizzle/schema");
|
||||
await db.update(rappels).set({
|
||||
...data,
|
||||
updatedAt: new Date(),
|
||||
}).where(eq(rappels.id, id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprimer un rappel
|
||||
*/
|
||||
export async function deleteRappel(id: number) {
|
||||
const db = await getDb();
|
||||
if (!db) return;
|
||||
|
||||
const { rappels } = await import("../drizzle/schema");
|
||||
await db.delete(rappels).where(eq(rappels.id, id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Enregistrer l'envoi d'un rappel
|
||||
*/
|
||||
export async function enregistrerRappelEnvoye(rappelId: number, inscriptionId: number) {
|
||||
const db = await getDb();
|
||||
if (!db) return;
|
||||
|
||||
const { rappelsEnvoyes } = await import("../drizzle/schema");
|
||||
await db.insert(rappelsEnvoyes).values({
|
||||
rappelId,
|
||||
inscriptionId,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifier si un rappel a déjà été envoyé
|
||||
*/
|
||||
export async function rappelDejaEnvoye(rappelId: number, inscriptionId: number) {
|
||||
const db = await getDb();
|
||||
if (!db) return false;
|
||||
|
||||
const { rappelsEnvoyes } = await import("../drizzle/schema");
|
||||
const result = await db.select().from(rappelsEnvoyes)
|
||||
.where(and(
|
||||
eq(rappelsEnvoyes.rappelId, rappelId),
|
||||
eq(rappelsEnvoyes.inscriptionId, inscriptionId)
|
||||
))
|
||||
.limit(1);
|
||||
|
||||
return result.length > 0;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,6 @@ export async function sendInscriptionConfirmation(params: {
|
||||
sequenceNom: string;
|
||||
dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>;
|
||||
lieu: string;
|
||||
formateur?: string;
|
||||
statut: 'confirmee' | 'liste_attente';
|
||||
}): Promise<boolean> {
|
||||
const isConfirmed = params.statut === 'confirmee';
|
||||
@@ -89,7 +88,6 @@ export async function sendInscriptionConfirmation(params: {
|
||||
<p><strong>Formation :</strong> ${params.formationNom}</p>
|
||||
<p><strong>Séquence :</strong> ${params.sequenceNom}</p>
|
||||
<p><strong>Lieu :</strong> ${params.lieu}</p>
|
||||
${params.formateur ? `<p><strong>Formateur :</strong> ${params.formateur}</p>` : ''}
|
||||
<h4>Dates de formation (${params.dates.length} séance${params.dates.length > 1 ? 's' : ''}) :</h4>
|
||||
${datesHTML}
|
||||
</div>
|
||||
|
||||
@@ -72,25 +72,6 @@ export const appRouter = router({
|
||||
}),
|
||||
}),
|
||||
|
||||
// ===== FORMATEURS =====
|
||||
formateurs: router({
|
||||
list: adminProcedure.query(async () => {
|
||||
return db.getFormateurs();
|
||||
}),
|
||||
|
||||
create: adminProcedure.input(z.object({
|
||||
nom: z.string().min(1),
|
||||
})).mutation(async ({ input }) => {
|
||||
await db.createFormateur(input);
|
||||
return { success: true };
|
||||
}),
|
||||
|
||||
delete: adminProcedure.input(z.object({ id: z.number() })).mutation(async ({ input }) => {
|
||||
await db.deleteFormateur(input.id);
|
||||
return { success: true };
|
||||
}),
|
||||
}),
|
||||
|
||||
// ===== APPRENANTS =====
|
||||
apprenants: router({
|
||||
list: adminProcedure.query(async () => {
|
||||
@@ -139,12 +120,11 @@ export const appRouter = router({
|
||||
sequences: router({
|
||||
list: adminProcedure.query(async () => {
|
||||
const seqs = await db.getSequences();
|
||||
// Récupérer les dates et le nombre d'inscrits pour chaque séquence
|
||||
// Récupérer les dates pour chaque séquence
|
||||
const sequencesAvecDates = await Promise.all(
|
||||
seqs.map(async (seq) => {
|
||||
const dates = await db.getDatesBySequence(seq.id);
|
||||
const nbInscrits = await db.countInscriptionsBySequence(seq.id, 'confirmee');
|
||||
return { ...seq, dates, nbInscrits };
|
||||
return { ...seq, dates };
|
||||
})
|
||||
);
|
||||
return sequencesAvecDates;
|
||||
@@ -174,8 +154,7 @@ export const appRouter = router({
|
||||
formationId: z.number(),
|
||||
nom: z.string().min(1),
|
||||
lieu: z.string().min(1),
|
||||
publicCible: z.enum(["directeur", "chef_service", "tous", "autre"]),
|
||||
formateur: z.string().optional(),
|
||||
publicCible: z.enum(["directeur", "chef_service", "autre"]),
|
||||
capaciteMax: z.number().default(12),
|
||||
dateBlocage: z.string(),
|
||||
statut: z.enum(["ouverte", "bloquee", "terminee"]).optional(),
|
||||
@@ -214,8 +193,7 @@ export const appRouter = router({
|
||||
formationId: z.number(),
|
||||
nom: z.string().min(1),
|
||||
lieu: z.string().min(1),
|
||||
publicCible: z.enum(["directeur", "chef_service", "tous", "autre"]),
|
||||
formateur: z.string().optional(),
|
||||
publicCible: z.enum(["directeur", "chef_service", "autre"]),
|
||||
capaciteMax: z.number(),
|
||||
dateBlocage: z.string(),
|
||||
statut: z.enum(["ouverte", "bloquee", "terminee"]),
|
||||
@@ -349,7 +327,6 @@ export const appRouter = router({
|
||||
ordre: d.ordre,
|
||||
})),
|
||||
lieu: inscriptionSequence.lieu,
|
||||
formateur: inscriptionSequence.formateur || undefined,
|
||||
statut,
|
||||
});
|
||||
}
|
||||
@@ -690,40 +667,6 @@ export const appRouter = router({
|
||||
}),
|
||||
}),
|
||||
|
||||
// ===== RAPPELS =====
|
||||
rappels: router({
|
||||
list: adminProcedure.query(async () => {
|
||||
return db.getRappels();
|
||||
}),
|
||||
|
||||
create: adminProcedure.input(z.object({
|
||||
nom: z.string().min(1),
|
||||
joursAvant: z.number().min(1),
|
||||
emailTemplate: z.string().min(1),
|
||||
actif: z.boolean().default(true),
|
||||
})).mutation(async ({ input }) => {
|
||||
await db.createRappel(input);
|
||||
return { success: true };
|
||||
}),
|
||||
|
||||
update: adminProcedure.input(z.object({
|
||||
id: z.number(),
|
||||
nom: z.string().min(1).optional(),
|
||||
joursAvant: z.number().min(1).optional(),
|
||||
emailTemplate: z.string().min(1).optional(),
|
||||
actif: z.boolean().optional(),
|
||||
})).mutation(async ({ input }) => {
|
||||
const { id, ...data } = input;
|
||||
await db.updateRappel(id, data);
|
||||
return { success: true };
|
||||
}),
|
||||
|
||||
delete: adminProcedure.input(z.object({ id: z.number() })).mutation(async ({ input }) => {
|
||||
await db.deleteRappel(input.id);
|
||||
return { success: true };
|
||||
}),
|
||||
}),
|
||||
|
||||
emailConfig: router({
|
||||
get: adminProcedure.query(async () => {
|
||||
return db.getActiveEmailConfig();
|
||||
|
||||
Reference in New Issue
Block a user