store-administrators.sql 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. -- Server-owned bindings: login accounts do not duplicate a store's business ID.
  2. CREATE TABLE IF NOT EXISTS "StoreAdministrator" (
  3. "objectId" text PRIMARY KEY, company text NOT NULL, "userId" text NOT NULL UNIQUE,
  4. "storeObjectId" text NOT NULL, enabled boolean NOT NULL DEFAULT true,
  5. "createdBy" text NOT NULL, "createdAt" timestamptz NOT NULL DEFAULT now(),
  6. "updatedAt" timestamptz NOT NULL DEFAULT now()
  7. );
  8. ALTER TABLE "StoreAdministrator" ALTER COLUMN enabled SET DEFAULT true;
  9. ALTER TABLE "StoreAdministrator" ALTER COLUMN "createdAt" SET DEFAULT now();
  10. ALTER TABLE "StoreAdministrator" ALTER COLUMN "updatedAt" SET DEFAULT now();
  11. CREATE UNIQUE INDEX IF NOT EXISTS store_administrator_user_once ON "StoreAdministrator" ("userId");
  12. CREATE OR REPLACE FUNCTION xs_store_actor(co text, actor text) RETURNS text LANGUAGE plpgsql AS $$
  13. DECLARE u "_User"; st "_User"; sid text;
  14. BEGIN
  15. SELECT * INTO u FROM "_User" WHERE "objectId"=actor AND company=co FOR SHARE;
  16. IF NOT FOUND OR COALESCE(u."isDisabled",false) OR COALESCE(u."isDeleted",false) THEN RAISE EXCEPTION '门店账号无效或已停用'; END IF;
  17. IF u."identityType"='store-admin' THEN
  18. SELECT "storeObjectId" INTO sid FROM "StoreAdministrator" WHERE company=co AND "userId"=actor AND enabled FOR SHARE;
  19. ELSE sid:=actor; END IF;
  20. SELECT * INTO st FROM "_User" WHERE "objectId"=sid AND company=co FOR SHARE;
  21. IF NOT FOUND OR COALESCE(st."isDisabled",false) OR COALESCE(st."isDeleted",false)
  22. OR NOT (st."identityType"='store' OR st."identityType" IS NULL AND st."legacyGroupId"=2)
  23. OR COALESCE(st."legacyUserId",0)<=0 THEN RAISE EXCEPTION '门店账号无效或已停用'; END IF;
  24. RETURN sid;
  25. END $$;
  26. CREATE OR REPLACE FUNCTION xs_store_support_process(co text,rid text,actor_id text,actor_name text,next_status text,note text,expected text)
  27. RETURNS jsonb LANGUAGE plpgsql AS $$
  28. DECLARE sid text; st "_User"; owner "_User"; g "Guestbook";
  29. BEGIN
  30. sid:=xs_store_actor(co,actor_id);
  31. SELECT * INTO st FROM "_User" WHERE "objectId"=sid;
  32. SELECT * INTO g FROM "Guestbook" WHERE company=co AND "objectId"=rid FOR UPDATE;
  33. SELECT * INTO owner FROM "_User" WHERE company=co AND "legacyUserId"::text=g.userid::text FOR SHARE;
  34. IF owner."objectId" IS NULL OR owner."identityType" NOT IN ('member','coach') OR COALESCE(owner."isDeleted",false) OR owner."legacyUserData"->>'ParentUserID' IS DISTINCT FROM st."legacyUserId"::text THEN RAISE EXCEPTION '申请不存在或不属于本店'; END IF;
  35. RETURN xs_support_request_process(co,rid,actor_id,actor_name,next_status,note,expected);
  36. END $$;