81 lines
4 KiB
PL/PgSQL
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();
|