110 lines
3.8 KiB
Python
110 lines
3.8 KiB
Python
from datetime import datetime
|
|
from typing import List
|
|
from fastapi import HTTPException
|
|
from Backend.utils.db import execute, fetch_one, fetch_all
|
|
from Backend.utils.queries.guestbook import GuestBookQueries
|
|
from Backend.schemas.guestbook import GuestBook, GuestBookCreate, GuestbookResponse
|
|
from Backend.schemas.user import User
|
|
from Backend.utils.queries.user import UserQueries
|
|
|
|
|
|
class GuestbookService:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@staticmethod
|
|
async def init_db():
|
|
await execute(GuestBookQueries.CREATE_TABLE)
|
|
|
|
async def create_guestbook(
|
|
self, data: GuestBookCreate, user: User
|
|
) -> GuestbookResponse:
|
|
user_exist = await fetch_one(UserQueries.SELECT_BY_ID, (data.target_user_id,))
|
|
if user_exist is None:
|
|
raise HTTPException(status_code=404, detail="User not found")
|
|
|
|
ex_row = await fetch_one(
|
|
GuestBookQueries.SELECT_GUEST_BOOK_BY_USER_ID, (user.id,)
|
|
)
|
|
created_at = datetime.now()
|
|
query = GuestBookQueries.INSERT_GUEST_BOOK
|
|
await execute(query, (data.target_user_id, user.id, data.content, created_at))
|
|
|
|
query = GuestBookQueries.SELECT_GUEST_BOOK_BY_USER_ID
|
|
row = await fetch_one(query, (user.id,))
|
|
|
|
if not (ex_row is None):
|
|
if row is None or ex_row["id"] == row["id"]:
|
|
raise HTTPException(
|
|
status_code=400, detail="Failed to create guest book"
|
|
)
|
|
|
|
return GuestbookResponse(
|
|
id=row["id"],
|
|
content=row["content"],
|
|
target_user_id=row["target_user_id"],
|
|
user_id=row["user_id"],
|
|
user_profile_path=user.profile_image_path,
|
|
username=user.username,
|
|
created_at=row["created_at"],
|
|
)
|
|
|
|
async def get_target_user_guestbooks(
|
|
self, target_user_id: int, limit: int = 20, offset: int = 0
|
|
) -> List[GuestbookResponse]:
|
|
query = GuestBookQueries.SELECT_TARGET_USER_GUEST_BOOKS
|
|
|
|
rows = await fetch_all(query, (target_user_id, limit, offset))
|
|
|
|
response_list = []
|
|
for row in rows:
|
|
user = await fetch_one(UserQueries.SELECT_BY_ID, (row["user_id"],))
|
|
|
|
response_list.append(
|
|
GuestbookResponse(
|
|
id=row["id"],
|
|
content=row["content"],
|
|
target_user_id=row["target_user_id"],
|
|
user_id=row["user_id"],
|
|
user_profile_path=user["profile_image_path"],
|
|
username=user["username"],
|
|
created_at=row["created_at"],
|
|
)
|
|
)
|
|
|
|
return response_list
|
|
|
|
async def update_guestbook_by_id(self, id: int, content: str) -> GuestbookResponse:
|
|
query = GuestBookQueries.SELECT_GUEST_BOOK_BY_ID
|
|
|
|
row = await fetch_one(query, (id,))
|
|
|
|
if row is None:
|
|
raise HTTPException(status_code=404, detail="Guest book not found")
|
|
|
|
query = GuestBookQueries.UPDATE_GUEST_BOOK_BY_ID
|
|
await execute(query, (content, id))
|
|
|
|
query = GuestBookQueries.SELECT_GUEST_BOOK_BY_ID
|
|
|
|
row = await fetch_one(query, (id,))
|
|
|
|
user = await fetch_one(UserQueries.SELECT_BY_ID, (row["user_id"],))
|
|
|
|
return GuestbookResponse(
|
|
id=row["id"],
|
|
content=row["content"],
|
|
target_user_id=row["target_user_id"],
|
|
user_id=row["user_id"],
|
|
user_profile_path=user["profile_image_path"],
|
|
username=user["username"],
|
|
created_at=row["created_at"],
|
|
)
|
|
|
|
async def delete_guestbook_by_id(self, id: int, user_id: int) -> bool:
|
|
try:
|
|
query = GuestBookQueries.DELETE_GUEST_BOOK
|
|
await execute(query, (id, user_id))
|
|
return True
|
|
except Exception:
|
|
return False
|