62_entity_store.up.sql 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. CREATE TABLE IF NOT EXISTS entity_key
  2. (
  3. user_id BIGINT NOT NULL,
  4. type TEXT NOT NULL,
  5. encrypted_key TEXT NOT NULL,
  6. header TEXT NOT NULL,
  7. created_at BIGINT NOT NULL DEFAULT now_utc_micro_seconds(),
  8. updated_at BIGINT NOT NULL DEFAULT now_utc_micro_seconds(),
  9. PRIMARY KEY (user_id, type),
  10. CONSTRAINT fk_entity_key_user_id FOREIGN KEY (user_id) REFERENCES users (
  11. user_id) ON DELETE CASCADE
  12. );
  13. CREATE TABLE IF NOT EXISTS entity_data
  14. (
  15. id uuid PRIMARY KEY NOT NULL,
  16. user_id BIGINT NOT NULL,
  17. type TEXT NOT NULL,
  18. encrypted_data TEXT,
  19. header TEXT,
  20. created_at BIGINT NOT NULL DEFAULT now_utc_micro_seconds(),
  21. updated_at BIGINT NOT NULL DEFAULT now_utc_micro_seconds(),
  22. is_deleted BOOLEAN DEFAULT FALSE,
  23. CONSTRAINT fk_entity_key_user_id_and_type FOREIGN KEY (user_id, type) REFERENCES entity_key (user_id, type) ON DELETE CASCADE
  24. );
  25. CREATE INDEX IF NOT EXISTS entity_data_updated_at_time_index ON entity_data (user_id, updated_at);
  26. ALTER TABLE entity_data
  27. ADD CONSTRAINT entity_data_state_constraint CHECK ((is_deleted is TRUE AND encrypted_data IS NULL) or
  28. (is_deleted is FALSE AND encrypted_data IS NOT NULL));
  29. CREATE TRIGGER update_entity_data_updated_at
  30. BEFORE UPDATE
  31. ON entity_data
  32. FOR EACH ROW
  33. EXECUTE PROCEDURE
  34. trigger_updated_at_microseconds_column();
  35. -- This function updates the entity_key updated_at if the relevant entity_data is changed
  36. CREATE OR REPLACE FUNCTION fn_update_entity_key_updated_at_via_updated_at() RETURNS TRIGGER AS
  37. $$
  38. BEGIN
  39. --
  40. IF (TG_OP = 'UPDATE' OR TG_OP = 'INSERT') THEN
  41. UPDATE entity_key
  42. SET updated_at = NEW.updated_at
  43. where user_id = new.user_id
  44. and type = new.type
  45. and updated_at < New.updated_at;
  46. RETURN NEW;
  47. END IF;
  48. END;
  49. $$ LANGUAGE plpgsql;
  50. CREATE TRIGGER trigger_entity_key_on_entity_data_updation
  51. AFTER INSERT OR UPDATE
  52. ON entity_data
  53. FOR EACH ROW
  54. EXECUTE PROCEDURE
  55. fn_update_entity_key_updated_at_via_updated_at();