owpengram-server/deploy/migrations/0089_star_gift_catalog.up.sql
2026-07-16 12:38:53 +08:00

81 lines
4 KiB
PL/PgSQL

-- Durable, administrator-managed regular Star Gift catalog. The previous seven-item
-- animated_emoji-derived directory was development-only and is intentionally not migrated.
-- Existing received rows refer to those non-durable definitions, so clear them instead of
-- manufacturing a read-time compatibility fallback that could no longer reconstruct assets.
CREATE SEQUENCE public.star_gift_catalog_gift_id_seq AS bigint START WITH 9000000000000001;
CREATE SEQUENCE public.star_gift_catalog_revision_id_seq AS bigint START WITH 1;
CREATE TABLE public.star_gift_catalog (
gift_id bigint DEFAULT nextval('public.star_gift_catalog_gift_id_seq') NOT NULL,
active_revision_id bigint NOT NULL,
enabled boolean DEFAULT true NOT NULL,
sort_order integer DEFAULT 0 NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL,
CONSTRAINT star_gift_catalog_pkey PRIMARY KEY (gift_id)
);
CREATE TABLE public.star_gift_catalog_revisions (
id bigint DEFAULT nextval('public.star_gift_catalog_revision_id_seq') NOT NULL,
gift_id bigint NOT NULL,
revision integer NOT NULL,
title text DEFAULT '' NOT NULL,
stars bigint NOT NULL,
convert_stars bigint NOT NULL,
document_id bigint NOT NULL,
animation_json jsonb NOT NULL,
animation_sha256 bytea NOT NULL,
source_name text DEFAULT '' NOT NULL,
source_format text NOT NULL,
width integer NOT NULL,
height integer NOT NULL,
frame_rate double precision DEFAULT 0 NOT NULL,
in_point double precision DEFAULT 0 NOT NULL,
out_point double precision DEFAULT 0 NOT NULL,
created_by text DEFAULT '' NOT NULL,
command_id text DEFAULT '' NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
CONSTRAINT star_gift_catalog_revisions_pkey PRIMARY KEY (id),
CONSTRAINT star_gift_catalog_revisions_gift_revision_uniq UNIQUE (gift_id, revision),
CONSTRAINT star_gift_catalog_revisions_document_uniq UNIQUE (document_id),
CONSTRAINT star_gift_catalog_revision_price_check CHECK (stars > 0 AND convert_stars >= 0 AND convert_stars <= stars),
CONSTRAINT star_gift_catalog_revision_shape_check CHECK (width = 512 AND height = 512 AND jsonb_typeof(animation_json) = 'object'),
CONSTRAINT star_gift_catalog_revision_source_check CHECK (source_format IN ('tgs', 'lottie')),
CONSTRAINT star_gift_catalog_revision_gift_fk FOREIGN KEY (gift_id)
REFERENCES public.star_gift_catalog(gift_id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT star_gift_catalog_revision_document_fk FOREIGN KEY (document_id)
REFERENCES public.documents(id) ON DELETE RESTRICT
);
ALTER TABLE public.star_gift_catalog
ADD CONSTRAINT star_gift_catalog_active_revision_fk FOREIGN KEY (active_revision_id)
REFERENCES public.star_gift_catalog_revisions(id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX star_gift_catalog_enabled_order_idx
ON public.star_gift_catalog (sort_order, gift_id) WHERE enabled;
CREATE INDEX star_gift_catalog_revisions_gift_idx
ON public.star_gift_catalog_revisions (gift_id, revision DESC);
DELETE FROM public.peer_star_gifts;
ALTER TABLE public.peer_star_gifts
ADD COLUMN catalog_revision_id bigint NOT NULL,
ADD CONSTRAINT peer_star_gifts_catalog_revision_fk FOREIGN KEY (catalog_revision_id)
REFERENCES public.star_gift_catalog_revisions(id) ON DELETE RESTRICT;
CREATE INDEX peer_star_gifts_catalog_revision_idx
ON public.peer_star_gifts (catalog_revision_id);
CREATE INDEX peer_star_gifts_gift_idx
ON public.peer_star_gifts (gift_id);
CREATE FUNCTION public.telesrv_notify_star_gift_catalog_changed() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
PERFORM public.telesrv_bump_read_model_version('star_gift_catalog', 0, '', 0);
RETURN NULL;
END;
$$;
CREATE TRIGGER star_gift_catalog_changed
AFTER INSERT OR UPDATE OR DELETE ON public.star_gift_catalog
FOR EACH STATEMENT EXECUTE FUNCTION public.telesrv_notify_star_gift_catalog_changed();