diff --git a/eme-backend/.env.example b/eme-backend/.env.example new file mode 100644 index 0000000..d20cbed --- /dev/null +++ b/eme-backend/.env.example @@ -0,0 +1,13 @@ +PORT=3000 +NODE_ENV=development +FRONTEND_URL=http://localhost:8080 + +DATABASE_URL="sqlserver://localhost:1433;database=eme_db;user=sa;password=YourStrongPassword123!;encrypt=true;trustServerCertificate=true" +DB_SERVER=localhost +DB_PORT=1433 +DB_NAME=eme_db +DB_USER=sa +DB_PASSWORD=YourStrongPassword123! + +AZURE_TENANT_ID= +AZURE_CLIENT_ID= diff --git a/eme-backend/prisma/migrations/20260602141919_init/migration.sql b/eme-backend/prisma/migrations/20260602141919_init/migration.sql new file mode 100644 index 0000000..231b349 --- /dev/null +++ b/eme-backend/prisma/migrations/20260602141919_init/migration.sql @@ -0,0 +1,71 @@ +BEGIN TRY + +BEGIN TRAN; + +-- CreateTable +CREATE TABLE [dbo].[campus] ( + [id] INT NOT NULL IDENTITY(1,1), + [nom] NVARCHAR(1000) NOT NULL, + [adresse] NVARCHAR(1000) NOT NULL, + [ville] NVARCHAR(1000) NOT NULL, + [code_postal] NVARCHAR(1000) NOT NULL, + [actif] BIT NOT NULL, + [created_at] DATETIME2 NOT NULL, + [updated_at] DATETIME2 NOT NULL, + CONSTRAINT [campus_pkey] PRIMARY KEY CLUSTERED ([id]) +); + +-- CreateTable +CREATE TABLE [dbo].[role] ( + [id] INT NOT NULL IDENTITY(1,1), + [code] NVARCHAR(1000) NOT NULL, + [libelle] NVARCHAR(1000) NOT NULL, + [description] NVARCHAR(1000) NOT NULL, + CONSTRAINT [role_pkey] PRIMARY KEY CLUSTERED ([id]) +); + +-- CreateTable +CREATE TABLE [dbo].[utilisateur] ( + [id] INT NOT NULL IDENTITY(1,1), + [microsoft_id] NVARCHAR(1000) NOT NULL, + [nom] NVARCHAR(1000) NOT NULL, + [prenom] NVARCHAR(1000) NOT NULL, + [email] NVARCHAR(1000) NOT NULL, + [classe] NVARCHAR(1000) NOT NULL, + [role_id] INT NOT NULL, + [campus_id] INT NOT NULL, + [actif] BIT NOT NULL, + [created_at] DATETIME2 NOT NULL, + [updated_at] DATETIME2 NOT NULL, + CONSTRAINT [utilisateur_pkey] PRIMARY KEY CLUSTERED ([id]) +); + +-- CreateTable +CREATE TABLE [dbo].[categorie_materiel] ( + [id] INT NOT NULL IDENTITY(1,1), + [nom] NVARCHAR(1000) NOT NULL, + [description] NVARCHAR(1000) NOT NULL, + [actif] BIT NOT NULL, + [created_at] DATETIME2 NOT NULL, + [updated_at] DATETIME2 NOT NULL, + CONSTRAINT [categorie_materiel_pkey] PRIMARY KEY CLUSTERED ([id]) +); + +-- AddForeignKey +ALTER TABLE [dbo].[utilisateur] ADD CONSTRAINT [utilisateur_role_id_fkey] FOREIGN KEY ([role_id]) REFERENCES [dbo].[role]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE [dbo].[utilisateur] ADD CONSTRAINT [utilisateur_campus_id_fkey] FOREIGN KEY ([campus_id]) REFERENCES [dbo].[campus]([id]) ON DELETE NO ACTION ON UPDATE CASCADE; + +COMMIT TRAN; + +END TRY +BEGIN CATCH + +IF @@TRANCOUNT > 0 +BEGIN + ROLLBACK TRAN; +END; +THROW + +END CATCH diff --git a/eme-backend/prisma/migrations/20260604103016_add_defaults_and_timestamps/migration.sql b/eme-backend/prisma/migrations/20260604103016_add_defaults_and_timestamps/migration.sql new file mode 100644 index 0000000..e31ba8e --- /dev/null +++ b/eme-backend/prisma/migrations/20260604103016_add_defaults_and_timestamps/migration.sql @@ -0,0 +1,25 @@ +BEGIN TRY + +BEGIN TRAN; + +-- AlterTable +ALTER TABLE [dbo].[campus] ADD CONSTRAINT [campus_actif_df] DEFAULT 1 FOR [actif], CONSTRAINT [campus_created_at_df] DEFAULT CURRENT_TIMESTAMP FOR [created_at]; + +-- AlterTable +ALTER TABLE [dbo].[categorie_materiel] ADD CONSTRAINT [categorie_materiel_actif_df] DEFAULT 1 FOR [actif], CONSTRAINT [categorie_materiel_created_at_df] DEFAULT CURRENT_TIMESTAMP FOR [created_at]; + +-- AlterTable +ALTER TABLE [dbo].[utilisateur] ADD CONSTRAINT [utilisateur_actif_df] DEFAULT 1 FOR [actif], CONSTRAINT [utilisateur_created_at_df] DEFAULT CURRENT_TIMESTAMP FOR [created_at]; + +COMMIT TRAN; + +END TRY +BEGIN CATCH + +IF @@TRANCOUNT > 0 +BEGIN + ROLLBACK TRAN; +END; +THROW + +END CATCH diff --git a/eme-backend/prisma/migrations/20260604125356_add_unique_constraints_and_nullable_classe/migration.sql b/eme-backend/prisma/migrations/20260604125356_add_unique_constraints_and_nullable_classe/migration.sql new file mode 100644 index 0000000..ef2a3c3 --- /dev/null +++ b/eme-backend/prisma/migrations/20260604125356_add_unique_constraints_and_nullable_classe/migration.sql @@ -0,0 +1,28 @@ +BEGIN TRY + +BEGIN TRAN; + +-- AlterTable +ALTER TABLE [dbo].[utilisateur] ALTER COLUMN [classe] NVARCHAR(1000) NULL; + +-- CreateIndex +ALTER TABLE [dbo].[role] ADD CONSTRAINT [role_code_key] UNIQUE NONCLUSTERED ([code]); + +-- CreateIndex +ALTER TABLE [dbo].[utilisateur] ADD CONSTRAINT [utilisateur_microsoft_id_key] UNIQUE NONCLUSTERED ([microsoft_id]); + +-- CreateIndex +ALTER TABLE [dbo].[utilisateur] ADD CONSTRAINT [utilisateur_email_key] UNIQUE NONCLUSTERED ([email]); + +COMMIT TRAN; + +END TRY +BEGIN CATCH + +IF @@TRANCOUNT > 0 +BEGIN + ROLLBACK TRAN; +END; +THROW + +END CATCH diff --git a/eme-backend/prisma/migrations/migration_lock.toml b/eme-backend/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..e2a882e --- /dev/null +++ b/eme-backend/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "mssql" diff --git a/eme-backend/prisma/schema.prisma b/eme-backend/prisma/schema.prisma new file mode 100644 index 0000000..ac247d6 --- /dev/null +++ b/eme-backend/prisma/schema.prisma @@ -0,0 +1,60 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "sqlserver" +} + +model Campus { + id Int @id @default(autoincrement()) + nom String + adresse String + ville String + codePostal String @map("code_postal") + actif Boolean @default(true) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + utilisateurs Utilisateur[] + + @@map("campus") +} + +model Role { + id Int @id @default(autoincrement()) + code String @unique + libelle String + description String + utilisateurs Utilisateur[] + + @@map("role") +} + +model Utilisateur { + id Int @id @default(autoincrement()) + microsoftId String @unique @map("microsoft_id") + nom String + prenom String + email String @unique + classe String? + roleId Int @map("role_id") + campusId Int @map("campus_id") + actif Boolean @default(true) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + campus Campus @relation(fields: [campusId], references: [id]) + role Role @relation(fields: [roleId], references: [id]) + + @@map("utilisateur") +} + +model CategorieMateriel { + id Int @id @default(autoincrement()) + nom String + description String + actif Boolean @default(true) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("categorie_materiel") +}