newdrive/db/queries/authentication.sql
Elijah 715423ab8e
Some checks failed
CI / Backend (push) Failing after 1s
CI / Frontend (push) Successful in 13s
CI / Contracts and repository policy (push) Failing after 3s
CI / Container (push) Has been skipped
Implement owner setup and browser authentication sessions
2026-07-16 19:45:40 -07:00

162 lines
3.7 KiB
SQL

-- name: CreateOwner :one
INSERT INTO users (username, username_key, display_name, password_hash)
VALUES (
sqlc.arg(username),
sqlc.arg(username_key),
sqlc.arg(display_name),
sqlc.arg(password_hash)
)
RETURNING id::TEXT AS id;
-- name: CreateOwnerRootNode :one
INSERT INTO nodes (
owner_id,
parent_id,
name,
name_key,
node_type,
size_bytes,
node_revision,
content_revision,
content_modified_at,
metadata_updated_at
)
VALUES (
sqlc.arg(owner_id)::UUID,
NULL,
'Drive',
'drive',
'directory',
0,
1,
0,
sqlc.arg(created_at),
sqlc.arg(created_at)
)
RETURNING id::TEXT AS id;
-- name: SetOwnerRootNode :exec
UPDATE users
SET root_node_id = sqlc.arg(root_node_id)::UUID,
updated_at = sqlc.arg(updated_at)
WHERE id = sqlc.arg(owner_id)::UUID;
-- name: CreateRecoveryCode :exec
INSERT INTO recovery_codes (user_id, code_hash)
VALUES (sqlc.arg(owner_id)::UUID, sqlc.arg(code_hash));
-- name: CreateBrowserSession :one
INSERT INTO sessions (
owner_id,
token_hash,
csrf_token_hash,
remote_address,
user_agent,
authenticated_at,
last_seen_at,
expires_at
)
VALUES (
sqlc.arg(owner_id)::UUID,
sqlc.arg(token_hash),
sqlc.arg(csrf_token_hash),
NULLIF(sqlc.arg(remote_address), '')::INET,
NULLIF(sqlc.arg(user_agent), ''),
sqlc.arg(authenticated_at),
sqlc.arg(authenticated_at),
sqlc.arg(expires_at)
)
RETURNING id::TEXT AS id;
-- name: CreateInitialRootChange :exec
INSERT INTO changes (
owner_id,
event_type,
node_id,
node_revision,
content_revision,
resulting_state,
mutation_origin,
committed_at
)
VALUES (
sqlc.arg(owner_id)::UUID,
'node.created',
sqlc.arg(root_node_id)::UUID,
1,
0,
sqlc.arg(resulting_state)::JSONB,
sqlc.arg(mutation_origin)::JSONB,
sqlc.arg(committed_at)
);
-- name: CreateAuthenticationAuditEvent :exec
INSERT INTO audit_events (
owner_id,
actor,
action,
resource_type,
resource_id,
outcome,
details,
occurred_at
)
VALUES (
sqlc.arg(owner_id)::UUID,
sqlc.arg(actor)::JSONB,
sqlc.arg(action),
sqlc.arg(resource_type),
sqlc.arg(resource_id)::UUID,
sqlc.arg(outcome),
sqlc.arg(details)::JSONB,
sqlc.arg(occurred_at)
);
-- name: GetOwnerAuthenticationRecord :one
SELECT
id::TEXT AS id,
username,
username_key,
display_name,
password_hash
FROM users
LIMIT 1;
-- name: GetActiveBrowserSession :one
SELECT
sessions.id::TEXT AS session_id,
sessions.owner_id::TEXT AS owner_id,
users.username,
users.display_name,
sessions.csrf_token_hash,
sessions.authenticated_at,
sessions.last_seen_at,
sessions.expires_at
FROM sessions
JOIN users ON users.id = sessions.owner_id
WHERE sessions.token_hash = sqlc.arg(token_hash)
AND sessions.revoked_at IS NULL
AND sessions.expires_at > sqlc.arg(now_at)
LIMIT 1;
-- name: TouchBrowserSession :exec
UPDATE sessions
SET last_seen_at = sqlc.arg(seen_at)
WHERE id = sqlc.arg(session_id)::UUID
AND revoked_at IS NULL;
-- name: RevokeBrowserSession :execrows
UPDATE sessions
SET revoked_at = sqlc.arg(revoked_at)
WHERE id = sqlc.arg(session_id)::UUID
AND revoked_at IS NULL;
-- name: GetAuthenticationInvariantCounts :one
SELECT
(SELECT count(*) FROM users)::BIGINT AS owners,
(SELECT count(*) FROM nodes WHERE parent_id IS NULL)::BIGINT AS roots,
(SELECT count(*) FROM recovery_codes)::BIGINT AS recovery_codes,
(SELECT count(*) FROM changes)::BIGINT AS changes,
(SELECT count(*) FROM audit_events)::BIGINT AS audit_events,
(SELECT count(*) FROM sessions)::BIGINT AS sessions,
(SELECT count(*) FROM sessions WHERE revoked_at IS NULL)::BIGINT AS active_sessions;