Tyler Gillispie 973fba0607
feat(phase-3): real-time hypermedia slices and client scripts migration (#58)
* feat(phase-3): migrate events and sessions hypermedia slices and client scripts

* docs(audit): add phase 3 post-implementation audit
2026-08-27 20:35:57 -07:00

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];
}