기능구현중

This commit is contained in:
2026-01-11 17:01:01 +09:00
parent 375d5bf91a
commit 954ba21211
148 changed files with 2276 additions and 0 deletions

View File

@@ -0,0 +1,19 @@
-- Synology SSO 연동을 위한 컬럼 추가
-- 실행: psql -d weeklyreport -f add_synology_columns.sql
-- Synology 계정 연결 정보 컬럼 추가
ALTER TABLE wr_employee_info ADD COLUMN IF NOT EXISTS synology_id VARCHAR(100);
ALTER TABLE wr_employee_info ADD COLUMN IF NOT EXISTS synology_email VARCHAR(255);
ALTER TABLE wr_employee_info ADD COLUMN IF NOT EXISTS synology_linked_at TIMESTAMP;
-- 인덱스 추가
CREATE INDEX IF NOT EXISTS idx_employee_synology_id ON wr_employee_info(synology_id);
-- 로그인 이력 테이블에 login_type 컬럼 추가 (이미 있을 수 있음)
ALTER TABLE wr_login_history ADD COLUMN IF NOT EXISTS login_type VARCHAR(20) DEFAULT 'PASSWORD';
ALTER TABLE wr_login_history ADD COLUMN IF NOT EXISTS login_email VARCHAR(255);
COMMENT ON COLUMN wr_employee_info.synology_id IS 'Synology 사용자 ID';
COMMENT ON COLUMN wr_employee_info.synology_email IS 'Synology 계정 이메일';
COMMENT ON COLUMN wr_employee_info.synology_linked_at IS 'Synology 계정 연결 일시';
COMMENT ON COLUMN wr_login_history.login_type IS '로그인 방식 (PASSWORD, GOOGLE, SYNOLOGY)';

View File

@@ -0,0 +1,21 @@
-- 주간보고 공유 이력 테이블
-- 실행: psql -d weeklyreport -f create_report_share_log.sql
CREATE TABLE IF NOT EXISTS wr_report_share_log (
share_id SERIAL PRIMARY KEY,
report_id INTEGER NOT NULL REFERENCES wr_weekly_report(report_id),
shared_to VARCHAR(255) NOT NULL, -- 공유 대상 (이메일 또는 그룹명)
shared_type VARCHAR(50) NOT NULL DEFAULT 'GOOGLE_GROUP', -- GOOGLE_GROUP, EMAIL, SLACK 등
shared_by INTEGER NOT NULL REFERENCES wr_employee_info(employee_id),
shared_at TIMESTAMP DEFAULT NOW(),
message_id VARCHAR(255), -- Gmail 메시지 ID 등
share_status VARCHAR(20) DEFAULT 'SUCCESS', -- SUCCESS, FAILED
error_message TEXT
);
CREATE INDEX IF NOT EXISTS idx_report_share_report_id ON wr_report_share_log(report_id);
CREATE INDEX IF NOT EXISTS idx_report_share_shared_by ON wr_report_share_log(shared_by);
COMMENT ON TABLE wr_report_share_log IS '주간보고 공유 이력';
COMMENT ON COLUMN wr_report_share_log.shared_to IS '공유 대상 (이메일, 그룹 등)';
COMMENT ON COLUMN wr_report_share_log.shared_type IS '공유 방식 (GOOGLE_GROUP, EMAIL, SLACK 등)';

View File

@@ -0,0 +1,59 @@
-- ============================================
-- 권한 관리 시스템 테이블 생성
-- 작성일: 2025-01-10
-- ============================================
-- 1. 권한 마스터 테이블
CREATE TABLE IF NOT EXISTS wr_role (
role_id SERIAL PRIMARY KEY,
role_code VARCHAR(50) NOT NULL UNIQUE, -- ROLE_ADMIN, ROLE_MANAGER, ROLE_USER
role_name VARCHAR(100) NOT NULL, -- 관리자, 매니저, 일반사용자
role_description TEXT, -- 권한 설명
is_internal_ip_only BOOLEAN DEFAULT false, -- 내부IP 제한 여부
sort_order INTEGER DEFAULT 0, -- 정렬 순서
is_active BOOLEAN DEFAULT true, -- 활성화 여부
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 2. 사용자-권한 매핑 테이블
CREATE TABLE IF NOT EXISTS wr_employee_role (
employee_role_id SERIAL PRIMARY KEY,
employee_id INTEGER NOT NULL REFERENCES wr_employee_info(employee_id) ON DELETE CASCADE,
role_id INTEGER NOT NULL REFERENCES wr_role(role_id) ON DELETE CASCADE,
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(employee_id, role_id)
);
-- 인덱스 생성
CREATE INDEX IF NOT EXISTS idx_employee_role_employee ON wr_employee_role(employee_id);
CREATE INDEX IF NOT EXISTS idx_employee_role_role ON wr_employee_role(role_id);
CREATE INDEX IF NOT EXISTS idx_role_code ON wr_role(role_code);
-- ============================================
-- 기본 권한 데이터 INSERT
-- ============================================
INSERT INTO wr_role (role_code, role_name, role_description, sort_order) VALUES
('ROLE_ADMIN', '관리자', '시스템 전체 관리 권한', 1),
('ROLE_MANAGER', '매니저', '취합보고서 등 관리 기능', 2),
('ROLE_USER', '일반사용자', '기본 기능 (주간보고 작성/조회)', 3)
ON CONFLICT (role_code) DO NOTHING;
-- ============================================
-- 기존 관리자 계정에 ROLE_ADMIN 부여
-- ============================================
INSERT INTO wr_employee_role (employee_id, role_id)
SELECT e.employee_id, r.role_id
FROM wr_employee_info e, wr_role r
WHERE e.employee_email = 'coziny@gmail.com'
AND r.role_code = 'ROLE_ADMIN'
ON CONFLICT (employee_id, role_id) DO NOTHING;
-- ============================================
-- 확인 쿼리
-- ============================================
-- SELECT * FROM wr_role ORDER BY sort_order;
-- SELECT e.employee_name, e.employee_email, r.role_code, r.role_name
-- FROM wr_employee_info e
-- JOIN wr_employee_role er ON e.employee_id = er.employee_id
-- JOIN wr_role r ON er.role_id = r.role_id;

View File

@@ -0,0 +1,18 @@
-- 세션 테이블 (Spring Session JDBC와 유사한 구조)
CREATE TABLE IF NOT EXISTS wr_session (
session_id VARCHAR(64) PRIMARY KEY, -- 세션 토큰 (랜덤 생성)
employee_id INTEGER NOT NULL REFERENCES wr_employee_info(employee_id),
login_history_id INTEGER REFERENCES wr_login_history(history_id),
created_at TIMESTAMP DEFAULT NOW(), -- 세션 생성 시간
last_access_at TIMESTAMP DEFAULT NOW(), -- 마지막 접근 시간
expires_at TIMESTAMP NOT NULL, -- 만료 시간
login_ip VARCHAR(45), -- 로그인 IP
user_agent TEXT -- 브라우저 정보
);
-- 인덱스
CREATE INDEX IF NOT EXISTS idx_wr_session_employee_id ON wr_session(employee_id);
CREATE INDEX IF NOT EXISTS idx_wr_session_expires_at ON wr_session(expires_at);
-- 만료된 세션 자동 정리 (선택사항 - 배치로 실행)
-- DELETE FROM wr_session WHERE expires_at < NOW();