-- name: GetUser :one SELECT * FROM "user" WHERE id = $1; -- name: GetUserByEmail :one SELECT * FROM "user" WHERE email = $1; -- name: CreateUser :one INSERT INTO "user" (name, email, avatar_url) VALUES ($1, $2, $3) RETURNING *; -- name: UpdateUser :one UPDATE "user" SET name = COALESCE($2, name), avatar_url = COALESCE($3, avatar_url), updated_at = now() WHERE id = $1 RETURNING *; -- name: MarkUserOnboarded :one UPDATE "user" SET onboarded_at = COALESCE(onboarded_at, now()), updated_at = now() WHERE id = $1 RETURNING *; -- name: PatchUserOnboarding :one UPDATE "user" SET onboarding_questionnaire = COALESCE(sqlc.narg('questionnaire'), onboarding_questionnaire), updated_at = now() WHERE id = sqlc.arg('id') RETURNING *; -- name: JoinCloudWaitlist :one -- Records interest in cloud runtimes. Does NOT mark onboarding -- complete — the user still has to pick a real path (CLI / Skip) -- in Step 3. Repeating the call overwrites email + reason. UPDATE "user" SET cloud_waitlist_email = $2, cloud_waitlist_reason = $3, updated_at = now() WHERE id = $1 RETURNING *; -- name: SetStarterContentState :one -- Atomically transition starter_content_state. The handler is -- responsible for checking the current value first (to decide between -- "transition NULL -> imported and run the seeding" vs "already -- decided, short-circuit"). Using COALESCE here would swallow the -- transition, so this is a straight assignment. UPDATE "user" SET starter_content_state = $2, updated_at = now() WHERE id = $1 RETURNING *;