diff --git a/lib/user-data.ts b/lib/user-data.ts index 594685b2..5d2f557b 100644 --- a/lib/user-data.ts +++ b/lib/user-data.ts @@ -1,16 +1,72 @@ import { db } from "@/lib/db"; +const SENSITIVE_KEYS = [ + "email", + "phone", + "ssn", + "password", + "token", + "secret", + "apikey", + "api_key", + "secretkey", + "private_key", + "access_key", + "auth", + "credential", +]; + +const redactParams = (params: Record): Record => { + const redacted: Record = {}; + for (const [key, value] of Object.entries(params)) { + const lowerKey = key.toLowerCase(); + if (SENSITIVE_KEYS.some((sensitive) => lowerKey.includes(sensitive))) { + redacted[key] = "[REDACTED]"; + } else if (value !== null && typeof value === "object" && !Array.isArray(value)) { + // Recursively redact nested objects + redacted[key] = redactParams(value as Record); + } else if (Array.isArray(value)) { + // Redact array elements that are objects + redacted[key] = value.map((item) => + item !== null && typeof item === "object" + ? redactParams(item as Record) + : item + ); + } else { + redacted[key] = value; + } + } + return redacted; +}; + +const logError = ( + functionName: string, + params: Record, + error: unknown +) => { + console.error( + JSON.stringify({ + timestamp: new Date().toISOString(), + level: "error", + context: functionName, + params: redactParams(params), + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + ); +}; + export const getUserById = async (id: string) => { try { const user = await db.user.findUnique({ where: { id }, include: { - accounts: true - } + accounts: true, + }, }); return user; - } catch (error) { - console.log(error); + } catch (err) { + logError("getUserById", { id }, err); return null; } }; @@ -18,11 +74,11 @@ export const getUserById = async (id: string) => { export const getUserByEmail = async (email: string) => { try { const user = await db.user.findUnique({ - where: { email } + where: { email }, }); return user; - } catch (error) { - console.log(error); + } catch (err) { + logError("getUserByEmail", { email }, err); return null; } }; @@ -31,12 +87,12 @@ export const getAccountByUserId = async (userId: string) => { try { const account = await db.account.findFirst({ where: { - userId - } + userId, + }, }); return account; - } catch (error) { - console.log(error); + } catch (err) { + logError("getAccountByUserId", { userId }, err); return null; } };