Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions src/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
def create_app():
app = Flask(__name__)

# ✅ CORS 설정: withCredentials 대응
CORS(app, origins="http://localhost:5173", supports_credentials=True)
# ✅ CORS 설정: withCredentials 대응 + 모든 라우트에 확실하게 적용
CORS(app, resources={r"/*": {"origins": "http://localhost:5173"}}, supports_credentials=True)

app.config.from_object(Config)

Expand Down Expand Up @@ -42,11 +42,10 @@ def create_app():
# 블루프린트 등록
from src.routes.index import index_bp
app.register_blueprint(index_bp)

# TranScore 블루프린트 등록

from src.routes.auth import auth_bp
from src.routes.user import user_bp
from src.routes.score import score_bp
from src.routes.score import score_bp
from src.routes.transform import transform_bp
from src.routes.result import result_bp
from src.routes.mypage_upload_score import upload_score_bp
Expand Down
64 changes: 32 additions & 32 deletions src/routes/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,20 @@ def kakao_callback():
}
token_response = requests.post(token_url, data=token_data)
token_json = token_response.json()
access_token = token_json.get('access_token')
if not access_token:
accessToken = token_json.get('access_token')
if not accessToken:
return jsonify({'error': 'Failed to get Kakao access token'}), 400

user_info_url = "https://kapi.kakao.com/v2/user/me"
headers = {"Authorization": f"Bearer {access_token}"}
headers = {"Authorization": f"Bearer {accessToken}"}
user_info_response = requests.get(user_info_url, headers=headers)
user_info = user_info_response.json()

kakao_id = user_info.get("id")
kakaoId = user_info.get("id")
nickname = user_info.get("properties", {}).get("nickname", "")
profile_image = user_info.get("properties", {}).get("profile_image", "")
profileImage = user_info.get("properties", {}).get("profile_image", "")

result = handle_kakao_login(kakao_id, nickname, profile_image)
result = handle_kakao_login(kakaoId, nickname, profileImage)
return jsonify(result), 200


Expand Down Expand Up @@ -78,9 +78,9 @@ def kakao_callback():
'schema': {
'type': 'object',
'properties': {
'access_token': {'type': 'string'},
'refresh_token': {'type': 'string'},
'user_id': {'type': 'integer'},
'accessToken': {'type': 'string'},
'refreshToken': {'type': 'string'},
'userId': {'type': 'integer'},
'nickname': {'type': 'string'}
}
}
Expand All @@ -107,20 +107,20 @@ def kakao_token():
}
token_response = requests.post(token_url, data=token_data)
token_json = token_response.json()
access_token = token_json.get('access_token')
if not access_token:
accessToken = token_json.get('access_token')
if not accessToken:
return jsonify({'error': 'Failed to get Kakao access token'}), 400

user_info_url = "https://kapi.kakao.com/v2/user/me"
headers = {"Authorization": f"Bearer {access_token}"}
headers = {"Authorization": f"Bearer {accessToken}"}
user_info_response = requests.get(user_info_url, headers=headers)
user_info = user_info_response.json()

kakao_id = user_info.get("id")
kakaoId = user_info.get("id")
nickname = user_info.get("properties", {}).get("nickname", "")
profile_image = user_info.get("properties", {}).get("profile_image", "")
profileImage = user_info.get("properties", {}).get("profile_image", "")

result = handle_kakao_login(kakao_id, nickname, profile_image)
result = handle_kakao_login(kakaoId, nickname, profileImage)
return jsonify(result), 200

except Exception as e:
Expand All @@ -141,9 +141,9 @@ def refresh():
schema:
type: object
required:
- refresh_token
- refreshToken
properties:
refresh_token:
refreshToken:
type: string
example: "abc.def.ghi"
responses:
Expand All @@ -154,10 +154,10 @@ def refresh():
schema:
type: object
properties:
access_token:
accessToken:
type: string
example: "new.access.token"
refresh_token:
refreshToken:
type: string
example: "original.refresh.token"
400:
Expand All @@ -166,18 +166,18 @@ def refresh():
description: 토큰 만료 또는 유효하지 않음
"""
data = request.get_json()
refresh_token = data.get('refresh_token')
refreshToken = data.get('refreshToken')

if not refresh_token:
if not refreshToken:
return jsonify({"error": "No refresh token provided"}), 400

new_access_token, error = refresh_access_token(refresh_token)
newAccessToken, error = refresh_access_token(refreshToken)
if error:
return jsonify({"error": error}), 401

return jsonify({
"access_token": new_access_token,
"refresh_token": refresh_token
"accessToken": newAccessToken,
"refreshToken": refreshToken
}), 200


Expand All @@ -189,7 +189,7 @@ def issue_test_token():
tags:
- auth
summary: 테스트용 JWT 토큰 발급
description: 테스트용 유저 정보를 기반으로 access_token, refresh_token을 자동 발급합니다.
description: 테스트용 유저 정보를 기반으로 accessToken, refreshToken을 자동 발급합니다.
responses:
200:
description: 토큰 발급 성공
Expand All @@ -198,24 +198,24 @@ def issue_test_token():
schema:
type: object
properties:
access_token:
accessToken:
type: string
description: "Access Token"
refresh_token:
refreshToken:
type: string
description: "Refresh Token"
user_id:
userId:
type: integer
example: 1
nickname:
type: string
example: "테스트유저"
"""
kakao_id = "test_kakao_12345"
kakaoId = "test_kakao_12345"
nickname = "테스트유저"
profile_image = ""
profileImage = ""

