142 lines
6.7 KiB
SQL
142 lines
6.7 KiB
SQL
-- Aislo 로그인·보안 시스템 증분 마이그레이션 (MariaDB 10.6+)
|
|
USE aislo_db;
|
|
|
|
ALTER TABLE users
|
|
ADD COLUMN IF NOT EXISTS role ENUM('SYSTEM_ADMIN', 'MASTER', 'MEMBER') NOT NULL DEFAULT 'MEMBER',
|
|
ADD COLUMN IF NOT EXISTS is_master BOOLEAN NOT NULL DEFAULT FALSE,
|
|
ADD COLUMN IF NOT EXISTS status ENUM('PENDING_EMAIL', 'PENDING', 'ACTIVE', 'INACTIVE', 'REJECTED') NOT NULL DEFAULT 'PENDING_EMAIL',
|
|
ADD COLUMN IF NOT EXISTS last_email_verified_at TIMESTAMP NULL,
|
|
ADD COLUMN IF NOT EXISTS login_failures INT NOT NULL DEFAULT 0,
|
|
ADD COLUMN IF NOT EXISTS last_failed_at TIMESTAMP NULL,
|
|
ADD COLUMN IF NOT EXISTS account_locked_until TIMESTAMP NULL;
|
|
|
|
ALTER TABLE companies
|
|
ADD COLUMN IF NOT EXISTS company_code VARCHAR(20) NULL,
|
|
ADD COLUMN IF NOT EXISTS phone_number VARCHAR(20) NULL,
|
|
ADD COLUMN IF NOT EXISTS representative_name VARCHAR(100) NULL,
|
|
ADD COLUMN IF NOT EXISTS master_user_id INT NULL,
|
|
ADD COLUMN IF NOT EXISTS status ENUM('ACTIVE', 'INACTIVE', 'SUSPENDED') NOT NULL DEFAULT 'ACTIVE',
|
|
ADD COLUMN IF NOT EXISTS subscription_status ENUM('FREE', 'TRIAL', 'PAID', 'EXPIRED') NOT NULL DEFAULT 'FREE';
|
|
|
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
id VARCHAR(255) PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
user_agent_hash CHAR(64) NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
expires_at TIMESTAMP NOT NULL,
|
|
last_activity_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_sessions_user_id (user_id),
|
|
INDEX idx_sessions_expires_at (expires_at),
|
|
CONSTRAINT fk_sessions_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS email_otps (
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
purpose ENUM('REGISTER', 'LOGIN', 'REVERIFY', 'PASSWORD_CHANGE') NOT NULL,
|
|
otp_hash VARCHAR(255) NOT NULL,
|
|
expires_at TIMESTAMP NOT NULL,
|
|
consumed_at TIMESTAMP NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_email_otps_user_purpose (user_id, purpose, created_at),
|
|
CONSTRAINT fk_email_otps_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS trusted_devices (
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
user_agent_hash CHAR(64) NOT NULL,
|
|
verified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
last_used_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE KEY uq_trusted_devices_user_agent (user_id, user_agent_hash),
|
|
CONSTRAINT fk_trusted_devices_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS join_requests (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
company_id INT NOT NULL,
|
|
status ENUM('PENDING', 'APPROVED', 'REJECTED') NOT NULL DEFAULT 'PENDING',
|
|
requested_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
reviewed_at TIMESTAMP NULL,
|
|
reviewed_by INT NULL,
|
|
review_comment TEXT,
|
|
INDEX idx_join_requests_company_status (company_id, status),
|
|
CONSTRAINT fk_join_requests_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_join_requests_company_id FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_join_requests_reviewed_by FOREIGN KEY (reviewed_by) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS login_logs (
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NULL,
|
|
email VARCHAR(255) NOT NULL,
|
|
status ENUM('SUCCESS', 'FAILURE') NOT NULL,
|
|
failure_reason VARCHAR(100),
|
|
user_agent TEXT,
|
|
login_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_login_logs_user_id (user_id),
|
|
INDEX idx_login_logs_login_at (login_at),
|
|
CONSTRAINT fk_login_logs_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS activity_logs (
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
action_type VARCHAR(100) NOT NULL,
|
|
action_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
resource_id VARCHAR(255),
|
|
status ENUM('SUCCESS', 'FAILURE') NOT NULL DEFAULT 'SUCCESS',
|
|
details JSON,
|
|
INDEX idx_activity_logs_user_at (user_id, action_at),
|
|
CONSTRAINT fk_activity_logs_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS system_admin_logs (
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
admin_user_id INT NOT NULL,
|
|
action_type VARCHAR(100) NOT NULL,
|
|
target_id VARCHAR(255),
|
|
action_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
details JSON,
|
|
INDEX idx_system_admin_logs_admin_at (admin_user_id, action_at),
|
|
CONSTRAINT fk_system_admin_logs_admin_user_id FOREIGN KEY (admin_user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS support_requests (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
company_id INT NULL,
|
|
company_name VARCHAR(255) NULL,
|
|
user_name VARCHAR(255) NOT NULL,
|
|
user_email VARCHAR(255) NOT NULL,
|
|
user_phone VARCHAR(30) NULL,
|
|
subject VARCHAR(255) NOT NULL,
|
|
message TEXT NOT NULL,
|
|
status ENUM('NEW', 'REVIEWED', 'RESOLVED', 'DELETED') NOT NULL DEFAULT 'NEW',
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
reviewed_at TIMESTAMP NULL,
|
|
reviewed_by INT NULL,
|
|
review_notes TEXT,
|
|
INDEX idx_support_requests_status_at (status, created_at),
|
|
CONSTRAINT fk_support_requests_company_id FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_support_requests_reviewed_by FOREIGN KEY (reviewed_by) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 기존 support_requests 테이블에 고객 정보 컬럼 증분 추가
|
|
ALTER TABLE support_requests
|
|
ADD COLUMN IF NOT EXISTS company_name VARCHAR(255) NULL AFTER company_id,
|
|
ADD COLUMN IF NOT EXISTS user_name VARCHAR(255) NOT NULL DEFAULT '' AFTER company_name,
|
|
ADD COLUMN IF NOT EXISTS user_phone VARCHAR(30) NULL AFTER user_email;
|
|
|
|
CREATE TABLE IF NOT EXISTS user_consents (
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
terms_version VARCHAR(20) NOT NULL,
|
|
terms_agreed BOOLEAN NOT NULL,
|
|
privacy_agreed BOOLEAN NOT NULL,
|
|
marketing_agreed BOOLEAN NOT NULL DEFAULT FALSE,
|
|
agreed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE KEY uq_user_consents_version (user_id, terms_version),
|
|
CONSTRAINT fk_user_consents_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|