"use strict"; /** @type {import("sequelize-cli").Migration} */ module.exports = { async up(queryInterface, Sequelize) { await queryInterface.sequelize.transaction(async (transaction) => { await queryInterface.createTable( "oauth_clients", { id: { type: Sequelize.UUID, primaryKey: true, allowNull: false, }, name: { type: Sequelize.STRING, allowNull: false, }, description: { type: Sequelize.STRING, allowNull: true, }, developerName: { type: Sequelize.STRING, allowNull: true, }, developerUrl: { type: Sequelize.STRING, allowNull: true, }, avatarUrl: { type: Sequelize.STRING, allowNull: true, }, clientId: { type: Sequelize.STRING, allowNull: false, unique: true, }, clientSecret: { type: Sequelize.BLOB, allowNull: false, }, published: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: false, }, teamId: { type: Sequelize.UUID, references: { model: "teams", }, allowNull: false, onDelete: "cascade", }, createdById: { type: Sequelize.UUID, references: { model: "users", }, allowNull: false, }, redirectUris: { type: Sequelize.ARRAY(Sequelize.STRING), allowNull: false, defaultValue: [], }, createdAt: { type: Sequelize.DATE, allowNull: false, }, updatedAt: { type: Sequelize.DATE, allowNull: false, }, deletedAt: { type: Sequelize.DATE, allowNull: true, }, }, { transaction, } ); await queryInterface.createTable( "oauth_authorization_codes", { id: { type: Sequelize.UUID, primaryKey: true, allowNull: false, }, authorizationCodeHash: { type: Sequelize.STRING, allowNull: false, }, codeChallenge: { type: Sequelize.STRING, allowNull: true, }, codeChallengeMethod: { type: Sequelize.STRING, allowNull: true, }, scope: { type: Sequelize.ARRAY(Sequelize.STRING), allowNull: false, }, oauthClientId: { type: Sequelize.UUID, references: { model: "oauth_clients", }, onDelete: "cascade", allowNull: false, }, userId: { type: Sequelize.UUID, references: { model: "users", }, onDelete: "cascade", allowNull: false, }, redirectUri: { type: Sequelize.STRING, allowNull: false, }, expiresAt: { type: Sequelize.DATE, allowNull: false, }, createdAt: { type: Sequelize.DATE, allowNull: false, }, }, { transaction, } ); await queryInterface.createTable( "oauth_authentications", { id: { type: Sequelize.UUID, primaryKey: true, allowNull: false, }, accessTokenHash: { type: Sequelize.STRING, allowNull: false, unique: true, }, accessTokenExpiresAt: { type: Sequelize.DATE, allowNull: false, }, refreshTokenHash: { type: Sequelize.STRING, allowNull: false, unique: true, }, refreshTokenExpiresAt: { type: Sequelize.DATE, allowNull: false, }, lastActiveAt: { type: Sequelize.DATE, allowNull: true, }, scope: { type: Sequelize.ARRAY(Sequelize.STRING), allowNull: false, }, oauthClientId: { type: Sequelize.UUID, references: { model: "oauth_clients", }, onDelete: "cascade", allowNull: false, }, userId: { type: Sequelize.UUID, references: { model: "users", }, onDelete: "cascade", allowNull: false, }, createdAt: { type: Sequelize.DATE, allowNull: false, }, updatedAt: { type: Sequelize.DATE, allowNull: false, }, deletedAt: { type: Sequelize.DATE, allowNull: true, }, }, { transaction, } ); await queryInterface.addIndex("oauth_clients", ["teamId"], { transaction, }); }); }, async down(queryInterface, Sequelize) { await queryInterface.sequelize.transaction(async (transaction) => { await queryInterface.dropTable("oauth_authentications", { transaction }); await queryInterface.dropTable("oauth_authorization_codes", { transaction, }); await queryInterface.dropTable("oauth_clients", { transaction }); }); }, };