Files
Palmr/apps/server/prisma/schema.prisma
Daniel Luiz Alves f3f792e053 feat(auth): enhance trusted device management for 2FA
- Added lastUsedAt timestamp to the TrustedDevice model for tracking device usage.
- Implemented new endpoints for retrieving and removing trusted devices.
- Updated AuthService to manage trusted devices, including methods for getting and removing devices.
- Enhanced the user interface to support trusted device management, including modals for removing devices.
- Added translations for new messages related to trusted devices in multiple languages.
2025-07-09 23:43:57 -03:00

288 lines
6.8 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
firstName String
lastName String
username String @unique
email String @unique
password String?
image String?
isAdmin Boolean @default(false)
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
twoFactorEnabled Boolean @default(false)
twoFactorSecret String?
twoFactorBackupCodes String?
twoFactorVerified Boolean @default(false)
files File[]
shares Share[]
reverseShares ReverseShare[]
loginAttempts LoginAttempt?
passwordResets PasswordReset[]
authProviders UserAuthProvider[]
trustedDevices TrustedDevice[]
@@map("users")
}
model File {
id String @id @default(cuid())
name String
description String?
extension String
size BigInt
objectName String
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
shares Share[] @relation("ShareFiles")
@@map("files")
}
model Share {
id String @id @default(cuid())
name String?
views Int @default(0)
expiration DateTime?
description String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
creatorId String?
creator User? @relation(fields: [creatorId], references: [id], onDelete: SetNull)
securityId String @unique
security ShareSecurity @relation(fields: [securityId], references: [id])
files File[] @relation("ShareFiles")
recipients ShareRecipient[]
alias ShareAlias?
@@map("shares")
}
model ShareSecurity {
id String @id @default(cuid())
password String?
maxViews Int?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
share Share?
@@map("share_security")
}
model ShareRecipient {
id String @id @default(cuid())
email String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
shareId String
share Share @relation(fields: [shareId], references: [id], onDelete: Cascade)
@@map("share_recipients")
}
model AppConfig {
id String @id @default(cuid())
key String @unique
value String
type String
group String
isSystem Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("app_configs")
}
model LoginAttempt {
id String @id @default(cuid())
userId String @unique
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
attempts Int @default(1)
lastAttempt DateTime @default(now())
@@map("login_attempts")
}
model PasswordReset {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
token String @unique
expiresAt DateTime
used Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("password_resets")
}
model ShareAlias {
id String @id @default(cuid())
alias String @unique
shareId String @unique
share Share @relation(fields: [shareId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("share_aliases")
}
model AuthProvider {
id String @id @default(cuid())
name String @unique
displayName String
type String
icon String?
enabled Boolean @default(false)
issuerUrl String?
clientId String?
clientSecret String?
redirectUri String?
scope String? @default("openid profile email")
authorizationEndpoint String?
tokenEndpoint String?
userInfoEndpoint String?
metadata String?
autoRegister Boolean @default(true)
adminEmailDomains String?
sortOrder Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userAuthProviders UserAuthProvider[]
@@map("auth_providers")
}
model UserAuthProvider {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
providerId String
authProvider AuthProvider @relation(fields: [providerId], references: [id], onDelete: Cascade)
provider String?
externalId String
metadata String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([userId, providerId])
@@unique([providerId, externalId])
@@map("user_auth_providers")
}
model ReverseShare {
id String @id @default(cuid())
name String?
description String?
expiration DateTime?
maxFiles Int?
maxFileSize BigInt?
allowedFileTypes String?
password String?
pageLayout PageLayout @default(DEFAULT)
isActive Boolean @default(true)
nameFieldRequired FieldRequirement @default(OPTIONAL)
emailFieldRequired FieldRequirement @default(OPTIONAL)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
creatorId String
creator User @relation(fields: [creatorId], references: [id], onDelete: Cascade)
files ReverseShareFile[]
alias ReverseShareAlias?
@@map("reverse_shares")
}
model ReverseShareFile {
id String @id @default(cuid())
name String
description String?
extension String
size BigInt
objectName String
uploaderEmail String?
uploaderName String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
reverseShareId String
reverseShare ReverseShare @relation(fields: [reverseShareId], references: [id], onDelete: Cascade)
@@map("reverse_share_files")
}
model ReverseShareAlias {
id String @id @default(cuid())
alias String @unique
reverseShareId String @unique
reverseShare ReverseShare @relation(fields: [reverseShareId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("reverse_share_aliases")
}
enum FieldRequirement {
HIDDEN
OPTIONAL
REQUIRED
}
enum PageLayout {
DEFAULT
WETRANSFER
}
model TrustedDevice {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
deviceHash String @unique
deviceName String?
userAgent String?
ipAddress String?
lastUsedAt DateTime @default(now())
expiresAt DateTime
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("trusted_devices")
}