getCookie 제거

This commit is contained in:
2026-01-10 21:59:11 +09:00
parent ef7914d5c6
commit 1b8cd8577e
30 changed files with 195 additions and 145 deletions

View File

@@ -1,6 +1,5 @@
import { query, execute, queryOne } from '../../utils/db'
const ADMIN_EMAIL = 'coziny@gmail.com'
import { requireAdmin } from '../../utils/session'
interface TaskInput {
description: string
@@ -31,22 +30,15 @@ interface ReportInput {
*/
export default defineEventHandler(async (event) => {
// 관리자 권한 체크
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAdmin(event)
const clientIp = getHeader(event, 'x-forwarded-for') || 'unknown'
const currentUser = await query<any>(`
// 관리자 이메일 조회
const currentUser = await queryOne<any>(`
SELECT employee_email FROM wr_employee_info WHERE employee_id = $1
`, [userId])
if (!currentUser[0] || currentUser[0].employee_email !== ADMIN_EMAIL) {
throw createError({ statusCode: 403, message: '관리자만 사용할 수 있습니다.' })
}
const adminEmail = currentUser[0].employee_email
const adminEmail = currentUser?.employee_email || ''
const body = await readBody<{
reportYear: number

View File

@@ -1,7 +1,6 @@
import { query } from '../../utils/db'
import { callOpenAIVision, REPORT_PARSE_SYSTEM_PROMPT } from '../../utils/openai'
const ADMIN_EMAIL = 'coziny@gmail.com'
import { requireAdmin } from '../../utils/session'
interface ParsedTask {
description: string
@@ -37,18 +36,7 @@ interface ParsedResult {
*/
export default defineEventHandler(async (event) => {
// 관리자 권한 체크
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const currentUser = await query<any>(`
SELECT employee_email FROM wr_employee_info WHERE employee_id = $1
`, [userId])
if (!currentUser[0] || currentUser[0].employee_email !== ADMIN_EMAIL) {
throw createError({ statusCode: 403, message: '관리자만 사용할 수 있습니다.' })
}
await requireAdmin(event)
const body = await readBody<{ images: string[] }>(event)

View File

@@ -1,7 +1,6 @@
import { query } from '../../utils/db'
import { callOpenAI, buildParseReportPrompt } from '../../utils/openai'
const ADMIN_EMAIL = 'coziny@gmail.com'
import { requireAdmin } from '../../utils/session'
interface ParsedTask {
description: string
@@ -37,18 +36,7 @@ interface ParsedResult {
*/
export default defineEventHandler(async (event) => {
// 관리자 권한 체크
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const currentUser = await query<any>(`
SELECT employee_email FROM wr_employee_info WHERE employee_id = $1
`, [userId])
if (!currentUser[0] || currentUser[0].employee_email !== ADMIN_EMAIL) {
throw createError({ statusCode: 403, message: '관리자만 사용할 수 있습니다.' })
}
await requireAdmin(event)
const body = await readBody<{ rawText: string }>(event)

View File

@@ -1,15 +1,13 @@
import { query } from '../../utils/db'
import { callOpenAIVision } from '../../utils/openai'
import { requireAuth } from '../../utils/session'
/**
* 개인 주간보고 이미지 분석 (OpenAI Vision)
* POST /api/ai/parse-my-report-image
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const body = await readBody<{ images: string[] }>(event)

View File

@@ -1,5 +1,6 @@
import { query } from '../../utils/db'
import { callOpenAI } from '../../utils/openai'
import { requireAuth } from '../../utils/session'
interface ParsedTask {
description: string
@@ -26,10 +27,7 @@ interface ParsedResult {
* POST /api/ai/parse-my-report
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const body = await readBody<{ rawText: string }>(event)

View File

@@ -1,4 +1,5 @@
import { query } from '../../utils/db'
import { requireAuth } from '../../utils/session'
/**
* 대시보드 통계 API
@@ -9,10 +10,7 @@ import { query } from '../../utils/db'
* - 제출 현황
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const q = getQuery(event)
const year = parseInt(q.year as string) || new Date().getFullYear()

View File

@@ -1,12 +1,19 @@
import { queryOne, query } from '../../../utils/db'
import { requireAuth, getSessionIdFromCookie, getDbSession } from '../../../utils/session'
/**
* 직원 상세 조회
* GET /api/employee/[id]/detail
*/
export default defineEventHandler(async (event) => {
await requireAuth(event)
const employeeId = getRouterParam(event, 'id')
const currentHistoryId = getCookie(event, 'login_history_id')
// 세션에서 현재 로그인 히스토리 ID 가져오기
const sessionId = getSessionIdFromCookie(event)
const session = sessionId ? await getDbSession(sessionId) : null
const currentHistoryId = session?.loginHistoryId || null
const employee = await queryOne<any>(`
SELECT * FROM wr_employee_info WHERE employee_id = $1

View File

@@ -1,14 +1,12 @@
import { query, execute } from '../../../utils/db'
import { requireAuth } from '../../../utils/session'
/**
* 개선의견 삭제
* DELETE /api/feedback/[id]/delete
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const feedbackId = getRouterParam(event, 'id')
if (!feedbackId) {
@@ -24,7 +22,7 @@ export default defineEventHandler(async (event) => {
throw createError({ statusCode: 404, message: '의견을 찾을 수 없습니다.' })
}
if (feedback[0].author_id !== parseInt(userId)) {
if (feedback[0].author_id !== userId) {
throw createError({ statusCode: 403, message: '본인의 의견만 삭제할 수 있습니다.' })
}

View File

@@ -1,14 +1,12 @@
import { query, execute, queryOne } from '../../../utils/db'
import { requireAuth } from '../../../utils/session'
/**
* 개선의견 공감 토글
* POST /api/feedback/[id]/like
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const feedbackId = getRouterParam(event, 'id')
if (!feedbackId) {

View File

@@ -1,14 +1,12 @@
import { query, execute } from '../../../utils/db'
import { requireAuth } from '../../../utils/session'
/**
* 개선의견 수정
* PUT /api/feedback/[id]/update
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const feedbackId = getRouterParam(event, 'id')
if (!feedbackId) {
@@ -24,7 +22,7 @@ export default defineEventHandler(async (event) => {
throw createError({ statusCode: 404, message: '의견을 찾을 수 없습니다.' })
}
if (feedback[0].author_id !== parseInt(userId)) {
if (feedback[0].author_id !== userId) {
throw createError({ statusCode: 403, message: '본인의 의견만 수정할 수 있습니다.' })
}

View File

@@ -1,14 +1,12 @@
import { query, queryOne } from '../../utils/db'
import { requireAuth } from '../../utils/session'
/**
* 개선의견 작성
* POST /api/feedback/create
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const body = await readBody<{
category: string

View File

@@ -1,14 +1,12 @@
import { query } from '../../utils/db'
import { requireAuth } from '../../utils/session'
/**
* 개선의견 목록 조회
* GET /api/feedback/list
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const q = getQuery(event)
const page = parseInt(q.page as string) || 1
@@ -91,7 +89,7 @@ export default defineEventHandler(async (event) => {
createdAt: f.created_at,
updatedAt: f.updated_at,
isLiked: f.is_liked,
isOwner: f.author_id === parseInt(userId)
isOwner: f.author_id === userId
})),
pagination: {
page,

View File

@@ -1,14 +1,12 @@
import { query } from '../../utils/db'
import { requireAuth } from '../../utils/session'
/**
* 내가 보고서 작성한 프로젝트 목록
* GET /api/project/my-projects
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
// 내가 주간보고를 작성한 프로젝트 + 전체 활성 프로젝트
const projects = await query(`
@@ -23,7 +21,7 @@ export default defineEventHandler(async (event) => {
) t ON p.project_id = t.project_id
WHERE p.project_status = 'ACTIVE'
ORDER BY has_my_report DESC, p.project_name
`, [parseInt(userId)])
`, [userId])
return projects.map((p: any) => ({
projectId: p.project_id,

View File

@@ -1,4 +1,5 @@
import { execute, queryOne } from '../../../../utils/db'
import { requireAuth } from '../../../../utils/session'
interface ReviewBody {
reviewerComment?: string
@@ -9,10 +10,7 @@ interface ReviewBody {
* PUT /api/report/summary/[id]/review
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const summaryId = getRouterParam(event, 'id')
const body = await readBody<ReviewBody>(event)
@@ -33,7 +31,7 @@ export default defineEventHandler(async (event) => {
summary_status = 'REVIEWED',
updated_at = NOW()
WHERE summary_id = $3
`, [parseInt(userId), body.reviewerComment || null, summaryId])
`, [userId, body.reviewerComment || null, summaryId])
return { success: true }
})

View File

@@ -1,7 +1,8 @@
import { defineEventHandler, readBody, createError, getCookie } from 'h3'
import { defineEventHandler, readBody, createError } from 'h3'
import { query, queryOne, execute, insertReturning } from '../../../utils/db'
import { getClientIp } from '../../../utils/ip'
import { getCurrentUserEmail } from '../../../utils/user'
import { requireAuth } from '../../../utils/session'
import OpenAI from 'openai'
interface AggregateBody {
@@ -19,10 +20,7 @@ const openai = new OpenAI({
* POST /api/report/summary/aggregate
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const body = await readBody<AggregateBody>(event)
const clientIp = getClientIp(event)

View File

@@ -1,12 +1,9 @@
import { defineEventHandler, getQuery, createError, getCookie } from 'h3'
import { defineEventHandler, getQuery, createError } from 'h3'
import { query } from '../../../utils/db'
import { requireAuth } from '../../../utils/session'
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const { year, week } = getQuery(event)

View File

@@ -1,5 +1,6 @@
import { defineEventHandler, createError, getCookie } from 'h3'
import { defineEventHandler, createError } from 'h3'
import { query, queryOne, execute } from '../../../utils/db'
import { requireAuth } from '../../../utils/session'
import OpenAI from 'openai'
const openai = new OpenAI({
@@ -11,10 +12,7 @@ const openai = new OpenAI({
* POST /api/report/summary/regenerate-ai
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
// AI 요약이 없는 취합 보고서 조회
const summaries = await query<any>(`

View File

@@ -1,4 +1,5 @@
import { query, execute } from '../../../../utils/db'
import { requireAuth } from '../../../../utils/session'
const ADMIN_EMAIL = 'coziny@gmail.com'
@@ -7,10 +8,7 @@ const ADMIN_EMAIL = 'coziny@gmail.com'
* DELETE /api/report/weekly/[id]/delete
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const reportId = getRouterParam(event, 'id')
if (!reportId) {
@@ -33,7 +31,7 @@ export default defineEventHandler(async (event) => {
}
// 권한 체크: 본인 또는 관리자만 삭제 가능
if (report[0].author_id !== parseInt(userId) && !isAdmin) {
if (report[0].author_id !== userId && !isAdmin) {
throw createError({ statusCode: 403, message: '삭제 권한이 없습니다.' })
}

View File

@@ -1,14 +1,12 @@
import { query, queryOne } from '../../../../utils/db'
import { requireAuth } from '../../../../utils/session'
/**
* 주간보고 상세 조회
* GET /api/report/weekly/[id]/detail
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const reportId = getRouterParam(event, 'id')

View File

@@ -1,16 +1,14 @@
import { execute, queryOne } from '../../../../utils/db'
import { getClientIp } from '../../../../utils/ip'
import { getCurrentUserEmail } from '../../../../utils/user'
import { requireAuth } from '../../../../utils/session'
/**
* 주간보고 제출
* POST /api/report/weekly/[id]/submit
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const reportId = getRouterParam(event, 'id')
const clientIp = getClientIp(event)
@@ -25,7 +23,7 @@ export default defineEventHandler(async (event) => {
throw createError({ statusCode: 404, message: '보고서를 찾을 수 없습니다.' })
}
if (report.author_id !== parseInt(userId)) {
if (report.author_id !== userId) {
throw createError({ statusCode: 403, message: '본인의 보고서만 제출할 수 있습니다.' })
}

View File

@@ -1,4 +1,5 @@
import { query, execute, queryOne } from '../../../../utils/db'
import { requireAuth } from '../../../../utils/session'
const ADMIN_EMAIL = 'coziny@gmail.com'
@@ -7,10 +8,7 @@ const ADMIN_EMAIL = 'coziny@gmail.com'
* PUT /api/report/weekly/[id]/update
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const reportId = getRouterParam(event, 'id')
const clientIp = getHeader(event, 'x-forwarded-for') || 'unknown'
@@ -28,7 +26,7 @@ export default defineEventHandler(async (event) => {
}
// 관리자가 아니면 본인 보고서만 수정 가능
if (!isAdmin && report.author_id !== parseInt(userId)) {
if (!isAdmin && report.author_id !== userId) {
throw createError({ statusCode: 403, message: '본인의 보고서만 수정할 수 있습니다.' })
}

View File

@@ -1,14 +1,13 @@
import { query, execute, queryOne } from '../../../utils/db'
import { requireAuth } from '../../../utils/session'
/**
* 주간보고 작성
* POST /api/report/weekly/create
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
// 세션 기반 인증 사용 (레거시 쿠키 대신)
const userId = await requireAuth(event)
const clientIp = getHeader(event, 'x-forwarded-for') || 'unknown'
const user = await queryOne<any>(`SELECT employee_email FROM wr_employee_info WHERE employee_id = $1`, [userId])

View File

@@ -1,15 +1,13 @@
import { query } from '../../../utils/db'
import { getWeekInfo, formatWeekString } from '../../../utils/week-calc'
import { requireAuth } from '../../../utils/session'
/**
* 이번 주 보고서 현황 조회
* GET /api/report/weekly/current-week
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
const userId = await requireAuth(event)
const weekInfo = getWeekInfo()
@@ -20,7 +18,7 @@ export default defineEventHandler(async (event) => {
JOIN wr_project_info p ON r.project_id = p.project_id
WHERE r.author_id = $1 AND r.report_year = $2 AND r.report_week = $3
ORDER BY p.project_name
`, [parseInt(userId), weekInfo.year, weekInfo.week])
`, [userId, weekInfo.year, weekInfo.week])
return {
weekInfo: {

View File

@@ -1,4 +1,5 @@
import { query } from '../../../utils/db'
import { requireAuth } from '../../../utils/session'
const ADMIN_EMAIL = 'coziny@gmail.com'
@@ -19,10 +20,8 @@ const ADMIN_EMAIL = 'coziny@gmail.com'
* - limit: 조회 개수 (기본 100)
*/
export default defineEventHandler(async (event) => {
const userId = getCookie(event, 'user_id')
if (!userId) {
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
}
// 세션 기반 인증 사용
const userId = await requireAuth(event)
// 현재 사용자 정보 조회 (관리자 여부 확인)
const currentUser = await query<any>(`