feat: activity logs, gallery storage filter, and upload rate limits

Add per-user activity logs with storage backend tracking, gallery
storage filter, and IP/token upload rate limiting. Fix storage delete
modal flash, pin local backend in filter order, and link settings
version to GitHub releases.
This commit is contained in:
O96u committed 2026-08-26 17:09:38 +08:00
1 parent 901fefb3f5
commit 6fc054328d
34 files changed
+1357 -72

No files matched your search

+32 -3
View File
@@ -5,6 +5,7 @@ import type { StoredImage } from './storage'
import { getImageBaseUrl } from './env'
import { getActiveBackendRow } from './storage/resolver'
import { getStorageBackendRow, getStorageBackendFromEnv } from './storage-backends'
import type { StorageBackendType } from './storage/types'
import { buildObjectKey, parseS3Config } from './storage/s3'
import type { StorageBackendRow } from './storage/types'
@@ -24,10 +25,32 @@ export function resolveImageOwner(
}
}
export function resolveImageStorage(
backendId: string | undefined,
backendMap?: Map<string, { name: string, type: StorageBackendType }>
): ImageItem['storage'] | undefined {
if (!backendId) return undefined
const fromMap = backendMap?.get(backendId)
if (fromMap) {
return { id: backendId, name: fromMap.name, type: fromMap.type }
}
const row = getStorageBackendRow(backendId)
if (row) {
return { id: backendId, name: row.name, type: row.type }
}
return { id: backendId, name: backendId, type: 's3' }
}
export function mapStoredImageToItem(
event: H3Event,
stored: StoredImage,
options?: { ownerMap?: Map<number, string> }
options?: {
ownerMap?: Map<number, string>
backendMap?: Map<string, { name: string, type: StorageBackendType }>
}
): ImageItem {
const item = buildImageItem({
key: stored.key,
@@ -40,8 +63,14 @@ export function mapStoredImageToItem(
})
const owner = resolveImageOwner(stored.userId, options?.ownerMap)
if (owner) {
return { ...item, owner }
const storage = resolveImageStorage(stored.backendId, options?.backendMap)
if (owner || storage) {
return {
...item,
...(owner ? { owner } : {}),
...(storage ? { storage } : {})
}
}
return item