/** * @param { import("knex").Knex } knex * @returns { Promise } */ exports.up = function(knex) { return knex.schema // 1. roles 테이블 생성 .createTable('roles', function(table) { table.increments('id').primary(); table.string('name', 50).notNullable().unique(); table.string('description', 255); table.timestamps(true, true); }) // 2. permissions 테이블 생성 .createTable('permissions', function(table) { table.increments('id').primary(); table.string('name', 100).notNullable().unique(); // 예: 'user:create' table.string('description', 255); table.timestamps(true, true); }) // 3. role_permissions (역할-권한) 조인 테이블 생성 .createTable('role_permissions', function(table) { table.integer('role_id').unsigned().notNullable().references('id').inTable('roles').onDelete('CASCADE'); table.integer('permission_id').unsigned().notNullable().references('id').inTable('permissions').onDelete('CASCADE'); table.primary(['role_id', 'permission_id']); }) // 4. users 테이블에 role_id 추가 및 기존 컬럼 삭제 .table('users', function(table) { table.integer('role_id').unsigned().references('id').inTable('roles').onDelete('SET NULL').after('email'); // 기존 컬럼들은 삭제 또는 비활성화 (데이터 보존을 위해 일단 이름 변경) table.renameColumn('role', '_role_old'); table.renameColumn('access_level', '_access_level_old'); }) // 5. user_permissions (사용자-개별 권한) 조인 테이블 생성 .createTable('user_permissions', function(table) { table.integer('user_id').notNullable().references('user_id').inTable('users').onDelete('CASCADE'); table.integer('permission_id').unsigned().notNullable().references('id').inTable('permissions').onDelete('CASCADE'); table.primary(['user_id', 'permission_id']); }); }; /** * @param { import("knex").Knex } knex * @returns { Promise } */ exports.down = function(knex) { return knex.schema .dropTableIfExists('user_permissions') .dropTableIfExists('role_permissions') .dropTableIfExists('permissions') .dropTableIfExists('roles') .table('users', function(table) { table.dropColumn('role_id'); table.renameColumn('_role_old', 'role'); table.renameColumn('_access_level_old', 'access_level'); }); };