auth-yes/ui/db_queries.ts
google-labs-jules[bot] eed5c8a0fd feat: Implement Phase 1 Event & Session Overhaul (Guest Ingress & Audits)
- Allowed guest accounts to be evaluated in `forward-auth`
- Validated `guest` account's `customScopes` and rejected ungranted access
- Added Array parameterization and `UNION` query in `getDashboardApps`
- Mapped `customScopes` to `getDashboardApps` in the UI route `/dashboard`
- Wired web and CLI joins in `events.ts` to `auditWrapper.auditLog` using correct schema (`event.id`, `{slug, method}`)
- Added `auditWrapper.auditLog` unit test validations in `events.test.ts`
- Added guest session scope unit tests in `forward_auth.test.ts`
- Moved Markdown tasks logic from `tasks/new/` to `tasks/complete/`

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-26 23:34:00 +00:00

160 lines
4.2 KiB
TypeScript

import { sql } from "../server/db.ts";
export async function getDashboardApps(
userId: string,
isAdmin: boolean,
customScopes?: string[],
) {
if (isAdmin) {
return await sql`
SELECT id, name, description, domain, 'Admin' as role
FROM apps
WHERE domain IS NOT NULL
ORDER BY name ASC
` as any[];
} else {
const appNames = (customScopes || [])
.filter((s) => s.startsWith("app:"))
.map((s) => s.split(":")[1]);
if (appNames.length > 0) {
return await sql`
SELECT a.id, a.name, a.description, a.domain, g.role
FROM apps a
JOIN grants g ON a.id = g.app_id
WHERE g.user_id = ${userId} AND a.domain IS NOT NULL
UNION
SELECT id, name, description, domain, 'Guest (Viewer)' as role
FROM apps
WHERE domain IS NOT NULL AND name = ANY(${appNames}::text[])
ORDER BY name ASC
` as any[];
} else {
return await sql`
SELECT a.id, a.name, a.description, a.domain, g.role
FROM apps a
JOIN grants g ON a.id = g.app_id
WHERE g.user_id = ${userId} AND a.domain IS NOT NULL
ORDER BY a.name ASC
` as any[];
}
}
}
export async function getSessionApps() {
return await sql`
SELECT id, name, domain, spiffe_id
FROM apps
ORDER BY name ASC
`;
}
export async function getUserSessions(userId: string) {
return await 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
`;
}
export async function getUserEventPasses(userId: string) {
return await sql`
SELECT id, slug, pin_code, name, max_seats, seats_claimed, is_active, expires_at
FROM event_passes
WHERE created_by = ${userId} AND is_active = TRUE
ORDER BY created_at DESC
`;
}
export async function getUserPasskeys(userId: string) {
return await sql`
SELECT id, credential_id, counter
FROM passkeys
WHERE user_id = ${userId}
`;
}
export async function getAdminUsers() {
return await sql`
SELECT id, username, display_name, account_status
FROM users
ORDER BY username ASC
`;
}
export async function getAdminApps() {
return await sql`
SELECT a.id, a.name, a.spiffe_id, a.description, a.created_at,
COUNT(g.id) AS active_grants_count
FROM apps a
LEFT JOIN grants g ON a.id = g.app_id
GROUP BY a.id, a.name, a.spiffe_id, a.description, a.created_at
ORDER BY a.created_at ASC
`;
}
export async function getAdminRoles() {
return await sql`
SELECT r.id, r.name, r.description, r.app_id, r.created_at,
a.name AS app_name
FROM roles r
LEFT JOIN apps a ON r.app_id = a.id
ORDER BY r.app_id NULLS FIRST, r.name ASC
`;
}
export async function getAdminInvites() {
return await sql`
SELECT i.id, i.code, i.role, i.max_uses, i.uses_count, i.auto_activate, i.expires_at, i.created_at, i.used_at,
a.name AS app_name, a.id AS app_id,
u.username AS used_by_username
FROM invites i
LEFT JOIN apps a ON i.app_id = a.id
LEFT JOIN users u ON i.used_by = u.id
ORDER BY i.created_at DESC
`;
}
export async function getAllRoles() {
return await sql`
SELECT id, name, description, app_id FROM roles ORDER BY name ASC
`;
}
export async function getAaguidAllowlist() {
return await sql`
SELECT id, aaguid, description, created_at
FROM aaguid_allowlist
ORDER BY created_at DESC
`;
}
export async function getAdminUserDetails(targetUserId: string) {
return await sql`
SELECT id, username, display_name, account_status
FROM users
WHERE id = ${targetUserId}
`.then((res) => res[0]);
}
export async function getUserGrants(targetUserId: string) {
return await sql`
SELECT g.id, g.app_id, g.role, g.created_at, a.name AS app_name, a.spiffe_id
FROM grants g
JOIN apps a ON g.app_id = a.id
WHERE g.user_id = ${targetUserId}
ORDER BY a.name ASC
`;
}
export async function getAdminAuditLogs() {
return await sql`
SELECT a.id, a.action, a.resource, a.details, a.ip_address, a.created_at, u.username as user
FROM audit_records a
LEFT JOIN users u ON a.user_id = u.id
ORDER BY a.created_at DESC
LIMIT 100
`;
}