result = handle_kakao_login(kakao_id, nickname, profile_image)
result = handle_kakao_login(kakaoId, nickname, profileImage)
return jsonify(result), 200


Expand All @@ -227,7 +227,7 @@ def logout():
tags:
- auth
summary: 로그아웃
description: 클라이언트가 저장한 access_tokenrefresh_token을 삭제하면 로그아웃이 완료됩니다. 서버에서는 별도 처리를 하지 않습니다.
description: 클라이언트가 저장한 accessTokenrefreshToken을 삭제하면 로그아웃이 완료됩니다. 서버에서는 별도 처리를 하지 않습니다.
responses:
200:
description: 로그아웃 성공
Expand Down
62 changes: 31 additions & 31 deletions src/routes/mypage_result_score.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@


# ✅ 공통 JWT 인증 함수
def get_user_id_from_token():
auth_header = request.headers.get("Authorization", None)
if not auth_header or not auth_header.startswith("Bearer "):
def getUserIdFromToken():
authHeader = request.headers.get("Authorization", None)
if not authHeader or not authHeader.startswith("Bearer "):
return None, jsonify({"message": "토큰이 필요합니다"}), 401

token = auth_header.split(" ")[1]
token = authHeader.split(" ")[1]
payload, error = decode_token(token)
if error:
return None, jsonify({"message": error}), 401

return payload["user_id"], None, None
return payload["userId"], None, None


@result_score_bp.route("/<int:result_id>/save", methods=["POST"])
@result_score_bp.route("/<int:resultId>/save", methods=["POST"])
@swag_from({
'tags': ['Mypage'],
'summary': '변환 결과 저장 (키 변경, 가사, 멜로디)',
Expand All @@ -37,7 +37,7 @@ def get_user_id_from_token():
'schema': {'type': 'string'}
},
{
'name': 'result_id',
'name': 'resultId',
'in': 'path',
'required': True,
'description': '저장할 결과 ID',
Expand All @@ -50,12 +50,12 @@ def get_user_id_from_token():
401: {'description': '인증 실패'}
}
})
def save_result(result_id):
user_id, error_response, status_code = get_user_id_from_token()
if error_response:
return error_response, status_code
def saveResult(resultId):
userId, errorResponse, statusCode = getUserIdFromToken()
if errorResponse:
return errorResponse, statusCode

if save_result_score(user_id, result_id):
if save_result_score(userId, resultId):
return jsonify({"message": "변환 결과가 저장되었습니다"}), 201
return jsonify({"message": "이미 저장된 결과입니다"}), 400

Expand Down Expand Up @@ -90,9 +90,9 @@ def save_result(result_id):
'application/json': {
'example': [
{
'result_id': 1,
'result_type': 'transpose',
'saved_at': '2025-05-18T12:34:56'
'resultId': 1,
'resultType': 'transpose',
'savedAt': '2025-05-18T12:34:56'
}
]
}
Expand All @@ -101,25 +101,25 @@ def save_result(result_id):
401: {'description': '인증 실패'}
}
})
def get_saved_results():
user_id, error_response, status_code = get_user_id_from_token()
if error_response:
return error_response, status_code
def getSavedResults():
userId, errorResponse, statusCode = getUserIdFromToken()
if errorResponse:
return errorResponse, statusCode

result_type = request.args.get("type")
saved = get_saved_result_scores(user_id, result_type)
resultType = request.args.get("type")
saved = get_saved_result_scores(userId, resultType)
result = [
{
"result_id": s.result_id,
"result_type": s.result.type,
"saved_at": s.saved_at.isoformat()
"resultId": s.result_id,
"resultType": s.result.type,
"savedAt": s.saved_at.isoformat()
}
for s in saved
]
return jsonify(result), 200


@result_score_bp.route("/<int:result_id>", methods=["DELETE"])
@result_score_bp.route("/<int:resultId>", methods=["DELETE"])
@swag_from({
'tags': ['Mypage'],
'summary': '저장한 변환 결과 삭제',
Expand All @@ -132,7 +132,7 @@ def get_saved_results():
'schema': {'type': 'string'}
},
{
'name': 'result_id',
'name': 'resultId',
'in': 'path',
'required': True,
'description': '삭제할 변환 결과 ID',
Expand All @@ -145,11 +145,11 @@ def get_saved_results():
401: {'description': '인증 실패'}
}
})
def delete_result(result_id):
user_id, error_response, status_code = get_user_id_from_token()
if error_response:
return error_response, status_code
def deleteResult(resultId):
userId, errorResponse, statusCode = getUserIdFromToken()
if errorResponse:
return errorResponse, statusCode

if delete_result_score(user_id, result_id):
if delete_result_score(userId, resultId):
return jsonify({"message": "저장이 해제되었습니다"}), 200
return jsonify({"message": "저장 내역이 없습니다"}), 404
Loading