enum BADGES { P1 P2 P3 D1 D2 D3 DAY1 V1Veteran } enum PERMISSION { ADMIN_EVENT ADMIN_USER ADMIN_USER_ADVANCED ADMIN_STATION ADMIN_KEYWORD ADMIN_MESSAGE ADMIN_KICK ADMIN_HELIPORT ADMIN_CHANGELOG ADMIN_BOOKING AUDIO PILOT DISPO LOGIN_NEXTCLOUD } model User { id String @id @default(uuid()) publicId String @unique firstname String lastname String email String @unique password String vatsimCid String? @map(name: "vatsim_cid") moodleId Int? @map(name: "moodle_id") changelogAck Boolean @default(false) // Settings: pathSelected Boolean @default(false) migratedFromV1 Boolean @default(false) settingsNtfyRoom String? @map(name: "settings_ntfy_room") settingsMicDevice String? @map(name: "settings_mic_device") settingsMicVolume Float? @map(name: "settings_mic_volume") settingsDmeVolume Float? @map(name: "settings_dme_volume") settingsRadioVolume Float? @map(name: "settings_funk_volume") settingsHideLastname Boolean @default(false) @map(name: "settings_hide_lastname") settingsAutoCloseMapPopup Boolean @default(false) @map(name: "settings_auto_close_map_popup") settingsUseHPGAsDispatcher Boolean @default(true) @map(name: "settings_use_hpg_as_dispatcher") // email Verification: emailVerificationToken String? @map(name: "email_verification_token") emailVerificationExpiresAt DateTime? @map(name: "email_verification_expires_at") emailVerified Boolean @default(false) image String? badges BADGES[] @default([]) permissions PERMISSION[] @default([]) createdAt DateTime @default(now()) @map(name: "created_at") updatedAt DateTime @default(now()) @map(name: "updated_at") isBanned Boolean @default(false) @map(name: "is_banned") // Duplicate handling: canonicalUserId String? @map(name: "canonical_user_id") CanonicalUser User? @relation("CanonicalUser", fields: [canonicalUserId], references: [id]) Duplicates User[] @relation("CanonicalUser") duplicateDetectedAt DateTime? @map(name: "duplicate_detected_at") duplicateReason String? @map(name: "duplicate_reason") isDeleted Boolean @default(false) @map(name: "is_deleted") // relations: oauthTokens OAuthToken[] participants Participant[] SentMessages ChatMessage[] @relation("SentMessages") ReceivedMessages ChatMessage[] @relation("ReceivedMessages") SentReports Report[] @relation("SentReports") ReceivedReports Report[] @relation("ReceivedReports") ReviewedReports Report[] @relation("ReviewedReports") Mission Mission[] MissionOnStationUsers MissionOnStationUsers[] ConnectedDispatcher ConnectedDispatcher[] ConnectedAircraft ConnectedAircraft[] PositionLog PositionLog[] Penaltys Penalty[] @relation("User") CreatedPenalties Penalty[] @relation("CreatedPenalties") Logs Log[] Bookings Booking[] DiscordAccount DiscordAccount? FormerDiscordAccounts FormerDiscordAccount[] @@map(name: "users") } model FormerDiscordAccount { discordId String @unique @map(name: "discord_id") userId String @map(name: "user_id") removedAt DateTime @default(now()) @map(name: "removed_at") DiscordAccount DiscordAccount? @relation(fields: [discordId], references: [discordId], onDelete: SetNull) User User @relation(fields: [userId], references: [id], onDelete: Cascade) @@id([discordId, userId]) } model DiscordAccount { id Int @id @default(autoincrement()) discordId String @unique @map(name: "discord_id") email String @map(name: "email") username String @map(name: "username") avatar String? @map(name: "avatar") globalName String @map(name: "global_name") verified Boolean @default(false) accessToken String? @map(name: "access_token") refreshToken String @map(name: "refresh_token") tokenType String @map(name: "token_type") createdAt DateTime @default(now()) @map(name: "created_at") updatedAt DateTime @default(now()) @map(name: "updated_at") // Related User userId String? @unique User User? @relation(fields: [userId], references: [id], onDelete: SetNull) formerDiscordAccount FormerDiscordAccount? @@map(name: "discord_accounts") }