142 lines
3.4 KiB
TypeScript

import { mydb } from "./mySupabase.ts";
/**
* Registra uma ação do usuário na tabela user_actions
*/
export async function logUserAction(
userId: string | null | undefined,
externalUserId: string | null | undefined,
actionCategory: string,
actionType: string,
actionDescription: string,
resourceType?: string,
resourceId?: string,
oldData?: Record<string, unknown>,
newData?: Record<string, unknown>,
status: string = "success",
errorMessage?: string,
ipAddress?: string,
userAgent?: string
) {
try {
const actionRes = await mydb.from("user_actions").insert({
user_id: userId || null,
external_user_id: externalUserId || null,
action_category: actionCategory,
action_type: actionType,
action_description: actionDescription,
resource_type: resourceType || null,
resource_id: resourceId || null,
old_data: oldData || null,
new_data: newData || null,
status,
error_message: errorMessage || null,
ip_address: ipAddress || null,
user_agent: userAgent || null,
});
if (actionRes.error) {
console.warn("[logUserAction] Erro ao registrar ação:", actionRes.error);
}
return actionRes;
} catch (error) {
console.error("[logUserAction] Erro ao registrar ação:", error);
return null;
}
}
/**
* Cria uma sessão de usuário
*/
export async function createUserSession(
userId: string,
externalUserId?: string,
ipAddress?: string,
userAgent?: string,
authMethod: string = "password"
) {
try {
const sessionRes = await mydb
.from("user_sessions")
.insert({
user_id: userId,
external_user_id: externalUserId || null,
ip_address: ipAddress || null,
user_agent: userAgent || null,
auth_method: authMethod,
status: "active",
})
.select()
.single();
if (sessionRes.error) {
console.warn(
"[createUserSession] Erro ao criar sessão:",
sessionRes.error
);
return null;
}
return sessionRes.data;
} catch (error) {
console.error("[createUserSession] Erro ao criar sessão:", error);
return null;
}
}
/**
* Finaliza uma sessão do usuário
*/
export async function endUserSession(sessionId: string) {
try {
const now = new Date();
const res = await mydb
.from("user_sessions")
.select("login_at")
.eq("id", sessionId)
.single();
if (!res.data) {
return null;
}
const loginTime = new Date(res.data.login_at);
const durationSeconds = Math.round(
(now.getTime() - loginTime.getTime()) / 1000
);
const updateRes = await mydb
.from("user_sessions")
.update({
logout_at: now.toISOString(),
status: "expired",
duration_seconds: durationSeconds,
})
.eq("id", sessionId)
.select()
.single();
return updateRes.data;
} catch (error) {
console.error("[endUserSession] Erro ao finalizar sessão:", error);
return null;
}
}
/**
* Incrementa o contador de ações na sessão
*/
export async function incrementSessionActionCount(sessionId: string) {
try {
await mydb
.from("user_sessions")
.update({
action_count: mydb.rpc("increment", { row_id: sessionId }),
})
.eq("id", sessionId);
} catch (error) {
console.error("[incrementSessionActionCount] Erro:", error);
}
}