CREATE OR REPLACE FUNCTION public.telesrv_notify_user_base_read_model() RETURNS trigger LANGUAGE plpgsql AS $$ DECLARE changed_id BIGINT; projection_changed BOOLEAN; BEGIN IF TG_OP = 'DELETE' THEN changed_id := OLD.id; projection_changed := true; ELSE changed_id := NEW.id; IF TG_OP = 'INSERT' THEN projection_changed := true; ELSE projection_changed := OLD.access_hash IS DISTINCT FROM NEW.access_hash OR OLD.phone IS DISTINCT FROM NEW.phone OR OLD.first_name IS DISTINCT FROM NEW.first_name OR OLD.last_name IS DISTINCT FROM NEW.last_name OR OLD.username IS DISTINCT FROM NEW.username OR OLD.country_code IS DISTINCT FROM NEW.country_code OR OLD.verified IS DISTINCT FROM NEW.verified OR OLD.support IS DISTINCT FROM NEW.support OR OLD.about IS DISTINCT FROM NEW.about OR OLD.default_history_ttl_period IS DISTINCT FROM NEW.default_history_ttl_period OR OLD.is_bot IS DISTINCT FROM NEW.is_bot OR OLD.bot_info_version IS DISTINCT FROM NEW.bot_info_version OR OLD.premium_expires_at IS DISTINCT FROM NEW.premium_expires_at OR OLD.emoji_status_document_id IS DISTINCT FROM NEW.emoji_status_document_id OR OLD.emoji_status_until IS DISTINCT FROM NEW.emoji_status_until OR OLD.color_set IS DISTINCT FROM NEW.color_set OR OLD.color IS DISTINCT FROM NEW.color OR OLD.color_background_emoji_id IS DISTINCT FROM NEW.color_background_emoji_id OR OLD.profile_color_set IS DISTINCT FROM NEW.profile_color_set OR OLD.profile_color IS DISTINCT FROM NEW.profile_color OR OLD.profile_color_background_emoji_id IS DISTINCT FROM NEW.profile_color_background_emoji_id; END IF; END IF; IF projection_changed THEN PERFORM telesrv_bump_read_model_version('user_base', changed_id, 'user', changed_id); IF TG_OP = 'INSERT' THEN PERFORM telesrv_bump_read_model_version('contact_account', changed_id, 'user', changed_id); END IF; PERFORM telesrv_bump_read_model_version('contact_account', c.user_id, 'user', c.user_id) FROM contacts c WHERE c.contact_user_id = changed_id; PERFORM telesrv_bump_private_dialog_light_for_user(changed_id); END IF; RETURN NULL; END; $$; CREATE OR REPLACE FUNCTION public.telesrv_notify_user_channel_participants_read_model() RETURNS trigger LANGUAGE plpgsql AS $$ DECLARE changed_id BIGINT; old_id BIGINT; projection_changed BOOLEAN; BEGIN IF TG_OP = 'DELETE' THEN changed_id := OLD.id; projection_changed := true; ELSE changed_id := NEW.id; IF TG_OP = 'INSERT' THEN projection_changed := true; PERFORM telesrv_bump_read_model_version('contact_account', changed_id, 'user', changed_id); ELSE old_id := OLD.id; projection_changed := OLD.access_hash IS DISTINCT FROM NEW.access_hash OR OLD.phone IS DISTINCT FROM NEW.phone OR OLD.first_name IS DISTINCT FROM NEW.first_name OR OLD.last_name IS DISTINCT FROM NEW.last_name OR OLD.username IS DISTINCT FROM NEW.username OR OLD.country_code IS DISTINCT FROM NEW.country_code OR OLD.verified IS DISTINCT FROM NEW.verified OR OLD.support IS DISTINCT FROM NEW.support OR OLD.about IS DISTINCT FROM NEW.about OR OLD.default_history_ttl_period IS DISTINCT FROM NEW.default_history_ttl_period OR OLD.is_bot IS DISTINCT FROM NEW.is_bot OR OLD.bot_info_version IS DISTINCT FROM NEW.bot_info_version OR OLD.premium_expires_at IS DISTINCT FROM NEW.premium_expires_at OR OLD.emoji_status_document_id IS DISTINCT FROM NEW.emoji_status_document_id OR OLD.emoji_status_until IS DISTINCT FROM NEW.emoji_status_until OR OLD.color_set IS DISTINCT FROM NEW.color_set OR OLD.color IS DISTINCT FROM NEW.color OR OLD.color_background_emoji_id IS DISTINCT FROM NEW.color_background_emoji_id OR OLD.profile_color_set IS DISTINCT FROM NEW.profile_color_set OR OLD.profile_color IS DISTINCT FROM NEW.profile_color OR OLD.profile_color_background_emoji_id IS DISTINCT FROM NEW.profile_color_background_emoji_id; IF old_id IS DISTINCT FROM changed_id THEN PERFORM telesrv_bump_channel_participants_for_user(old_id); END IF; END IF; END IF; IF projection_changed THEN PERFORM telesrv_bump_channel_participants_for_user(changed_id); END IF; RETURN NULL; END; $$; DROP TRIGGER IF EXISTS users_release_collectible_phone_on_soft_delete ON public.users; CREATE TRIGGER users_release_collectible_phone_on_soft_delete BEFORE UPDATE OF deleted_at ON public.users FOR EACH ROW WHEN (OLD.deleted_at IS NULL AND NEW.deleted_at IS NOT NULL) EXECUTE FUNCTION public.release_soft_deleted_user_collectible_phone();