Compare commits

..

1 Commits

Author SHA1 Message Date
djalim f59589bb28 feat(database): add roles, permissions, users, modules, and related tables
Add tables for role-based access control and academic entities.
Includes modules, UEs, notes, and adjustments.
Update students and mobility tables to reference new primary keys.
This enables richer data modeling for the application.
2026-04-22 13:13:33 +02:00
2 changed files with 48 additions and 67 deletions
+47 -47
View File
@@ -1,70 +1,59 @@
import {
doublePrecision,
date,
integer,
pgTable,
primaryKey,
real,
serial,
text,
} from "npm:drizzle-orm/pg-core";
// Ancien schéma conservé
export const promotions = pgTable("promotions", {
id: text("idPromo").primaryKey(),
annee: text("annee"),
});
export const students = pgTable("students", {
numEtud: serial("numEtud").primaryKey(),
nom: text("nom"),
prenom: text("prenom"),
idPromo: text("idPromo").references(() => promotions.id),
});
export const mobility = pgTable("mobility", {
id: serial("id").primaryKey(),
studentId: text("studentId").references(() => students.numEtud),
startDate: text("startDate"),
endDate: text("endDate"),
weeksCount: integer("weeksCount"),
destinationCountry: text("destinationCountry"),
destinationName: text("destinationName"),
mobilityStatus: text("mobilityStatus").default("N/A"),
});
// Nouveau schéma
export const roles = pgTable("roles", {
id: serial("id").primaryKey(),
nom: text("nom"),
nom: text("nom").notNull(),
});
export const permissions = pgTable("permissions", {
id: serial("id").primaryKey(),
nom: text("nom"),
id: text("id").primaryKey(),
nom: text("nom").notNull(),
});
export const rolePermissions = pgTable("role_permissions", {
idRole: integer("idRole").references(() => roles.id),
idPermission: integer("idPermission").references(() => permissions.id),
idRole: integer("idRole").notNull().references(() => roles.id),
idPermission: text("idPermission").notNull().references(() => permissions.id),
}, (t) => ({
pk: primaryKey({ columns: [t.idRole, t.idPermission] }),
}));
export const users = pgTable("users", {
id: text("id").primaryKey(),
nom: text("nom"),
prenom: text("prenom"),
nom: text("nom").notNull(),
prenom: text("prenom").notNull(),
idRole: integer("idRole").references(() => roles.id),
});
export const promotions = pgTable("promotions", {
id: serial("id").primaryKey(),
endyear: integer("endyear"),
current: integer("current"),
});
export const students = pgTable("students", {
numEtud: serial("numEtud").primaryKey(),
nom: text("nom").notNull(),
prenom: text("prenom").notNull(),
idPromo: text("idPromo").references(() => promotions.id as unknown as string),
});
export const modules = pgTable("modules", {
id: text("id").primaryKey(),
nom: text("nom"),
nom: text("nom").notNull(),
});
export const enseignements = pgTable("enseignements", {
idProf: text("idProf").references(() => users.id),
idModule: text("idModule").references(() => modules.id),
idPromo: text("idPromo").references(() => promotions.id),
idProf: text("idProf").notNull().references(() => users.id),
idModule: text("idModule").notNull().references(() => modules.id),
idPromo: text("idPromo").notNull(),
}, (t) => ({
pk: primaryKey({ columns: [t.idProf, t.idModule, t.idPromo] }),
}));
@@ -75,26 +64,37 @@ export const ues = pgTable("ues", {
});
export const ueModules = pgTable("ue_modules", {
idModule: text("idModule").references(() => modules.id),
idUE: integer("idUE").references(() => ues.id),
idPromo: text("idPromo").references(() => promotions.id),
coeff: doublePrecision("coeff"),
idModule: text("idModule").notNull().references(() => modules.id),
idUE: integer("idUE").notNull().references(() => ues.id),
idPromo: text("idPromo").notNull(),
coeff: real("coeff").notNull(),
}, (t) => ({
pk: primaryKey({ columns: [t.idModule, t.idUE, t.idPromo] }),
}));
export const notes = pgTable("notes", {
numEtud: integer("numEtud").references(() => students.numEtud),
idModule: text("idModule").references(() => modules.id),
note: doublePrecision("note"),
numEtud: integer("numEtud").notNull().references(() => students.numEtud),
idModule: text("idModule").notNull().references(() => modules.id),
note: real("note").notNull(),
}, (t) => ({
pk: primaryKey({ columns: [t.numEtud, t.idModule] }),
}));
export const ajustements = pgTable("ajustements", {
numEtud: integer("numEtud").references(() => students.numEtud),
idUE: integer("idUE").references(() => ues.id),
valeur: doublePrecision("valeur"),
numEtud: integer("numEtud").notNull().references(() => students.numEtud),
idUE: integer("idUE").notNull().references(() => ues.id),
valeur: real("valeur").notNull(),
}, (t) => ({
pk: primaryKey({ columns: [t.numEtud, t.idUE] }),
}));
export const mobility = pgTable("mobility", {
id: serial("id").primaryKey(),
studentId: integer("studentId").references(() => students.numEtud),
startDate: date("startDate"),
endDate: date("endDate"),
weeksCount: integer("weeksCount"),
destinationCountry: text("destinationCountry"),
destinationName: text("destinationName"),
mobilityStatus: text("mobilityStatus").default("N/A"),
});
-19
View File
@@ -1,19 +0,0 @@
import { Handlers } from "$fresh/server.ts";
import { db } from "../../../../databases/db.ts";
import { ues } from "../../../../databases/schema.ts";
export const handler: Handlers = {
async GET() {
try {
const result = await db.select().from(ues);
return new Response(JSON.stringify(result), {
status: 200,
headers: { "Content-Type": "application/json" },
});
} catch (error) {
console.error("Error fetching UEs:", error);
return new Response("Failed to fetch data", { status: 500 });
}
},
};