Skip to content

Commit 303b765

Browse files
committed
Merge branch 'dev' of https://github.com/SKT-FlyAI-BoraMettugi/BE into dev
2 parents 623b27b + 3c0d611 commit 303b765

File tree

9 files changed

+69
-91
lines changed

9 files changed

+69
-91
lines changed

api/routes/user.py

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -28,43 +28,23 @@ async def update_nickname(nickname: Nickname, db: Session = Depends(get_db)):
2828
update_user_nickname(nickname, db)
2929
return nickname
3030

31-
# 카카오 로그인 url 반환
32-
@router.get("/auth/kakao/login-url")
33-
def get_kakao_login_url():
34-
return {"login_url": kakao_api.get_auth_url()}
35-
36-
# 카카오 로그인 후 받은 code를 JSON으로 반환
37-
@router.get("/auth/kakao/callback")
38-
async def kakao_callback(code: str):
39-
return {"code": code}
40-
4131
# 프론트에서 code 보냄
4232
@router.patch("/login")
4333
async def kakao_login(request: KakaoLoginRequest, db: Session = Depends(get_db)):
44-
45-
# 카카오 액세스 토큰 요청
46-
token_data = await kakao_api.get_access_token(request.code)
47-
access_token = token_data.get("access_token")
48-
49-
if not access_token:
50-
raise HTTPException(status_code=400, detail="카카오 액세스 토큰 발급 실패")
51-
52-
# 카카오 유저 정보 요청
53-
user_data = await kakao_api.get_user_info(access_token)
54-
kakao_id = user_data["id"]
55-
nickname = user_data["kakao_account"]["profile"].get("nickname", f"카카오유저{random.randint(1000, 9999)}")
56-
profile_image = user_data["kakao_account"]["profile"].get("profile_image_url", None)
34+
kakao_id = request.kakao_id
35+
nickname = request.nickname
36+
profile_image = request.profile_img
5737

5838
# DB에서 기존 유저 확인
5939
user = get_user_by_kakao_id(db, kakao_id)
6040

6141
if user:
62-
# 기존 유저: 로그인 처리
63-
update_kakao_login(db, user.user_id, access_token, nickname, profile_image)
42+
# 기존 유저: 로그인 처리
43+
update_kakao_login(db, user.user_id, None, nickname, profile_image)
6444
return {"message": "카카오 로그인 성공", "user_id": user.user_id, "nickname": nickname}
65-
45+
6646
# 신규 유저: 회원가입 후 로그인 처리
67-
new_user = create_user(db, kakao_id, nickname, profile_image, access_token)
47+
new_user = create_user(db, kakao_id, nickname, profile_image, None)
6848

6949
return {"message": "회원가입 및 로그인 성공", "user_id": new_user.user_id, "nickname": nickname}
7050

core/kakao_api.py

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from dotenv import load_dotenv
55

66
# 환경 변수 로드
7-
load_dotenv(override=True)
7+
load_dotenv()
88

99
class KakaoAPI:
1010
def __init__(self):
@@ -14,45 +14,6 @@ def __init__(self):
1414
self.kakao_token_url = "https://kauth.kakao.com/oauth/token"
1515
self.kakao_user_info_url = "https://kapi.kakao.com/v2/user/me"
1616

17-
# 카카오 로그인 url 생성
18-
def get_auth_url(self):
19-
return {
20-
f"{self.kakao_auth_url}?response_type=code"
21-
f"&client_id={self.client_id}"
22-
f"&redirect_uri={self.redirect_uri}"
23-
}
24-
# 인가 코드로 액세스 토큰 요청
25-
async def get_access_token(self, code: str):
26-
async with httpx.AsyncClient() as client:
27-
response = await client.post(
28-
self.kakao_token_url,
29-
data={
30-
"grant_type": "authorization_code",
31-
"client_id": self.client_id,
32-
"redirect_uri": self.redirect_uri,
33-
"code": code,
34-
},
35-
headers={"Content-Type": "application/x-www-form-urlencoded"},
36-
)
37-
38-
# 🔹 카카오 API 응답 로그 출력
39-
print("카카오 토큰 응답:", response.json())
40-
41-
# ✅ HTTP 상태 코드 체크 추가 (잘못된 응답 처리)
42-
if response.status_code != 200:
43-
raise HTTPException(status_code=400, detail=f"카카오 액세스 토큰 요청 실패: {response.text}")
44-
45-
return response.json()
46-
47-
# 액세스 토큰으로 사용자 정보 요청
48-
async def get_user_info(self, access_token: str):
49-
async with httpx.AsyncClient() as client:
50-
response = await client.get(
51-
self.kakao_user_info_url,
52-
headers={"Authorization": f"Bearer {access_token}"},
53-
)
54-
return response.json()
55-
5617
# 카카오 로그아웃
5718
async def logout_user(self, access_token: str):
5819
async with httpx.AsyncClient() as client:

