68 lines
1.6 KiB
TypeScript
68 lines
1.6 KiB
TypeScript
import type { H3Event } from 'h3'
|
|
import { getHeader } from 'h3'
|
|
import {
|
|
insertActivityLog,
|
|
type LogAction,
|
|
type LogSource,
|
|
type LogStatus
|
|
} from './db'
|
|
import { verifyApiUploadToken } from './access'
|
|
import { clientIp } from './logger'
|
|
|
|
export const LOG_ACTIONS: LogAction[] = [
|
|
'upload',
|
|
'delete',
|
|
'login',
|
|
'edit',
|
|
'settings',
|
|
'tags'
|
|
]
|
|
|
|
export const LOG_SOURCES: LogSource[] = ['web', 'api', 'admin']
|
|
|
|
export function isLogAction(value: string): value is LogAction {
|
|
return LOG_ACTIONS.includes(value as LogAction)
|
|
}
|
|
|
|
export function isLogSource(value: string): value is LogSource {
|
|
return LOG_SOURCES.includes(value as LogSource)
|
|
}
|
|
|
|
export function resolveActivityLogSource(event: H3Event): LogSource {
|
|
if (verifyApiUploadToken(event)) {
|
|
return 'api'
|
|
}
|
|
const referer = getHeader(event, 'referer') ?? ''
|
|
if (/\/settings(?:[/?#]|$)|\/storage(?:[/?#]|$)/.test(referer)) {
|
|
return 'admin'
|
|
}
|
|
return 'web'
|
|
}
|
|
|
|
export interface ActivityLogEventInput {
|
|
action: LogAction
|
|
key: string
|
|
originalName: string
|
|
size?: number
|
|
contentType?: string
|
|
source?: LogSource
|
|
userId?: number | null
|
|
backendId?: string | null
|
|
status?: LogStatus
|
|
}
|
|
|
|
export function logActivity(event: H3Event, input: ActivityLogEventInput): void {
|
|
insertActivityLog({
|
|
action: input.action,
|
|
key: input.key,
|
|
originalName: input.originalName,
|
|
size: input.size ?? 0,
|
|
contentType: input.contentType ?? '',
|
|
source: input.source ?? resolveActivityLogSource(event),
|
|
userId: input.userId ?? null,
|
|
backendId: input.backendId ?? null,
|
|
ipAddress: clientIp(event),
|
|
status: input.status ?? 'success'
|
|
})
|
|
}
|