-- 0016 · SNS 게재 글 -- -- ★ 번호가 0012·0013 이었는데 main 에 같은 번호가 이미 있어서(0012_place_faqs_template_source, -- 0013_job_progress) 병합하며 뒤로 밀었다. migrate.py 는 파일명 정렬로 돌고 적용 이력도 -- 파일명(stem)으로 남기므로, 이미 옛 이름으로 적용된 DB 는 이 파일을 한 번 더 돌린다 — -- 안에 있는 문장이 전부 IF NOT EXISTS 라 두 번 돌아도 결과가 같다(그래서 밀 수 있었다). CREATE TABLE IF NOT EXISTS public.place_social_posts ( post_id uuid PRIMARY KEY DEFAULT gen_random_uuid(), place_id uuid NOT NULL, user_id uuid NOT NULL, site_version_id uuid NOT NULL, account_id uuid, provider smallint NOT NULL CHECK (provider IN (1,2)), body text NOT NULL DEFAULT '', link_url text NOT NULL, grounded_facts jsonb NOT NULL DEFAULT '[]', status varchar(24) NOT NULL DEFAULT 'DRAFTING', approval_token_sha varchar(64), approval_sent_at timestamptz, approval_channel varchar(20), approval_expires_at timestamptz, decided_at timestamptz, decided_via varchar(20), provider_post_id varchar(200), permalink text, posted_at timestamptz, last_error text, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), deleted boolean NOT NULL DEFAULT false ); -- 게시 성공 뒤의 이중 클릭도 막는다. 같은 버전은 기존 초안을 재사용한다. CREATE UNIQUE INDEX IF NOT EXISTS uq_social_version ON public.place_social_posts(place_id, site_version_id) WHERE deleted=false; CREATE INDEX IF NOT EXISTS idx_social_posted ON public.place_social_posts(place_id, posted_at DESC) WHERE deleted=false AND status='POSTED';