crud/comment.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from sqlalchemy.orm import Session
2-
from models.comment import Comment
2+
from models.comment import Comment, CommentLike
33
from schemas.comment import CommentCreate
44
from datetime import datetime
55
from typing import List
@@ -22,23 +22,33 @@ def create_comment(db: Session, user_id: int, discussion_id: int, comment_data:
2222
def add_like_to_comment(db: Session, comment_id: int, user_id: int):
2323
comment = db.query(Comment).filter(Comment.comment_id == comment_id).first()
2424

25-
if not comment:
26-
return None # 댓글이 존재하지 않음
27-
28-
# 좋아요 토글: 0이면 +1, 1 이상이면 -1
29-
if comment.like == 0:
30-
comment.like += 1 # 좋아요 추가
25+
# 사용자가 이미 좋아요를 눌렀는지 확인
26+
existing_like = db.query(CommentLike).filter(
27+
CommentLike.comment_id == comment_id,
28+
CommentLike.user_id == user_id
29+
).first()
30+
31+
if existing_like:
32+
# 이미 눌렀다면 삭제 (좋아요 취소)
33+
db.delete(existing_like)
34+
comment.like -= 1
35+
liked = False
3136
else:
32-
comment.like -= 1 # 좋아요 취소
37+
# 좋아요 추가
38+
new_like = CommentLike(comment_id=comment_id, user_id=user_id)
39+
db.add(new_like)
40+
comment.like += 1
41+
liked = True
3342

3443
db.commit()
3544
db.refresh(comment)
3645

37-
return comment
46+
return {"comment_id": comment_id, "like": comment.like, "liked": liked}
3847

3948
# 사용자가 좋아요 누른 답글 조회
4049
def get_liked_comments_by_user(db: Session, user_id: int):
41-
return db.query(Comment).filter(Comment.user_id == user_id, Comment.like > 0).all()
50+
return db.query(Comment).join(CommentLike, Comment.comment_id == CommentLike.comment_id)\
51+
.filter(CommentLike.user_id == user_id).all()
4252

4353
# 토론에 대한 모든 답글 조회
4454
def get_comments_by_discussion_id(db: Session, discussion_id: int) -> List[Comment]:

crud/discussion.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from sqlalchemy.orm import Session
2-
from models.discussion import Discussion
2+
from models.discussion import Discussion, DiscussionLike
33
from schemas.discussion import DiscussionCreate, DiscussionLikeResponse
44
from typing import List
55

@@ -19,20 +19,32 @@ def get_discussions_by_question(db: Session, question_id: int):
1919

2020
# 토론 좋아요 추가
2121
def add_like_to_discussion(db: Session, discussion_id: int, user_id: int):
22-
discussion = discussion = db.query(Discussion).filter(Discussion.discussion_id == discussion_id).first()
23-
# 좋아요 토글: 좋아요가 1 이상이면 취소, 0이면 추가
24-
if discussion.like > 0:
25-
discussion.like -= 1 # 좋아요 취소
22+
discussion = db.query(Discussion).filter(Discussion.discussion_id == discussion_id).first()
23+
24+
# 사용자가 이미 좋아요를 눌렀는지 확인
25+
existing_like = db.query(DiscussionLike).filter(
26+
DiscussionLike.discussion_id == discussion_id,
27+
DiscussionLike.user_id == user_id
28+
).first()
29+
30+
if existing_like:
31+
# 이미 눌렀다면 삭제 (좋아요 취소)
32+
db.delete(existing_like)
33+
discussion.like -= 1
2634
liked = False
2735
else:
28-
discussion.like += 1 # 좋아요 추가
36+
# 좋아요 추가
37+
new_like = DiscussionLike(discussion_id=discussion_id, user_id=user_id)
38+
db.add(new_like)
39+
discussion.like += 1
2940
liked = True
3041

3142
db.commit()
3243
db.refresh(discussion)
3344

34-
return {"discussion_id": discussion_id, "like": discussion.like, "liked": liked}
45+
return {"discussion_id": discussion_id, "like": discussion.like, "liked": liked}
3546

3647
# 좋아요 누른 토론 조회
3748
def get_liked_discussions_by_user(db: Session, user_id: int) -> List[Discussion]:
38-
return db.query(Discussion).filter(Discussion.user_id == user_id, Discussion.like > 0).all()
49+
return db.query(Discussion).join(DiscussionLike, Discussion.discussion_id == DiscussionLike.discussion_id)\
50+
.filter(DiscussionLike.user_id == user_id).all()

crud/user.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,16 @@ def create_user(db: Session, kakao_id: int, nickname: str, profile_image: str, a
5454
def update_kakao_login(db: Session, user_id: int, access_token: str, nickname: str, profile_image: str):
5555
db_user = db.query(User).filter(User.user_id == user_id).first()
5656

57-
print("db 업데이트 전 access token: ", access_token)
58-
db_user.social_token = access_token if access_token else "INVALID TOKEN"
57+
if access_token: # 액세스 토큰이 있을 경우에만 업데이트
58+
db_user.social_token = access_token
59+
5960
db_user.login_channel = "KAKAO"
6061
db_user.nickname = nickname
6162
db_user.profile_image = profile_image
6263
db_user.updated_date = datetime.utcnow()
6364

6465
db.commit()
6566
db.refresh(db_user)
66-
67-
print("db에 저장된 social_token:", db_user.social_token)
6867
return db_user
6968

7069
# 카카오 로그아웃

models/comment.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,10 @@ class Comment(Base):
1212
like = Column(Integer, default=0, nullable=False)
1313
created_date = Column(DateTime, server_default=func.now(), nullable=False)
1414
updated_date = Column(DateTime, onupdate=func.now(), nullable=True)
15+
16+
class CommentLike(Base):
17+
__tablename__ = "comment_likes"
18+
19+
comment_likes_id = Column(BigInteger, primary_key=True, autoincrement=True, nullable=False)
20+
comment_id = Column(BigInteger, ForeignKey("comments.comment_id", ondelete="CASCADE"), nullable=False)
21+
user_id = Column(BigInteger, ForeignKey("users.user_id", ondelete="CASCADE"), nullable=False)

models/discussion.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,10 @@ class Discussion(Base):
1313
comment_exist = Column(Boolean, default=False, nullable=False)
1414
created_date = Column(DateTime, server_default=func.now(), nullable=False)
1515
updated_date = Column(DateTime, onupdate=func.now(), nullable=True)
16+
17+
class DiscussionLike(Base):
18+
__tablename__ = "discussion_likes"
19+
20+
discussion_likes_id = Column(BigInteger, primary_key=True, autoincrement=True)
21+
discussion_id = Column(BigInteger, ForeignKey("discussions.discussion_id"), nullable=False)
22+
user_id = Column(BigInteger, ForeignKey("users.user_id"), nullable=False)

models/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ class User(Base):
1818
login_channel = Column(Enum(LoginChannel), nullable=True)
1919
kakao_id = Column(BigInteger, unique=True, nullable=False)
2020
score = Column(Integer, nullable=False)
21-
social_token = Column(String(255), nullable=False)
21+
social_token = Column(String(255), nullable=True)
2222
created_date = Column(DateTime, server_default=func.now())
2323
updated_date = Column(DateTime, onupdate=func.now())

schemas/login.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from pydantic import BaseModel
22

33
class KakaoLoginRequest(BaseModel):
4-
code: str
4+
kakao_id: int
5+
nickname: str
6+
profile_img: str

0 commit comments

Comments
 (0)