🔧 웹훅 URL을 HTTPS로 수정
Some checks failed
🚀 Deploy - Demo / deployment (push) Has been cancelled

- 웹훅 URL을 https://admin.youtooplay.com/webhook로 변경
- Nginx 리버스 프록시 설정 파일 추가
- 배포 가이드 업데이트
This commit is contained in:
2025-10-01 01:47:51 +09:00
parent f331b52e64
commit 83b162d2bd
713 changed files with 98449 additions and 38378 deletions

View File

@@ -0,0 +1,73 @@
import { PrismaClient } from '@prisma/client'
import bcrypt from 'bcryptjs'
import jwt from 'jsonwebtoken'
const prisma = new PrismaClient()
export default defineEventHandler(async (event) => {
const body = await readBody(event)
const { user_id, password } = body
console.log('로그인 요청:', { user_id, password: password ? '***' : 'undefined' })
if (!user_id || !password) {
throw createError({
statusCode: 400,
statusMessage: '아이디와 비밀번호를 입력해주세요.',
})
}
try {
const user = await prisma.members.findUnique({
where: { user_id },
})
console.log('사용자 조회 결과:', user)
if (!user) {
throw createError({
statusCode: 401,
statusMessage: '존재하지 않는 아이디입니다.',
})
}
// 비밀번호 비교 (평문 비밀번호로 저장되어 있으므로 직접 비교)
if (user.password !== password) {
console.log('비밀번호 불일치:', {
입력된비밀번호: password,
저장된비밀번호: user.password
})
throw createError({
statusCode: 401,
statusMessage: '비밀번호가 일치하지 않습니다.',
})
}
console.log('로그인 성공:', { user_id: user.user_id, name: user.name })
// JWT 토큰 생성
const token = jwt.sign(
{ id: user.id, user_id: user.user_id, name: user.name, role_level: user.role_level },
'your-secret-key', // 실제 서비스에서는 환경 변수로 관리
{ expiresIn: '24h' },
)
return {
success: true,
message: '로그인 성공',
token,
user: {
id: user.id,
user_id: user.user_id,
name: user.name,
role_level: user.role_level,
},
}
} catch (error: any) {
console.error('로그인 오류:', error)
throw createError({
statusCode: error.statusCode || 500,
statusMessage: error.statusMessage || '로그인 중 오류가 발생했습니다.',
})
}
})

View File

@@ -0,0 +1,71 @@
import { Pool } from 'pg'
import bcrypt from 'bcryptjs'
const pool = new Pool({
user: 'musicuser',
host: 'localhost',
database: 'musicdb',
password: 'Tjqjqhdks$321',
port: 5432,
})
export default defineEventHandler(async (event) => {
try {
const body = await readBody(event)
const { user_id, password, name, role_level } = body
if (!user_id || !password || !name || !role_level) {
throw createError({
statusCode: 400,
statusMessage: '모든 필드를 입력해주세요.'
})
}
// 권한 등급 검증 (1~3)
if (role_level < 1 || role_level > 3) {
throw createError({
statusCode: 400,
statusMessage: '권한 등급은 1~3 사이여야 합니다.'
})
}
// 아이디 중복 확인
const existingUser = await pool.query(
'SELECT user_id FROM members WHERE user_id = $1',
[user_id]
)
if (existingUser.rows.length > 0) {
throw createError({
statusCode: 409,
statusMessage: '이미 존재하는 아이디입니다.'
})
}
// 비밀번호 해시화 (현재는 평문 저장, 추후 bcrypt로 변경)
// const hashedPassword = await bcrypt.hash(password, 10)
// 사용자 등록
const result = await pool.query(
'INSERT INTO members (user_id, password, name, role_level) VALUES ($1, $2, $3, $4) RETURNING *',
[user_id, password, name, role_level]
)
const newUser = result.rows[0]
return {
success: true,
message: '회원가입이 완료되었습니다.',
user: {
id: newUser.id,
user_id: newUser.user_id,
name: newUser.name,
role_level: newUser.role_level
}
}
} catch (error) {
console.error('Register error:', error)
throw error
}
})

View File

@@ -0,0 +1,34 @@
import jwt from 'jsonwebtoken'
export default defineEventHandler(async (event) => {
try {
const token = getCookie(event, 'auth-token') || getHeader(event, 'authorization')?.replace('Bearer ', '')
if (!token) {
throw createError({
statusCode: 401,
statusMessage: '인증 토큰이 없습니다.'
})
}
// JWT 토큰 검증
const decoded = jwt.verify(token, 'your-secret-key') as any
return {
success: true,
user: {
id: decoded.id,
user_id: decoded.user_id,
name: decoded.name,
role_level: decoded.role_level
}
}
} catch (error) {
console.error('Token verification error:', error)
throw createError({
statusCode: 401,
statusMessage: '유효하지 않은 토큰입니다.'
})
}
})