accountsdb.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <databaseChangeLog
  3. xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
  6. http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
  7. <changeSet id="1" author="moxie">
  8. <createTable tableName="accounts">
  9. <column name="id" type="bigint" autoIncrement="true">
  10. <constraints primaryKey="true" nullable="false"/>
  11. </column>
  12. <column name="number" type="varchar(255)">
  13. <constraints unique="true" nullable="false"/>
  14. </column>
  15. <column name="auth_token" type="varchar(255)">
  16. <constraints nullable="false"/>
  17. </column>
  18. <column name="salt" type="varchar(255)">
  19. <constraints nullable="false"/>
  20. </column>
  21. <column name="signaling_key" type="varchar(255)"/>
  22. <column name="gcm_id" type="text"/>
  23. <column name="apn_id" type="text"/>
  24. <column name="supports_sms" type="smallint" defaultValue="0"/>
  25. </createTable>
  26. <createTable tableName="pending_accounts">
  27. <column name="id" type="bigint" autoIncrement="true">
  28. <constraints primaryKey="true" nullable="false"/>
  29. </column>
  30. <column name="number" type="varchar(255)">
  31. <constraints unique="true" nullable="false"/>
  32. </column>
  33. <column name="verification_code" type="varchar(255)">
  34. <constraints nullable="false"/>
  35. </column>
  36. </createTable>
  37. <createTable tableName="keys">
  38. <column name="id" type="bigint" autoIncrement="true">
  39. <constraints primaryKey="true" nullable="false"/>
  40. </column>
  41. <column name="number" type="varchar(255)">
  42. <constraints nullable="false"/>
  43. </column>
  44. <column name="key_id" type="bigint">
  45. <constraints nullable="false"/>
  46. </column>
  47. <column name="public_key" type="text">
  48. <constraints nullable="false"/>
  49. </column>
  50. <column name="identity_key" type="text">
  51. <constraints nullable="false"/>
  52. </column>
  53. <column name="last_resort" type="smallint" defaultValue="0"/>
  54. </createTable>
  55. <createIndex tableName="keys" indexName="keys_number_index">
  56. <column name="number"/>
  57. </createIndex>
  58. </changeSet>
  59. <changeSet id="2" author="matt">
  60. <addColumn tableName="accounts">
  61. <column name="data" type="json" />
  62. </addColumn>
  63. <sql>CREATE type device_t AS (id integer, "authToken" varchar(255), salt varchar(255), "signalingKey" varchar(255), "gcmId" text, "apnId" text);</sql>
  64. <sql>CREATE type account_t AS (number varchar(255), "supportsSms" smallint, devices device_t array);</sql>
  65. <sql>UPDATE accounts SET data = row_to_json(row(number, supports_sms, array[row(1, auth_token, salt, signaling_key, gcm_id, apn_id)::device_t])::account_t)</sql>
  66. <addNotNullConstraint tableName="accounts" columnName="data"/>
  67. <dropColumn tableName="accounts" columnName="auth_token"/>
  68. <dropColumn tableName="accounts" columnName="salt"/>
  69. <dropColumn tableName="accounts" columnName="signaling_key"/>
  70. <dropColumn tableName="accounts" columnName="gcm_id"/>
  71. <dropColumn tableName="accounts" columnName="apn_id"/>
  72. <dropColumn tableName="accounts" columnName="supports_sms"/>
  73. <sql>DROP type account_t;</sql>
  74. <sql>DROP type device_t;</sql>
  75. <addColumn tableName="keys">
  76. <column name="device_id" type="bigint" defaultValue="1">
  77. <constraints nullable="false" />
  78. </column>
  79. </addColumn>
  80. <createTable tableName="pending_devices">
  81. <column name="id" type="bigint" autoIncrement="true">
  82. <constraints primaryKey="true" nullable="false"/>
  83. </column>
  84. <column name="number" type="text">
  85. <constraints unique="true" nullable="false"/>
  86. </column>
  87. <column name="verification_code" type="text">
  88. <constraints nullable="false"/>
  89. </column>
  90. </createTable>
  91. <createTable tableName="messages">
  92. <column name="id" type="bigint" autoIncrement="true">
  93. <constraints primaryKey="true" nullable="false"/>
  94. </column>
  95. <column name="account_id" type="bigint">
  96. <constraints nullable="false"/>
  97. </column>
  98. <column name="device_id" type="bigint">
  99. <constraints nullable="false"/>
  100. </column>
  101. <column name="encrypted_message" type="text">
  102. <constraints nullable="false"/>
  103. </column>
  104. </createTable>
  105. <createIndex tableName="messages" indexName="messages_account_and_device">
  106. <column name="account_id"/>
  107. <column name="device_id"/>
  108. </createIndex>
  109. </changeSet>
  110. <changeSet id="3" author="moxie">
  111. <sql>CREATE OR REPLACE FUNCTION "custom_json_object_set_key"(
  112. "json" json,
  113. "key_to_set" TEXT,
  114. "value_to_set" anyelement
  115. )
  116. RETURNS json
  117. LANGUAGE sql
  118. IMMUTABLE
  119. STRICT
  120. AS $function$
  121. SELECT COALESCE(
  122. (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')
  123. FROM (SELECT *
  124. FROM json_each("json")
  125. WHERE "key" &lt;&gt; "key_to_set"
  126. UNION ALL
  127. SELECT "key_to_set", to_json("value_to_set")) AS "fields"),
  128. '{}'
  129. )::json
  130. $function$;</sql>
  131. <sql>UPDATE accounts SET data = custom_json_object_set_key(data, 'identityKey', k.identity_key) FROM keys k WHERE (data->>'identityKey')::text is null AND k.number = data->>'number' AND k.last_resort = 1;</sql>
  132. <sql>UPDATE accounts SET data = custom_json_object_set_key(data, 'identityKey', k.identity_key) FROM keys k WHERE (data->>'identityKey')::text is null AND k.number = data->>'number';</sql>
  133. </changeSet>
  134. <changeSet id="4" author="moxie">
  135. <dropColumn tableName="keys" columnName="identity_key"/>
  136. </changeSet>
  137. </databaseChangeLog>