O2Sound_ver2_final/backend/app/services/user_service.py

150 lines
4.9 KiB
Python

from sqlalchemy.orm import Session
from app.presentation.schemas.useritems_schema import GetItemsRequest, GetItemsResponse, UpdateItemRequest, UpdateItemResponse, DeleteUserItemRequest, DeleteUserItemResponse
from app.presentation.schemas.user_schema import GetUserNameRequest, GetUserNameResponse, UpdateUserProfileRequest, UpdateUserProfileResponse
from app.presentation.schemas.userprofile_schema import GetUserProfileRequest, GetUserProfileResponse
from app.shared.logger import setup_logger
from app.repositories.item_repository import ItemRepository
from app.repositories.user_repository import UserRepository
from app.shared.exception.custom_exception import UserNotFoundError,ItemNotFoundError
from app.presentation.schemas.useritems_schema import Item
logger = setup_logger(__name__)
class UserService:
'''사용자 서비스'''
def __init__(self, db: Session):
self.db = db
self.user_repository = UserRepository(db)
self.item_repository = ItemRepository(db)
def get_items(self, request: GetItemsRequest) -> GetItemsResponse:
'''업체(items) 가져오기'''
# 1. id 검증
user = self.user_repository.get_by_id(request.id)
if not user:
raise UserNotFoundError()
# 2. 업체 가져오기
items = self.item_repository.get_items(request.id)
return GetItemsResponse(
total_count=len(items),
items=[
Item(
item_id=item.id,
name=item.name,
address=item.address,
url=item.url,
phone_number=item.phone_number,
thumbnail_url=item.thumbnail_url,
hashtags=item.hashtags
) for item in items
]
)
def update_item(self, request: UpdateItemRequest) -> UpdateItemResponse:
'''업체(Item) 정보 수정'''
# 1. 사용자 존재 확인
user = self.user_repository.get_by_id(request.id)
if not user:
raise UserNotFoundError()
# 2. 업체 수정
update_data = {
"name": request.name,
"address": request.address,
"url": request.url,
"phone_number": request.phone_number
}
updated_item = self.item_repository.update_item(request.item_id, update_data)
if not updated_item:
raise ItemNotFoundError()
return UpdateItemResponse(
success=True,
item_id=updated_item.id
)
def delete_item(self, request: DeleteUserItemRequest) -> DeleteUserItemResponse:
'''ID로 업체 삭제'''
# 1. 사용자 확인
user = self.user_repository.get_by_id(request.id)
if not user:
raise UserNotFoundError()
# 2. 삭제 시도
deleted = self.item_repository.delete_item(request.item_id)
if not deleted:
raise ItemNotFoundError()
return DeleteUserItemResponse(
success=True,
item_id=request.item_id
)
def get_user_name(self, request: GetUserNameRequest) -> GetUserNameResponse:
'''user_id로 사용자 이름 조회'''
# 1. 사용자 확인
user = self.user_repository.get_by_id(request.user_id)
if not user:
raise UserNotFoundError()
#2. 유저이름 조회
name = self.user_repository.get_name_by_user_id(request.user_id)
if not name:
raise UserNotFoundError()
return GetUserNameResponse(name=name)
def update_user_profile(self, request: UpdateUserProfileRequest) -> UpdateUserProfileResponse:
'''user의 id로 사용자 프로필 수정'''
# 1. 사용자 존재 확인
user = self.user_repository.get_by_id(request.id)
if not user:
raise UserNotFoundError()
update_data = {
"name": request.name,
"email": request.email,
"phone_number": request.phone_number
}
updated_user = self.user_repository.update_user(request.id, update_data)
if not updated_user:
raise UserNotFoundError()
return UpdateUserProfileResponse(
success=True,
id=updated_user.id
)
def get_user_profile(self, request: GetUserProfileRequest) -> GetUserProfileResponse:
'''user의 id로 사용자 프로필 조회'''
# 1. 사용자 확인
user = self.user_repository.get_by_id(request.id)
if not user:
raise UserNotFoundError()
# create_at 형식 변경
created_at = user.created_at.date().strftime("%Y-%m-%d")
# 2. 사용자 프로필 반환
return GetUserProfileResponse(
id=user.id,
name=user.name,
email=user.email,
phone_number=user.phone_number,
created_at=created_at
)