from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Query, Response from pydantic import BaseModel, Field from common.models.gmodel import UserInfo from router.v1.validator.dependencies import IsValidAccessToken from services import social_service as service from services.external.social import SocialError router = APIRouter(prefix="/v1/social", tags=["Social"]) class Decision(BaseModel): approve: bool class LinkDecision(Decision): t: str = Field(min_length=40, max_length=100) def private_response(response: Response): response.headers["Cache-Control"] = "no-store" response.headers["Referrer-Policy"] = "no-referrer" response.headers["X-Robots-Tag"] = "noindex, nofollow" @router.get("/account") async def account(response: Response, user: UserInfo = Depends(IsValidAccessToken)): """연결 상태만 준다 — 사업장을 고르지 않아도 답할 수 있어야 하는 값이다.""" private_response(response) return await service.account_state(UUID(user.user_id)) @router.get("/place/{place_id}") async def list_posts( place_id: UUID, response: Response, user: UserInfo = Depends(IsValidAccessToken) ): private_response(response) return await service.list_posts(UUID(user.user_id), place_id) @router.post("/place/{place_id}/draft") async def draft( place_id: UUID, response: Response, user: UserInfo = Depends(IsValidAccessToken) ): private_response(response) return await service.create_draft(UUID(user.user_id), place_id) @router.post("/posts/{post_id}/request-approval") async def request_approval( post_id: UUID, response: Response, user: UserInfo = Depends(IsValidAccessToken) ): private_response(response) try: return await service.request_approval(UUID(user.user_id), post_id) except (SocialError, RuntimeError) as ex: raise HTTPException( 502, "APPROVAL_NOTIFICATION_FAILED_SCREEN_AVAILABLE" ) from ex @router.post("/posts/{post_id}/decision") async def owner_decision( post_id: UUID, req: Decision, response: Response, user: UserInfo = Depends(IsValidAccessToken), ): private_response(response) return await service.owner_decision(UUID(user.user_id), post_id, req.approve) @router.get("/approval/{post_id}") async def approval( post_id: UUID, response: Response, t: str = Query(min_length=40, max_length=100) ): private_response(response) return await service.approval(post_id, t) @router.post("/approval/{post_id}/decision") async def decision(post_id: UUID, req: LinkDecision, response: Response): private_response(response) return await service.approval(post_id, req.t, approve=req.approve)