/opt/canhelp/apps/api/src/lib
Edit: /opt/canhelp/apps/api/src/lib/activity.ts (1324B)
import { db } from '../db.js'
import { activityLogs, users } from '@canhelp/db'
import { eq } from 'drizzle-orm'
export async function logActivity(opts: {
userId?: string | null
userEmail?: string | null
userName?: string | null
event: string
details?: Record
| null
ipAddress?: string | null
userAgent?: string | null
}): Promise {
try {
let { userId, userEmail, userName } = opts
// Auto-fetch email/name if only userId is provided
if (userId && (!userEmail || !userName)) {
const [u] = await db
.select({ email: users.email, firstName: users.firstName, lastName: users.lastName, name: users.name })
.from(users)
.where(eq(users.id, userId))
.limit(1)
.catch(() => [])
if (u) {
userEmail = userEmail ?? u.email
userName = userName ?? (`${u.firstName} ${u.lastName}`.trim() || u.name)
}
}
await db.insert(activityLogs).values({
userId: userId ?? null,
userEmail: userEmail ?? null,
userName: userName ?? null,
event: opts.event,
details: opts.details ? JSON.stringify(opts.details) : null,
ipAddress: opts.ipAddress ?? null,
userAgent: opts.userAgent ?? null,
})
} catch {
// Never throw — logging must not break the main flow
}
}