87 lines
3.9 KiB
MySQL
87 lines
3.9 KiB
MySQL
|
|
-- =====================================================================
|
||
|
|
-- TeeCup — migrasjon 009
|
||
|
|
-- Landingssider: synlighet, org-profil, sponsorer (ADR-018)
|
||
|
|
-- =====================================================================
|
||
|
|
-- Kjøres etter 001-008. Alt additivt (nullable eller trygg default).
|
||
|
|
-- =====================================================================
|
||
|
|
|
||
|
|
\set ON_ERROR_STOP on
|
||
|
|
|
||
|
|
-- ---------------------------------------------------------------------
|
||
|
|
-- 1. Turnering: synlighet + presenterende tekst (ADR-018 Beslutning A/E)
|
||
|
|
--
|
||
|
|
-- Default 'org' -- ingen eksisterende eller nyopprettet turnering blir
|
||
|
|
-- offentlig av seg selv, organisator må aktivt velge å åpne opp.
|
||
|
|
-- ---------------------------------------------------------------------
|
||
|
|
ALTER TABLE tournament ADD COLUMN visibility text NOT NULL DEFAULT 'org'
|
||
|
|
CHECK (visibility IN ('public', 'org', 'participants'));
|
||
|
|
|
||
|
|
ALTER TABLE tournament ADD COLUMN description text;
|
||
|
|
|
||
|
|
-- Inert til MinIO-runden (bevisst utsatt, se ADR-018) -- kun kolonnen,
|
||
|
|
-- ingen opplastingslogikk.
|
||
|
|
ALTER TABLE tournament ADD COLUMN hero_image_key text;
|
||
|
|
|
||
|
|
-- ---------------------------------------------------------------------
|
||
|
|
-- 2. Organisasjon: offentlig profil (ADR-018 Beslutning F)
|
||
|
|
--
|
||
|
|
-- MERK: `organization.slug` finnes ALLEREDE, helt siden migrasjon 001
|
||
|
|
-- ("f.eks. subdomene/URL-vennlig", plain UNIQUE -- Postgres sin UNIQUE
|
||
|
|
-- behandler NULL som distinkt fra NULL, så "unik når satt" er allerede
|
||
|
|
-- garantert uten en egen partiell indeks). Oppdaget ved at denne
|
||
|
|
-- migrasjonen først feilet mot en fersk scratch-database ("column slug
|
||
|
|
-- already exists") -- IKKE lagt til på nytt her, kun brukt.
|
||
|
|
-- ---------------------------------------------------------------------
|
||
|
|
ALTER TABLE organization ADD COLUMN public_profile boolean NOT NULL DEFAULT false;
|
||
|
|
|
||
|
|
ALTER TABLE organization ADD CONSTRAINT organization_slug_format
|
||
|
|
CHECK (slug IS NULL OR slug ~ '^[a-z0-9]+(-[a-z0-9]+)*$');
|
||
|
|
|
||
|
|
ALTER TABLE organization ADD CONSTRAINT organization_public_profile_requires_slug
|
||
|
|
CHECK (NOT public_profile OR slug IS NOT NULL);
|
||
|
|
|
||
|
|
-- ---------------------------------------------------------------------
|
||
|
|
-- 3. Sponsorer (ADR-018 Beslutning E) -- navn+lenke aktivt, logo inert
|
||
|
|
-- til MinIO-runden.
|
||
|
|
-- ---------------------------------------------------------------------
|
||
|
|
CREATE TABLE tournament_sponsor (
|
||
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
|
|
organization_id uuid NOT NULL,
|
||
|
|
tournament_id uuid NOT NULL,
|
||
|
|
name text NOT NULL,
|
||
|
|
url text,
|
||
|
|
logo_key text, -- inert til MinIO-runden
|
||
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
||
|
|
FOREIGN KEY (organization_id, tournament_id)
|
||
|
|
REFERENCES tournament(organization_id, id) ON DELETE CASCADE
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE INDEX ON tournament_sponsor (organization_id, tournament_id);
|
||
|
|
|
||
|
|
ALTER TABLE tournament_sponsor ENABLE ROW LEVEL SECURITY;
|
||
|
|
ALTER TABLE tournament_sponsor FORCE ROW LEVEL SECURITY;
|
||
|
|
CREATE POLICY org_isolation ON tournament_sponsor
|
||
|
|
USING (organization_id = app_current_org())
|
||
|
|
WITH CHECK (organization_id = app_current_org());
|
||
|
|
|
||
|
|
GRANT SELECT, INSERT, UPDATE, DELETE ON tournament_sponsor TO teecup_app;
|
||
|
|
|
||
|
|
-- ---------------------------------------------------------------------
|
||
|
|
-- 4. public_org_by_slug() -- tredje SECURITY DEFINER-bro i dette
|
||
|
|
-- prosjektet (etter public_tournament_org 007, link_player_by_email
|
||
|
|
-- 008), samme mønster: løs kontekst-problemet FØR RLS kan håndheve
|
||
|
|
-- noe. Returnerer NULL for BÅDE "finnes ikke" og "finnes, men er
|
||
|
|
-- privat" -- samme anti-enumerering som magic-link (ADR-009).
|
||
|
|
-- ---------------------------------------------------------------------
|
||
|
|
CREATE FUNCTION public_org_by_slug(p_slug text)
|
||
|
|
RETURNS uuid
|
||
|
|
LANGUAGE sql
|
||
|
|
SECURITY DEFINER
|
||
|
|
SET search_path = public
|
||
|
|
STABLE
|
||
|
|
AS $$
|
||
|
|
SELECT id FROM organization WHERE slug = p_slug AND public_profile = true;
|
||
|
|
$$;
|
||
|
|
|
||
|
|
GRANT EXECUTE ON FUNCTION public_org_by_slug(text) TO teecup_app;
|