Tanya de2144be2a feat: Add new scripts and update project structure for database management and user authentication
This commit introduces several new scripts for managing database operations, including user creation, permission grants, and data migrations. It also adds new documentation files to guide users through the setup and configuration processes. Additionally, the project structure is updated to enhance organization and maintainability, ensuring a smoother development experience for contributors. These changes support the ongoing transition to a web-based architecture and improve overall project functionality.
2026-01-06 13:53:24 -05:00

215 lines
8.2 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model AlembicVersion {
@@map("alembic_version")
version_num String @id
}
model Face {
@@map("faces")
id Int @id @default(autoincrement())
photo_id Int
person_id Int?
encoding Bytes
location String
confidence Decimal
quality_score Decimal
is_primary_encoding Boolean
detector_backend String
model_name String
face_confidence Decimal
exif_orientation Int?
pose_mode String
yaw_angle Decimal?
pitch_angle Decimal?
roll_angle Decimal?
landmarks String?
identified_by_user_id Int?
excluded Boolean @default(false)
Person Person? @relation(fields: [person_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
Photo Photo @relation(fields: [photo_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
User User? @relation(fields: [identified_by_user_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
PersonEncoding PersonEncoding[]
@@index([excluded], map: "idx_faces_excluded")
@@index([identified_by_user_id], map: "idx_faces_identified_by")
@@index([pose_mode], map: "idx_faces_pose_mode")
@@index([photo_id], map: "ix_faces_photo_id")
@@index([quality_score], map: "idx_faces_quality")
@@index([photo_id], map: "idx_faces_photo_id")
@@index([id], map: "ix_faces_id")
@@index([person_id], map: "idx_faces_person_id")
@@index([person_id], map: "ix_faces_person_id")
@@index([quality_score], map: "ix_faces_quality_score")
@@index([pose_mode], map: "ix_faces_pose_mode")
}
model Person {
@@map("people")
id Int @id @default(autoincrement())
first_name String
last_name String
middle_name String?
maiden_name String?
date_of_birth DateTime?
created_date DateTime
Face Face[]
PersonEncoding PersonEncoding[]
PhotoPersonLinkage PhotoPersonLinkage[]
@@unique([first_name, last_name, middle_name, maiden_name, date_of_birth], map: "sqlite_autoindex_people_1")
@@index([id], map: "ix_people_id")
}
model PersonEncoding {
@@map("person_encodings")
id Int @id @default(autoincrement())
person_id Int
face_id Int
encoding Bytes
quality_score Decimal
detector_backend String
model_name String
created_date DateTime
Face Face @relation(fields: [face_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
Person Person @relation(fields: [person_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
@@index([person_id], map: "ix_person_encodings_person_id")
@@index([quality_score], map: "idx_person_encodings_quality")
@@index([id], map: "ix_person_encodings_id")
@@index([face_id], map: "ix_person_encodings_face_id")
@@index([person_id], map: "idx_person_encodings_person_id")
@@index([quality_score], map: "ix_person_encodings_quality_score")
}
model PhotoFavorite {
@@map("photo_favorites")
id Int @id @default(autoincrement())
username String
photo_id Int
created_date DateTime
Photo Photo @relation(fields: [photo_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
@@unique([username, photo_id], map: "sqlite_autoindex_photo_favorites_1")
@@index([username], map: "ix_photo_favorites_username")
@@index([username], map: "idx_favorites_username")
@@index([photo_id], map: "idx_favorites_photo")
@@index([photo_id], map: "ix_photo_favorites_photo_id")
}
model PhotoPersonLinkage {
@@map("photo_person_linkage")
id Int @id @default(autoincrement())
photo_id Int
person_id Int
identified_by_user_id Int?
created_date DateTime
User User? @relation(fields: [identified_by_user_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
Person Person @relation(fields: [person_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
Photo Photo @relation(fields: [photo_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
@@unique([photo_id, person_id], map: "sqlite_autoindex_photo_person_linkage_1")
@@index([identified_by_user_id], map: "idx_photo_person_user")
@@index([person_id], map: "idx_photo_person_person")
@@index([photo_id], map: "idx_photo_person_photo")
@@index([photo_id], map: "ix_photo_person_linkage_photo_id")
@@index([person_id], map: "ix_photo_person_linkage_person_id")
@@index([identified_by_user_id], map: "ix_photo_person_linkage_identified_by_user_id")
}
model Photo {
@@map("photos")
id Int @id @default(autoincrement())
path String @unique(map: "ix_photos_path")
filename String
date_added DateTime
date_taken DateTime?
processed Boolean
media_type String?
Face Face[]
PhotoFavorite PhotoFavorite[]
PhotoPersonLinkage PhotoPersonLinkage[]
PhotoTagLinkage PhotoTagLinkage[]
@@index([media_type], map: "idx_photos_media_type")
@@index([date_added], map: "idx_photos_date_added")
@@index([date_taken], map: "idx_photos_date_taken")
@@index([processed], map: "ix_photos_processed")
@@index([processed], map: "idx_photos_processed")
@@index([date_taken], map: "ix_photos_date_taken")
@@index([id], map: "ix_photos_id")
}
model PhotoTagLinkage {
@@map("phototaglinkage")
linkage_id Int @id @default(autoincrement())
photo_id Int
tag_id Int
linkage_type Int @default(0)
created_date DateTime
Tag Tag @relation(fields: [tag_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
Photo Photo @relation(fields: [photo_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
@@unique([photo_id, tag_id], map: "sqlite_autoindex_phototaglinkage_1")
@@index([tag_id], map: "ix_phototaglinkage_tag_id")
@@index([photo_id], map: "ix_phototaglinkage_photo_id")
@@index([tag_id], map: "idx_photo_tags_tag")
@@index([photo_id], map: "idx_photo_tags_photo")
}
model role_permissions {
id Int @id @default(autoincrement())
role String
feature_key String
allowed Boolean @default(false)
@@unique([role, feature_key], map: "sqlite_autoindex_role_permissions_1")
@@index([feature_key], map: "ix_role_permissions_feature_key")
@@index([role], map: "ix_role_permissions_role")
@@index([role, feature_key], map: "idx_role_permissions_role_feature")
}
model Tag {
@@map("tags")
id Int @id @default(autoincrement())
tag_name String @unique(map: "ix_tags_tag_name")
created_date DateTime
PhotoTagLinkage PhotoTagLinkage[]
@@index([id], map: "ix_tags_id")
}
model User {
@@map("users")
id Int @id @default(autoincrement())
username String @unique(map: "ix_users_username")
password_hash String
email String @unique(map: "ix_users_email")
full_name String
is_active Boolean
is_admin Boolean
role String @default("viewer")
password_change_required Boolean
created_date DateTime
last_login DateTime?
Face Face[]
PhotoPersonLinkage PhotoPersonLinkage[]
@@index([email], map: "idx_users_email")
@@index([username], map: "idx_users_username")
@@index([id], map: "ix_users_id")
@@index([password_change_required], map: "ix_users_password_change_required")
@@index([role], map: "idx_users_role")
@@index([role], map: "ix_users_role")
@@index([password_change_required], map: "idx_users_password_change_required")
@@index([is_admin], map: "idx_users_is_admin")
@@index([is_admin], map: "ix_users_is_admin")
}