Fix migration scripts
authorChocobozzz <me@florianbigard.com>
Tue, 19 Dec 2017 10:24:13 +0000 (11:24 +0100)
committerChocobozzz <me@florianbigard.com>
Tue, 19 Dec 2017 10:25:20 +0000 (11:25 +0100)
.travis.yml
server/initializers/constants.ts
server/initializers/migrations/0130-video-channel-actor.ts [deleted file]
server/initializers/migrations/0135-video-channel-actor.ts [new file with mode: 0644]

index 535b2b6b0ab24a84242340752852abf22033e088..d71d2f212cf43bef7ffcd431550f6a29d9869bdb 100644 (file)
@@ -5,6 +5,7 @@ node_js:
 
 env:
   - CXX=g++-4.9
+  - CC=gcc-4.9
 
 addons:
   apt:
index 4cb54dc93b5370ec266125384785e09d773c06cc..2ea2aa6b9bde20dbba58abb8d82ebf995944f982 100644 (file)
@@ -9,7 +9,7 @@ import { isTestInstance, root } from '../helpers/core-utils'
 
 // ---------------------------------------------------------------------------
 
-const LAST_MIGRATION_VERSION = 130
+const LAST_MIGRATION_VERSION = 135
 
 // ---------------------------------------------------------------------------
 
