o2o-site-AEO/solution/backend/router/v1/social/social.py

101 lines
3.1 KiB
Python

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))
class TestPost(BaseModel):
text: str = Field(min_length=1, max_length=500)
@router.post("/test-post")
async def test_post(
req: TestPost, response: Response, user: UserInfo = Depends(IsValidAccessToken)
):
"""연동 확인용 즉시 게시 — 승인 없이 바로 연결된 계정으로 올라간다."""
private_response(response)
try:
return await service.test_post(UUID(user.user_id), req.text)
except SocialError as ex:
raise HTTPException(409, str(ex)) from ex
@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)