52_authenticator.up.sql 2.1 KB

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