diff --git a/server/initializers/migrations/0130-video-channel-actor.ts b/server/initializers/migrations/0130-video-channel-actor.ts
deleted file mode 100644 (file)
index fab77cf..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-import * as Sequelize from 'sequelize'
-import { DataType } from 'sequelize-typescript'
-import { createPrivateAndPublicKeys } from '../../helpers'
-
-async function up (utils: {
-  transaction: Sequelize.Transaction,
-  queryInterface: Sequelize.QueryInterface,
-  sequelize: Sequelize.Sequelize
-}): Promise<void> {
-  // Create actor table
-  {
-    const queries = [
-      `
-      CREATE TYPE enum_actor_type AS ENUM (
-        'Group',
-        'Person',
-        'Application'
-      )
-      `,
-      `
-      CREATE TABLE actor (
-        id integer NOT NULL,
-        type enum_actor_type NOT NULL,
-        uuid uuid NOT NULL,
-        "preferredUsername" character varying(255) NOT NULL,
-        url character varying(2000) NOT NULL,
-        "publicKey" character varying(5000),
-        "privateKey" character varying(5000),
-        "followersCount" integer NOT NULL,
-        "followingCount" integer NOT NULL,
-        "inboxUrl" character varying(2000) NOT NULL,
-        "outboxUrl" character varying(2000) NOT NULL,
-        "sharedInboxUrl" character varying(2000) NOT NULL,
-        "followersUrl" character varying(2000) NOT NULL,
-        "followingUrl" character varying(2000) NOT NULL,
-        "avatarId" integer,
-        "serverId" integer,
-        "createdAt" timestamp with time zone NOT NULL,
-        "updatedAt" timestamp with time zone NOT NULL
-      );`,
-      `
-      CREATE SEQUENCE actor_id_seq
-      AS integer
-      START WITH 1
-      INCREMENT BY 1
-      NO MINVALUE
-      NO MAXVALUE
-      CACHE 1
-      `,
-      `ALTER SEQUENCE actor_id_seq OWNED BY actor.id`,
-      `ALTER TABLE ONLY actor ALTER COLUMN id SET DEFAULT nextval('actor_id_seq'::regclass)`,
-      `ALTER TABLE ONLY actor ADD CONSTRAINT actor_pkey PRIMARY KEY (id);`,
-      `CREATE UNIQUE INDEX actor_preferred_username_server_id ON actor USING btree ("preferredUsername", "serverId")`,
-      `ALTER TABLE ONLY actor
-        ADD CONSTRAINT "actor_avatarId_fkey" FOREIGN KEY ("avatarId") REFERENCES avatar(id) ON UPDATE CASCADE ON DELETE CASCADE`,
-      `ALTER TABLE ONLY actor
-        ADD CONSTRAINT "actor_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES server(id) ON UPDATE CASCADE ON DELETE CASCADE;`
-    ]
-
-    for (const query of queries) {
-      await utils.sequelize.query(query)
-    }
-  }
-
-  {
-    // tslint:disable:no-trailing-whitespace
-    const query1 =
-      `
-      INSERT INTO "actor"
-        (
-          type, uuid, "preferredUsername", url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl",
-          "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt"
-        )
-        SELECT 
-          'Application', uuid, name, url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl",
-          "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt" 
-        FROM account 
-        WHERE "applicationId" IS NOT NULL
-        `
-    await utils.sequelize.query(query1)
-
-    const query2 =
-      `
-      INSERT INTO "actor"
-        (
-          type, uuid, "preferredUsername", url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl",
-          "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt"
-        )
-        SELECT 
-          'Person', uuid, name, url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl",
-          "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt" 
-        FROM account 
-        WHERE "applicationId" IS NULL
-        `
-    await utils.sequelize.query(query2)
-  }
-
-  {
-    const data = {
-      type: DataType.INTEGER,
-      allowNull: true,
-      references: {
-        model: 'actor',
-        key: 'id'
-      },
-      onDelete: 'CASCADE'
-    }
-    await utils.queryInterface.addColumn('account', 'actorId', data)
-
-    const query1 = `UPDATE account SET "actorId" = (SELECT id FROM actor WHERE actor.url = account.url)`
-    await utils.sequelize.query(query1)
-
-    data.allowNull = false
-    await utils.queryInterface.changeColumn('account', 'actorId', data)
-  }
-
-  {
-    const query = `  
-    INSERT INTO actor 
-    (
-    type, uuid, "preferredUsername", url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl", 
-    "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt"
-    )
-    SELECT 
-    'Group', "videoChannel".uuid, "videoChannel".uuid, "videoChannel".url, null, null, 0, 0, "videoChannel".url || '/inbox', 
-    "videoChannel".url || '/outbox', "videoChannel".url || '/inbox', "videoChannel".url || '/followers', "videoChannel".url || '/following',
-     null, account."serverId", "videoChannel"."createdAt", "videoChannel"."updatedAt" 
-     FROM "videoChannel" 
-     INNER JOIN "account" on "videoChannel"."accountId" = "account".id
-    `
-    await utils.sequelize.query(query)
-  }
-
-  {
-    const data = {
-      type: DataType.INTEGER,
-      allowNull: true,
-      references: {
-        model: 'actor',
-        key: 'id'
-      },
-      onDelete: 'CASCADE'
-    }
-    await utils.queryInterface.addColumn('videoChannel', 'actorId', data)
-
-    const query1 = `UPDATE "videoChannel" SET "actorId" = (SELECT id FROM actor WHERE actor.url = "videoChannel".url)`
-    await utils.sequelize.query(query1)
-
-    data.allowNull = false
-    await utils.queryInterface.changeColumn('videoChannel', 'actorId', data)
-  }
-
-  {
-    await utils.queryInterface.renameTable('accountFollow', 'actorFollow')
-    await utils.queryInterface.renameColumn('actorFollow', 'accountId', 'actorId')
-    await utils.queryInterface.renameColumn('actorFollow', 'targetAccountId', 'targetActorId')
-
-    try {
-      await utils.queryInterface.removeConstraint('actorFollow', 'AccountFollows_accountId_fkey')
-      await utils.queryInterface.removeConstraint('actorFollow', 'AccountFollows_targetAccountId_fkey')
-    } catch {
-      await utils.queryInterface.removeConstraint('actorFollow', 'accountFollow_accountId_fkey')
-      await utils.queryInterface.removeConstraint('actorFollow', 'accountFollow_targetAccountId_fkey')
-    }
-
-    {
-      const query1 = `UPDATE "actorFollow" 
-      SET "actorId" = 
-      (SELECT "account"."actorId" FROM account WHERE "account"."id" = "actorFollow"."actorId")`
-      await utils.sequelize.query(query1)
-
-      const query2 = `UPDATE "actorFollow" 
-      SET "targetActorId" = 
-      (SELECT "account"."actorId" FROM account WHERE "account"."id" = "actorFollow"."targetActorId")`
-
-      await utils.sequelize.query(query2)
-    }
-
-    {
-      const query1 = `ALTER TABLE ONLY "actorFollow"
-    ADD CONSTRAINT "actorFollow_actorId_fkey" FOREIGN KEY ("actorId") REFERENCES actor(id) ON UPDATE CASCADE ON DELETE CASCADE;`
-      await utils.sequelize.query(query1)
-
-      const query2 = `ALTER TABLE ONLY "actorFollow"
-    ADD CONSTRAINT "actorFollow_targetActorId_fkey" FOREIGN KEY ("targetActorId") REFERENCES actor(id) ON UPDATE CASCADE ON DELETE CASCADE;`
-      await utils.sequelize.query(query2)
-    }
-  }
-
-  {
-    await utils.queryInterface.renameColumn('videoShare', 'accountId', 'actorId')
-
-    try {
-      await utils.queryInterface.removeConstraint('videoShare', 'VideoShares_accountId_fkey')
-    } catch {
-      await utils.queryInterface.removeConstraint('videoShare', 'videoShare_accountId_fkey')
-    }
-
-    const query = `UPDATE "videoShare" 
-      SET "actorId" = 
-      (SELECT "actorId" FROM account WHERE id = "videoShare"."actorId")`
-    await utils.sequelize.query(query)
-
-    {
-      const query1 = `ALTER TABLE ONLY "videoShare"
-    ADD CONSTRAINT "videoShare_actorId_fkey" FOREIGN KEY ("actorId") REFERENCES actor(id) ON UPDATE CASCADE ON DELETE CASCADE;`
-      await utils.sequelize.query(query1)
-
-      const query2 = `ALTER TABLE ONLY "videoShare"
-    ADD CONSTRAINT "videoShare_videoId_fkey" FOREIGN KEY ("videoId") REFERENCES video(id) ON UPDATE CASCADE ON DELETE CASCADE;`
-      await utils.sequelize.query(query2)
-    }
-  }
-
-  {
-    const columnsToDelete = [
-      'uuid',
-      'url',
-      'publicKey',
-      'privateKey',
-      'followersCount',
-      'followingCount',
-      'inboxUrl',
-      'outboxUrl',
-      'sharedInboxUrl',
-      'followersUrl',
-      'followingUrl',
-      'serverId',
-      'avatarId'
-    ]
-    for (const columnToDelete of columnsToDelete) {
-      await utils.queryInterface.removeColumn('account', columnToDelete)
-    }
-  }
-
-  {
-    const columnsToDelete = [
-      'uuid',
-      'remote',
-      'url'
-    ]
-    for (const columnToDelete of columnsToDelete) {
-      await utils.queryInterface.removeColumn('videoChannel', columnToDelete)
-    }
-  }
-
-  {
-    const query = 'SELECT * FROM "actor" WHERE "serverId" IS NULL AND "publicKey" IS NULL'
-    const [ res ] = await utils.sequelize.query(query)
-
-    for (const actor of res) {
-      const { privateKey, publicKey } = await createPrivateAndPublicKeys()
-
-      const queryUpdate = `UPDATE "actor" SET "publicKey" = '${publicKey}', "privateKey" = '${privateKey}' WHERE id = ${actor.id}`
-      await utils.sequelize.query(queryUpdate)
-    }
-  }
-}
-
-function down (options) {
-  throw new Error('Not implemented.')
-}
-
-export {
-  up,
-  down
-}
diff --git a/server/initializers/migrations/0135-video-channel-actor.ts b/server/initializers/migrations/0135-video-channel-actor.ts
new file mode 100644 (file)
index 0000000..3c5c10a
--- /dev/null
@@ -0,0 +1,268 @@
+import * as Sequelize from 'sequelize'
+import { DataType } from 'sequelize-typescript'
+import { createPrivateAndPublicKeys } from '../../helpers'
+
+async function up (utils: {
+  transaction: Sequelize.Transaction,
+  queryInterface: Sequelize.QueryInterface,
+  sequelize: Sequelize.Sequelize
+}): Promise<void> {
+  // Create actor table
+  {
+    const queries = [
+      `DROP TYPE IF EXISTS enum_actor_type`,
+      `
+      CREATE TYPE enum_actor_type AS ENUM (
+        'Group',
+        'Person',
+        'Application'
+      )
+      `,
+      `
+      CREATE TABLE actor (
+        id integer NOT NULL,
+        type enum_actor_type NOT NULL,
+        uuid uuid NOT NULL,
+        "preferredUsername" character varying(255) NOT NULL,
+        url character varying(2000) NOT NULL,
+        "publicKey" character varying(5000),
+        "privateKey" character varying(5000),
+        "followersCount" integer NOT NULL,
+        "followingCount" integer NOT NULL,
+        "inboxUrl" character varying(2000) NOT NULL,
+        "outboxUrl" character varying(2000) NOT NULL,
+        "sharedInboxUrl" character varying(2000) NOT NULL,
+        "followersUrl" character varying(2000) NOT NULL,
+        "followingUrl" character varying(2000) NOT NULL,
+        "avatarId" integer,
+        "serverId" integer,
+        "createdAt" timestamp with time zone NOT NULL,
+        "updatedAt" timestamp with time zone NOT NULL
+      );`,
+      `
+      CREATE SEQUENCE actor_id_seq
+      AS integer
+      START WITH 1
+      INCREMENT BY 1
+      NO MINVALUE
+      NO MAXVALUE
+      CACHE 1
+      `,
+      `ALTER SEQUENCE actor_id_seq OWNED BY actor.id`,
+      `ALTER TABLE ONLY actor ALTER COLUMN id SET DEFAULT nextval('actor_id_seq'::regclass)`,
+      `ALTER TABLE ONLY actor ADD CONSTRAINT actor_pkey PRIMARY KEY (id);`,
+      `CREATE UNIQUE INDEX actor_preferred_username_server_id ON actor USING btree ("preferredUsername", "serverId")`,
+      `ALTER TABLE ONLY actor
+        ADD CONSTRAINT "actor_avatarId_fkey" FOREIGN KEY ("avatarId") REFERENCES avatar(id) ON UPDATE CASCADE ON DELETE CASCADE`,
+      `ALTER TABLE ONLY actor
+        ADD CONSTRAINT "actor_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES server(id) ON UPDATE CASCADE ON DELETE CASCADE;`
+    ]
+
+    for (const query of queries) {
+      await utils.sequelize.query(query)
+    }
+  }
+
+  {
+    // tslint:disable:no-trailing-whitespace
+    const query1 =
+      `
+      INSERT INTO "actor"
+        (
+          type, uuid, "preferredUsername", url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl",
+          "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt"
+        )
+        SELECT 
+          'Application', uuid, name, url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl",
+          "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt" 
+        FROM account 
+        WHERE "applicationId" IS NOT NULL
+        `
+    await utils.sequelize.query(query1)
+
+    const query2 =
+      `
+      INSERT INTO "actor"
+        (
+          type, uuid, "preferredUsername", url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl",
+          "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt"
+        )
+        SELECT 
+          'Person', uuid, name, url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl",
+          "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt" 
+        FROM account 
+        WHERE "applicationId" IS NULL
+        `
+    await utils.sequelize.query(query2)
+  }
+
+  {
+    const data = {
+      type: DataType.INTEGER,
+      allowNull: true,
+      references: {
+        model: 'actor',
+        key: 'id'
+      },
+      onDelete: 'CASCADE'
+    }
+    await utils.queryInterface.addColumn('account', 'actorId', data)
+
+    const query1 = `UPDATE account SET "actorId" = (SELECT id FROM actor WHERE actor.url = account.url)`
+    await utils.sequelize.query(query1)
+
+    data.allowNull = false
+    await utils.queryInterface.changeColumn('account', 'actorId', data)
+  }
+
+  {
+    const query = `  
+    INSERT INTO actor 
+    (
+    type, uuid, "preferredUsername", url, "publicKey", "privateKey", "followersCount", "followingCount", "inboxUrl", "outboxUrl", 
+    "sharedInboxUrl", "followersUrl", "followingUrl", "avatarId", "serverId", "createdAt", "updatedAt"
+    )
+    SELECT 
+    'Group', "videoChannel".uuid, "videoChannel".uuid, "videoChannel".url, null, null, 0, 0, "videoChannel".url || '/inbox', 
+    "videoChannel".url || '/outbox', "videoChannel".url || '/inbox', "videoChannel".url || '/followers', "videoChannel".url || '/following',
+     null, account."serverId", "videoChannel"."createdAt", "videoChannel"."updatedAt" 
+     FROM "videoChannel" 
+     INNER JOIN "account" on "videoChannel"."accountId" = "account".id
+    `
+    await utils.sequelize.query(query)
+  }
+
+  {
+    const data = {
+      type: DataType.INTEGER,
+      allowNull: true,
+      references: {
+        model: 'actor',
+        key: 'id'
+      },
+      onDelete: 'CASCADE'
+    }
+    await utils.queryInterface.addColumn('videoChannel', 'actorId', data)
+
+    const query1 = `UPDATE "videoChannel" SET "actorId" = (SELECT id FROM actor WHERE actor.url = "videoChannel".url)`
+    await utils.sequelize.query(query1)
+
+    data.allowNull = false
+    await utils.queryInterface.changeColumn('videoChannel', 'actorId', data)
+  }
+
+  {
+    await utils.queryInterface.renameTable('accountFollow', 'actorFollow')
+    await utils.queryInterface.renameColumn('actorFollow', 'accountId', 'actorId')
+    await utils.queryInterface.renameColumn('actorFollow', 'targetAccountId', 'targetActorId')
+
+    try {
+      await utils.queryInterface.removeConstraint('actorFollow', 'AccountFollows_accountId_fkey')
+      await utils.queryInterface.removeConstraint('actorFollow', 'AccountFollows_targetAccountId_fkey')
+    } catch {
+      await utils.queryInterface.removeConstraint('actorFollow', 'accountFollow_accountId_fkey')
+      await utils.queryInterface.removeConstraint('actorFollow', 'accountFollow_targetAccountId_fkey')
+    }
+
+    {
+      const query1 = `UPDATE "actorFollow" 
+      SET "actorId" = 
+      (SELECT "account"."actorId" FROM account WHERE "account"."id" = "actorFollow"."actorId")`
+      await utils.sequelize.query(query1)
+
+      const query2 = `UPDATE "actorFollow" 
+      SET "targetActorId" = 
+      (SELECT "account"."actorId" FROM account WHERE "account"."id" = "actorFollow"."targetActorId")`
+
+      await utils.sequelize.query(query2)
+    }
+
+    {
+      const query1 = `ALTER TABLE ONLY "actorFollow"
+    ADD CONSTRAINT "actorFollow_actorId_fkey" FOREIGN KEY ("actorId") REFERENCES actor(id) ON UPDATE CASCADE ON DELETE CASCADE;`
+      await utils.sequelize.query(query1)
+
+      const query2 = `ALTER TABLE ONLY "actorFollow"
+    ADD CONSTRAINT "actorFollow_targetActorId_fkey" FOREIGN KEY ("targetActorId") REFERENCES actor(id) ON UPDATE CASCADE ON DELETE CASCADE;`
+      await utils.sequelize.query(query2)
+    }
+  }
+
+  {
+    await utils.queryInterface.renameColumn('videoShare', 'accountId', 'actorId')
+
+    try {
+      await utils.queryInterface.removeConstraint('videoShare', 'VideoShares_accountId_fkey')
+    } catch {
+      await utils.queryInterface.removeConstraint('videoShare', 'videoShare_accountId_fkey')
+    }
+
+    const query = `UPDATE "videoShare" 
+      SET "actorId" = 
+      (SELECT "actorId" FROM account WHERE id = "videoShare"."actorId")`
+    await utils.sequelize.query(query)
+
+    {
+      const query1 = `ALTER TABLE ONLY "videoShare"
+    ADD CONSTRAINT "videoShare_actorId_fkey" FOREIGN KEY ("actorId") REFERENCES actor(id) ON UPDATE CASCADE ON DELETE CASCADE;`
+      await utils.sequelize.query(query1)
+
+      const query2 = `ALTER TABLE ONLY "videoShare"
+    ADD CONSTRAINT "videoShare_videoId_fkey" FOREIGN KEY ("videoId") REFERENCES video(id) ON UPDATE CASCADE ON DELETE CASCADE;`
+      await utils.sequelize.query(query2)
+    }
+  }
+
+  {
+    const columnsToDelete = [
+      'uuid',
+      'url',
+      'publicKey',
+      'privateKey',
+      'followersCount',
+      'followingCount',
+      'inboxUrl',
+      'outboxUrl',
+      'sharedInboxUrl',
+      'followersUrl',
+      'followingUrl',
+      'serverId',
+      'avatarId'
+    ]
+    for (const columnToDelete of columnsToDelete) {
+      await utils.queryInterface.removeColumn('account', columnToDelete)
+    }
+  }
+
+  {
+    const columnsToDelete = [
+      'uuid',
+      'remote',
+      'url'
+    ]
+    for (const columnToDelete of columnsToDelete) {
+      await utils.queryInterface.removeColumn('videoChannel', columnToDelete)
+    }
+  }
+
+  {
+    const query = 'SELECT * FROM "actor" WHERE "serverId" IS NULL AND "publicKey" IS NULL'
+    const [ res ] = await utils.sequelize.query(query)
+
+    for (const actor of res) {
+      const { privateKey, publicKey } = await createPrivateAndPublicKeys()
+
+      const queryUpdate = `UPDATE "actor" SET "publicKey" = '${publicKey}', "privateKey" = '${privateKey}' WHERE id = ${actor.id}`
+      await utils.sequelize.query(queryUpdate)
+    }
+  }
+}
+
+function down (options) {
+  throw new Error('Not implemented.')
+}
+
+export {
+  up,
+  down
+}