accountsdb.xml 6.3 KB

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