mirror of
https://github.com/xCyanGrizzly/DragonsStash.git
synced 2026-05-11 06:11:15 +00:00
feat: file upload from UI, notification dismiss, audit false positive fix
Manual file upload:
- Upload dialog in STL page with drag-and-drop file picker
- Files saved to shared Docker volume (/data/uploads)
- Worker processes via pg_notify('manual_upload') channel
- Hashes, reads metadata, splits >2GB, uploads to Telegram
- Multiple files automatically grouped
- Status polling shows upload/processing/complete states
Notification fixes:
- Add dismiss (X) button on each notification
- Add "Clear" button to remove all notifications
- Fix false positive MISSING_PART alerts from legacy packages
(only flag when >1 destMessageIds stored but count wrong,
not when only 1 ID from backfill)
Infrastructure:
- ManualUpload + ManualUploadFile schema + migration
- Shared manual_uploads Docker volume between app and worker
- Upload API routes (POST /api/uploads, GET /api/uploads/[id])
- Worker manual-upload processor with full pipeline
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -39,9 +39,10 @@ model User {
|
||||
settings UserSettings?
|
||||
telegramLink TelegramLink?
|
||||
kickstarters Kickstarter[]
|
||||
inviteCodes InviteCode[] @relation("InviteCreator")
|
||||
usedInvite InviteCode? @relation("InviteUser", fields: [usedInviteId], references: [id], onDelete: SetNull)
|
||||
usedInviteId String?
|
||||
inviteCodes InviteCode[] @relation("InviteCreator")
|
||||
usedInvite InviteCode? @relation("InviteUser", fields: [usedInviteId], references: [id], onDelete: SetNull)
|
||||
usedInviteId String?
|
||||
manualUploads ManualUpload[]
|
||||
}
|
||||
|
||||
model Account {
|
||||
@@ -865,3 +866,40 @@ model GroupingRule {
|
||||
@@index([sourceChannelId])
|
||||
@@map("grouping_rules")
|
||||
}
|
||||
|
||||
enum ManualUploadStatus {
|
||||
PENDING
|
||||
PROCESSING
|
||||
COMPLETED
|
||||
FAILED
|
||||
}
|
||||
|
||||
model ManualUpload {
|
||||
id String @id @default(cuid())
|
||||
status ManualUploadStatus @default(PENDING)
|
||||
groupName String? // Group name if multiple files
|
||||
userId String
|
||||
errorMessage String?
|
||||
createdAt DateTime @default(now())
|
||||
completedAt DateTime?
|
||||
|
||||
files ManualUploadFile[]
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
|
||||
@@index([status])
|
||||
@@map("manual_uploads")
|
||||
}
|
||||
|
||||
model ManualUploadFile {
|
||||
id String @id @default(cuid())
|
||||
uploadId String
|
||||
fileName String
|
||||
filePath String // Path on shared volume
|
||||
fileSize BigInt
|
||||
packageId String? // Set after processing
|
||||
|
||||
upload ManualUpload @relation(fields: [uploadId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([uploadId])
|
||||
@@map("manual_upload_files")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user