chore: reformat database schema files for readability
Applied consistent formatting and indentation across all schema files using Drizzle ORM to enhance code clarity and maintainability.
This commit is contained in:
@@ -1,46 +1,69 @@
|
||||
import {pgTable, varchar, timestamp, uuid, pgEnum, index, boolean, customType} from 'drizzle-orm/pg-core';
|
||||
import {
|
||||
pgTable,
|
||||
varchar,
|
||||
timestamp,
|
||||
uuid,
|
||||
pgEnum,
|
||||
index,
|
||||
boolean,
|
||||
customType,
|
||||
} from "drizzle-orm/pg-core";
|
||||
|
||||
// Type personnalisé pour les données chiffrées PGP (stockées en bytea dans Postgres)
|
||||
const pgpEncrypted = customType<{ data: string; driverData: string }>({
|
||||
dataType() {
|
||||
return 'bytea';
|
||||
},
|
||||
dataType() {
|
||||
return "bytea";
|
||||
},
|
||||
});
|
||||
|
||||
export const userStatus = pgEnum("user_status", ["active", "verification", "suspended", "pending", "deleted"])
|
||||
export const userStatus = pgEnum("user_status", [
|
||||
"active",
|
||||
"verification",
|
||||
"suspended",
|
||||
"pending",
|
||||
"deleted",
|
||||
]);
|
||||
|
||||
export const users = pgTable('users', {
|
||||
uuid: uuid().primaryKey().defaultRandom(),
|
||||
status: userStatus('status').default('pending').notNull(),
|
||||
|
||||
// Données Personnelles (PII) - Chiffrées nativement
|
||||
email: pgpEncrypted('email').notNull(),
|
||||
emailHash: varchar('email_hash', { length: 64 }).notNull().unique(), // Indexé pour recherche rapide et unicité
|
||||
displayName: varchar('display_name', { length: 32 }),
|
||||
|
||||
username: varchar('username', { length: 32 }).notNull().unique(),
|
||||
passwordHash: varchar('password_hash', { length: 72 }).notNull(),
|
||||
|
||||
// Sécurité
|
||||
twoFactorSecret: pgpEncrypted('two_factor_secret'),
|
||||
isTwoFactorEnabled: boolean('is_two_factor_enabled').notNull().default(false),
|
||||
|
||||
// RGPD & Conformité
|
||||
termsVersion: varchar('terms_version', { length: 16 }), // Version des CGU acceptées
|
||||
privacyVersion: varchar('privacy_version', { length: 16 }), // Version de la Privacy Policy acceptée
|
||||
gdprAcceptedAt: timestamp('gdpr_accepted_at', { withTimezone: true }),
|
||||
|
||||
// Dates de cycle de vie (Standards Entreprise)
|
||||
lastLoginAt: timestamp('last_login_at', { withTimezone: true }),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
deletedAt: timestamp('deleted_at', { withTimezone: true }), // Soft delete (Droit à l'oubli)
|
||||
}, (table) => ({
|
||||
uuidIdx: index('users_uuid_idx').on(table.uuid),
|
||||
emailHashIdx: index('users_email_hash_idx').on(table.emailHash),
|
||||
usernameIdx: index('users_username_idx').on(table.username),
|
||||
statusIdx: index('users_status_idx').on(table.status),
|
||||
}));
|
||||
export const users = pgTable(
|
||||
"users",
|
||||
{
|
||||
uuid: uuid().primaryKey().defaultRandom(),
|
||||
status: userStatus("status").default("pending").notNull(),
|
||||
|
||||
// Données Personnelles (PII) - Chiffrées nativement
|
||||
email: pgpEncrypted("email").notNull(),
|
||||
emailHash: varchar("email_hash", { length: 64 }).notNull().unique(), // Indexé pour recherche rapide et unicité
|
||||
displayName: varchar("display_name", { length: 32 }),
|
||||
|
||||
username: varchar("username", { length: 32 }).notNull().unique(),
|
||||
passwordHash: varchar("password_hash", { length: 72 }).notNull(),
|
||||
|
||||
// Sécurité
|
||||
twoFactorSecret: pgpEncrypted("two_factor_secret"),
|
||||
isTwoFactorEnabled: boolean("is_two_factor_enabled").notNull().default(false),
|
||||
|
||||
// RGPD & Conformité
|
||||
termsVersion: varchar("terms_version", { length: 16 }), // Version des CGU acceptées
|
||||
privacyVersion: varchar("privacy_version", { length: 16 }), // Version de la Privacy Policy acceptée
|
||||
gdprAcceptedAt: timestamp("gdpr_accepted_at", { withTimezone: true }),
|
||||
|
||||
// Dates de cycle de vie (Standards Entreprise)
|
||||
lastLoginAt: timestamp("last_login_at", { withTimezone: true }),
|
||||
createdAt: timestamp("created_at", { withTimezone: true })
|
||||
.notNull()
|
||||
.defaultNow(),
|
||||
updatedAt: timestamp("updated_at", { withTimezone: true })
|
||||
.notNull()
|
||||
.defaultNow(),
|
||||
deletedAt: timestamp("deleted_at", { withTimezone: true }), // Soft delete (Droit à l'oubli)
|
||||
},
|
||||
(table) => ({
|
||||
uuidIdx: index("users_uuid_idx").on(table.uuid),
|
||||
emailHashIdx: index("users_email_hash_idx").on(table.emailHash),
|
||||
usernameIdx: index("users_username_idx").on(table.username),
|
||||
statusIdx: index("users_status_idx").on(table.status),
|
||||
}),
|
||||
);
|
||||
|
||||
export type UserInDb = typeof users.$inferSelect;
|
||||
export type NewUserInDb = typeof users.$inferInsert;
|
||||
|
||||
Reference in New Issue
Block a user