mirror of
https://github.com/kyantech/Palmr.git
synced 2025-10-23 06:11:58 +00:00
- 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.
288 lines
6.8 KiB
Plaintext
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")
|
|
}
|