-- ===================================================================== -- TeeCup — migrasjon 079 -- Rangefinder-koordinater for OFFISIELLE (TeeOff-koblede) baner -- ===================================================================== -- Frem til nå har rangefinder-koordinater (golfapi_course_coordinate, -- 065/067/078) KUN eksistert for GolfAPI-importerte baner. Offisielle -- baner (course.source = 'official', koblet til den ekte teeoff- -- databasen via course.external_course_ref = "{facility_slug}: -- {teeoff_course_id}") har ALDRI hatt noen koordinatkilde -- verken for -- org-turneringer eller for frittstående runder spilt på en ekte -- teeoff-bane (round.course_source = 'teeoff'). Konkret anledning: -- bruker ba om at Tjøme Golfklubb sin OFFISIELLE bane (brukt av -- organisasjonen "Tjøme Gents") skal få samme feltbefarte koordinater -- som nettopp ble lagt inn på Erol sin PERSONLIGE GolfAPI-bane for -- Tjøme -- og at dette skal være en generell, gjenbrukbar mulighet for -- ALLE offisielle baner fremover, ikke en engangsfiks. -- -- DEL 1 -- delte domener for poi_type/location/side_fairway. To runder -- på rad (067: rock/layup, 078: landmark) måtte hver for seg utvide -- DEN SAMME CHECK-constraint-listen. Å innføre en ny tabell med en -- IDENTISK, dupliserende CHECK-liste ville gjort dette vedlikeholds- -- problemet permanent (to steder å huske å endre, garantert å skli). -- Domenene gir én kilde til sannhet -- fremtidige utvidelser endrer -- domenet ett sted, brukt av begge tabeller. -- -- DEL 2 -- teeoff_course_coordinate, samme kolonneform som -- golfapi_course_coordinate, men nøkkel er course.external_course_ref -- (tekst, IKKE en FK -- speiler at external_course_ref selv er en myk -- referanse, ingen global "teeoff_course"-tabell finnes å FK-e mot). -- GLOBAL (ikke org-scopet, ingen RLS) -- samme begrunnelse som -- golfapi_course_coordinate: flere organisasjoner kan importere samme -- fysiske bane fra teeoff hver sin course-rad, koordinatene skal deles, -- ikke registreres på nytt per organisasjon. -- ===================================================================== \set ON_ERROR_STOP on -- --- Del 1: delte domener ------------------------------------------- CREATE DOMAIN course_poi_type AS text CHECK (VALUE IN ( 'green', 'green_bunker', 'fairway_bunker', 'water', 'trees', 'marker_100', 'marker_150', 'marker_200', 'dogleg', 'road', 'tee_front', 'tee_back', 'rock', 'layup', 'landmark' )); CREATE DOMAIN course_poi_location AS text CHECK (VALUE IN ('front', 'middle', 'back')); CREATE DOMAIN course_poi_side AS text CHECK (VALUE IN ('left', 'center', 'right')); ALTER TABLE golfapi_course_coordinate DROP CONSTRAINT golfapi_course_coordinate_poi_type_check, DROP CONSTRAINT golfapi_course_coordinate_location_check, DROP CONSTRAINT golfapi_course_coordinate_side_fairway_check; ALTER TABLE golfapi_course_coordinate ALTER COLUMN poi_type TYPE course_poi_type USING poi_type::text::course_poi_type, ALTER COLUMN location TYPE course_poi_location USING location::text::course_poi_location, ALTER COLUMN side_fairway TYPE course_poi_side USING side_fairway::text::course_poi_side; -- --- Del 2: teeoff_course_coordinate --------------------------------- CREATE TABLE teeoff_course_coordinate ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), external_course_ref text NOT NULL, hole_number smallint NOT NULL CHECK (hole_number >= 1 AND hole_number <= 18), poi_type course_poi_type NOT NULL, location course_poi_location, side_fairway course_poi_side, latitude double precision NOT NULL CHECK (latitude >= -90 AND latitude <= 90), longitude double precision NOT NULL CHECK (longitude >= -180 AND longitude <= 180) ); CREATE INDEX ON teeoff_course_coordinate (external_course_ref, hole_number); GRANT SELECT, INSERT, UPDATE, DELETE ON teeoff_course_coordinate TO teecup_app;