/** * @type {import('node-pg-migrate').ColumnDefinitions | undefined} */ export const shorthands = undefined; /** * @param pgm {import('node-pg-migrate').MigrationBuilder} * @param run {() => void | undefined} * @returns {Promise | void} */ export const up = (pgm) => { // Create user_profiles table pgm.createTable('user_profiles', { id: { type: 'uuid', primaryKey: true, default: pgm.func('gen_random_uuid()'), }, display_name: { type: 'varchar(255)', notNull: false, }, avatar_url: { type: 'text', notNull: false, }, created_at: { type: 'timestamp with time zone', notNull: true, default: pgm.func('now()'), }, updated_at: { type: 'timestamp with time zone', notNull: true, default: pgm.func('now()'), }, }); // Create user_identities table pgm.createTable('user_identities', { id: { type: 'uuid', primaryKey: true, default: pgm.func('gen_random_uuid()'), }, user_profile_id: { type: 'uuid', notNull: true, references: 'user_profiles(id)', onDelete: 'CASCADE', }, provider: { type: 'varchar(50)', notNull: true, }, provider_id: { type: 'varchar(255)', notNull: true, }, email: { type: 'varchar(255)', notNull: false, }, password_hash: { type: 'varchar(255)', notNull: false, }, created_at: { type: 'timestamp with time zone', notNull: true, default: pgm.func('now()'), }, updated_at: { type: 'timestamp with time zone', notNull: true, default: pgm.func('now()'), }, }); // Create unique index on email for email provider pgm.createIndex('user_identities', ['email'], { unique: true, where: "provider = 'email' AND email IS NOT NULL", }); // Create unique index on provider and provider_id combination pgm.createIndex('user_identities', ['provider', 'provider_id'], { unique: true, }); }; /** * @param pgm {import('node-pg-migrate').MigrationBuilder} * @param run {() => void | undefined} * @returns {Promise | void} */ export const down = (pgm) => { pgm.dropTable('user_identities'); pgm.dropTable('user_profiles'); };