Spaces:
Sleeping
Sleeping
| -- 009_user_completions.sql | |
| -- Per-category completion counter used by the certificate eligibility check | |
| -- (CERT_REQUIRED_COMPLETIONS = 50 in app.core.constants). | |
| -- | |
| -- A row in this table means the user has *successfully solved* a challenge | |
| -- in `category`. The (user_id, category, challenge_id) UNIQUE makes | |
| -- /api/training/solved idempotent: duplicate inserts are no-ops. | |
| -- | |
| -- This table used to live in 010_vulnerability_hunter_challenges.sql | |
| -- (which is where it was first introduced). It is split out into its | |
| -- own migration here so that re-running the vulnerability-hunter | |
| -- migration after the table is created elsewhere doesn't accidentally | |
| -- drop the unique index. | |
| BEGIN; | |
| CREATE TABLE IF NOT EXISTS public.user_completions ( | |
| id uuid PRIMARY KEY DEFAULT gen_random_uuid(), | |
| user_id uuid NOT NULL, | |
| category text NOT NULL, -- e.g. 'vulnerability-hunter', 'code-fixing', 'log-analysis' | |
| module text NOT NULL DEFAULT '', | |
| challenge_id text NOT NULL, | |
| xp_awarded integer DEFAULT 0, | |
| created_at timestamptz DEFAULT now(), | |
| UNIQUE (user_id, category, challenge_id) | |
| ); | |
| CREATE INDEX IF NOT EXISTS idx_user_completions_user_cat | |
| ON public.user_completions (user_id, category); | |
| ALTER TABLE public.user_completions ENABLE ROW LEVEL SECURITY; | |
| DROP POLICY IF EXISTS "Open read user_completions" ON public.user_completions; | |
| CREATE POLICY "Open read user_completions" | |
| ON public.user_completions FOR SELECT USING (true); | |
| DROP POLICY IF EXISTS "Service role insert user_completions" ON public.user_completions; | |
| CREATE POLICY "Service role insert user_completions" | |
| ON public.user_completions FOR INSERT WITH CHECK (true); | |
| COMMIT; | |