101 lines
3.1 KiB
Python
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)
|