1_create_tables.up.sql 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. CREATE TABLE IF NOT EXISTS users (
  2. user_id SERIAL PRIMARY KEY,
  3. email TEXT UNIQUE NOT NULL,
  4. name TEXT,
  5. creation_time BIGINT NOT NULL
  6. );
  7. CREATE TABLE IF NOT EXISTS files (
  8. file_id BIGSERIAL PRIMARY KEY,
  9. owner_id INTEGER NOT NULL,
  10. file_decryption_header TEXT NOT NULL,
  11. thumbnail_decryption_header TEXT NOT NULL,
  12. metadata_decryption_header TEXT NOT NULL,
  13. encrypted_metadata TEXT NOT NULL,
  14. updation_time BIGINT NOT NULL,
  15. CONSTRAINT fk_files_owner_id
  16. FOREIGN KEY(owner_id)
  17. REFERENCES users(user_id)
  18. ON DELETE CASCADE
  19. );
  20. CREATE TABLE IF NOT EXISTS file_object_keys (
  21. file_id BIGINT PRIMARY KEY,
  22. object_key TEXT UNIQUE NOT NULL,
  23. size INTEGER NOT NULL,
  24. CONSTRAINT fk_file_object_keys_file_id
  25. FOREIGN KEY(file_id)
  26. REFERENCES files(file_id)
  27. ON DELETE CASCADE
  28. );
  29. CREATE TABLE IF NOT EXISTS thumbnail_object_keys (
  30. file_id BIGINT PRIMARY KEY,
  31. object_key TEXT UNIQUE NOT NULL,
  32. size INTEGER NOT NULL,
  33. CONSTRAINT fk_thumbnail_object_keys_file_id
  34. FOREIGN KEY(file_id)
  35. REFERENCES files(file_id)
  36. ON DELETE CASCADE
  37. );
  38. CREATE TABLE IF NOT EXISTS temp_object_keys (
  39. object_key TEXT PRIMARY KEY NOT NULL,
  40. expiration_time BIGINT NOT NULL
  41. );
  42. CREATE TABLE IF NOT EXISTS otts (
  43. user_id INTEGER NOT NULL,
  44. ott TEXT UNIQUE NOT NULL,
  45. creation_time BIGINT NOT NULL,
  46. expiration_time BIGINT NOT NULL,
  47. CONSTRAINT fk_otts_user_id
  48. FOREIGN KEY(user_id)
  49. REFERENCES users(user_id)
  50. ON DELETE CASCADE
  51. );
  52. CREATE TABLE IF NOT EXISTS tokens (
  53. user_id INTEGER NOT NULL,
  54. token TEXT UNIQUE NOT NULL,
  55. creation_time BIGINT NOT NULL,
  56. CONSTRAINT fk_tokens_user_id
  57. FOREIGN KEY(user_id)
  58. REFERENCES users(user_id)
  59. ON DELETE CASCADE
  60. );
  61. CREATE TABLE IF NOT EXISTS key_attributes (
  62. user_id INTEGER PRIMARY KEY,
  63. kek_salt TEXT NOT NULL,
  64. kek_hash_bytes BYTEA NOT NULL,
  65. encrypted_key TEXT NOT NULL,
  66. key_decryption_nonce TEXT NOT NULL,
  67. public_key TEXT NOT NULL,
  68. encrypted_secret_key TEXT NOT NULL,
  69. secret_key_decryption_nonce TEXT NOT NULL,
  70. CONSTRAINT fk_key_attributes_user_id
  71. FOREIGN KEY(user_id)
  72. REFERENCES users(user_id)
  73. ON DELETE CASCADE
  74. );
  75. CREATE TABLE IF NOT EXISTS collections (
  76. collection_id SERIAL PRIMARY KEY,
  77. owner_id INTEGER NOT NULL,
  78. encrypted_key TEXT NOT NULL,
  79. key_decryption_nonce TEXT NOT NULL,
  80. name TEXT NOT NULL,
  81. type TEXT NOT NULL,
  82. attributes JSONB NOT NULL,
  83. updation_time BIGINT NOT NULL,
  84. is_deleted BOOLEAN DEFAULT FALSE,
  85. CONSTRAINT fk_collections_owner_id
  86. FOREIGN KEY(owner_id)
  87. REFERENCES users(user_id)
  88. ON DELETE CASCADE
  89. );
  90. CREATE TABLE IF NOT EXISTS collection_shares (
  91. collection_id INTEGER NOT NULL,
  92. from_user_id INTEGER NOT NULL,
  93. to_user_id INTEGER NOT NULL,
  94. encrypted_key TEXT NOT NULL,
  95. updation_time BIGINT NOT NULL,
  96. is_deleted BOOLEAN DEFAULT FALSE,
  97. UNIQUE(collection_id, from_user_id, to_user_id),
  98. CONSTRAINT fk_collection_shares_collection_id
  99. FOREIGN KEY(collection_id)
  100. REFERENCES collections(collection_id)
  101. ON DELETE CASCADE,
  102. CONSTRAINT fk_collection_shares_from_user_id
  103. FOREIGN KEY(from_user_id)
  104. REFERENCES users(user_id)
  105. ON DELETE CASCADE,
  106. CONSTRAINT fk_collection_shares_to_user_id
  107. FOREIGN KEY(to_user_id)
  108. REFERENCES users(user_id)
  109. ON DELETE CASCADE
  110. );
  111. CREATE TABLE IF NOT EXISTS collection_files (
  112. file_id BIGINT NOT NULL,
  113. collection_id INTEGER NOT NULL,
  114. encrypted_key TEXT NOT NULL,
  115. key_decryption_nonce TEXT NOT NULL,
  116. is_deleted BOOLEAN DEFAULT FALSE,
  117. updation_time BIGINT NOT NULL,
  118. CONSTRAINT unique_collection_files_cid_fid UNIQUE(collection_id, file_id),
  119. CONSTRAINT fk_collection_files_collection_id
  120. FOREIGN KEY(collection_id)
  121. REFERENCES collections(collection_id)
  122. ON DELETE CASCADE,
  123. CONSTRAINT fk_collection_files_file_id
  124. FOREIGN KEY(file_id)
  125. REFERENCES files(file_id)
  126. ON DELETE CASCADE
  127. );
  128. CREATE INDEX IF NOT EXISTS users_email_index ON users(email);
  129. CREATE INDEX IF NOT EXISTS files_owner_id_index ON files (owner_id);
  130. CREATE INDEX IF NOT EXISTS files_updation_time_index ON files (updation_time);
  131. CREATE INDEX IF NOT EXISTS otts_user_id_index ON otts (user_id);
  132. CREATE INDEX IF NOT EXISTS tokens_user_id_index ON tokens (user_id);
  133. CREATE INDEX IF NOT EXISTS collections_owner_id_index ON collections (owner_id);
  134. CREATE INDEX IF NOT EXISTS collection_shares_to_user_id_index ON collection_shares (to_user_id);
  135. CREATE INDEX IF NOT EXISTS collection_files_collection_id_index ON collection_files (collection_id);
  136. CREATE UNIQUE INDEX IF NOT EXISTS collections_favorites_constraint_index ON collections (owner_id) WHERE (type = 'favorites');