* feat(phase-3): migrate events and sessions hypermedia slices and client scripts * docs(audit): add phase 3 post-implementation audit
93 lines
2.6 KiB
TypeScript
93 lines
2.6 KiB
TypeScript
import { sqlWrapper } from "../../core/db.ts";
|
|
|
|
export async function getActiveSessions(userId: string) {
|
|
const sessions = await sqlWrapper.sql`
|
|
SELECT id, label, is_agent, custom_scopes, last_activity_at, last_activity_action, created_at, expires_at
|
|
FROM sessions
|
|
WHERE user_id = ${userId} AND expires_at > NOW()
|
|
ORDER BY created_at DESC
|
|
`;
|
|
return sessions;
|
|
}
|
|
|
|
export async function delegateSession(
|
|
sessionId: string,
|
|
userId: string,
|
|
label: string,
|
|
customScopes: string[],
|
|
expiresAt: Date,
|
|
) {
|
|
await sqlWrapper.sql`
|
|
INSERT INTO sessions (id, user_id, label, is_agent, custom_scopes, expires_at, created_at)
|
|
VALUES (${sessionId}, ${userId}, ${label}, true, ${customScopes}, ${expiresAt.toISOString()}, NOW())
|
|
`;
|
|
}
|
|
|
|
export async function getSessionByIdAndUserId(
|
|
sessionId: string,
|
|
userId: string,
|
|
) {
|
|
const session = await sqlWrapper.sql`
|
|
SELECT id, is_agent, expires_at FROM sessions WHERE id = ${sessionId} AND user_id = ${userId}
|
|
`;
|
|
if (!session || session.length === 0) return null;
|
|
return session[0];
|
|
}
|
|
|
|
export async function updateSessionScopes(
|
|
sessionId: string,
|
|
customScopes: string[],
|
|
) {
|
|
await sqlWrapper.sql`
|
|
UPDATE sessions SET custom_scopes = ${customScopes} WHERE id = ${sessionId}
|
|
`;
|
|
}
|
|
|
|
export async function getSessionById(sessionId: string) {
|
|
const session = await sqlWrapper.sql`
|
|
SELECT id FROM sessions WHERE id = ${sessionId}
|
|
`;
|
|
if (!session || session.length === 0) return null;
|
|
return session[0];
|
|
}
|
|
|
|
export async function setSessionPaused(sessionId: string, isPaused: boolean) {
|
|
await sqlWrapper.sql`
|
|
UPDATE sessions SET is_paused = ${isPaused} WHERE id = ${sessionId}
|
|
`;
|
|
}
|
|
|
|
export async function extendSessionExpiry(sessionId: string, newExpiry: Date) {
|
|
await sqlWrapper.sql`
|
|
UPDATE sessions SET expires_at = ${newExpiry.toISOString()} WHERE id = ${sessionId}
|
|
`;
|
|
}
|
|
|
|
export async function revokeSession(sessionId: string) {
|
|
await sqlWrapper.sql`DELETE FROM sessions WHERE id = ${sessionId}`;
|
|
}
|
|
|
|
export async function getSessionWithOwnershipCheck(
|
|
sessionId: string,
|
|
userId: string,
|
|
isAdmin: boolean,
|
|
) {
|
|
const session = await sqlWrapper.sql`
|
|
SELECT s.id
|
|
FROM sessions s
|
|
JOIN users u ON s.user_id = u.id
|
|
WHERE s.id = ${sessionId}
|
|
AND (
|
|
s.user_id = ${userId}
|
|
OR ${isAdmin}
|
|
OR EXISTS (
|
|
SELECT 1 FROM event_passes ep
|
|
WHERE ep.created_by = ${userId}
|
|
AND u.event_pass_id = ep.id
|
|
)
|
|
)
|
|
`;
|
|
if (!session || session.length === 0) return null;
|
|
return session[0];
|
|
}
|