사업장 API 가 전부 "요청자 = 소유자" 로 걸러져서 관리자가 남의 빌더·미니블로그를 열면 PLACE_NOT_FOUND 였다. 운영 중 사업장 정리도 사장님 계정으로 들어가야 했다. - validator/dependencies: DEVELOPER 가 place_id 경로를 부르면 그 사업장 소유자 신원으로 처리 — [admin-access] 로그 - ops/sites: search(상호·소유자 이메일·이름·아이디) · category 필터, 건수도 같은 조건 - OpsSitesPage: 검색창 · 업종 칩 · 행마다 빌더·미니블로그·삭제(공개 중이면 발행 내린 뒤 삭제) - SitesPage: 더보기에서 미니블로그 관리 · 예약요청 관리 제거 테스트 4건 추가(test_admin_access). 전체 900 passed · 145 failed(변경 전과 같은 파일: agent_runtime·gemini 등) frontend tsc·eslint 통과 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 lines
1.3 KiB
Python
31 lines
1.3 KiB
Python
from fastapi import APIRouter, Depends, Query
|
|
|
|
from common.models.gmodel import PageParams
|
|
from router.v1.validator.dependencies import RemoveNoneResponse, RequireDeveloper
|
|
from services.ops_service import OpsService
|
|
from .protocol import Res_OpsSites, Res_OpsUsers
|
|
|
|
# 내부 운영(개발자) 전용 조회 — 회사 스코프를 걷어낸 전 계정 사이트·유저 목록.
|
|
router = APIRouter(prefix="/v1/ops", tags=["Ops"])
|
|
|
|
|
|
@router.get(path="/sites", response_model=Res_OpsSites, summary="전 계정 사이트 목록(개발자 전용)")
|
|
async def list_sites(
|
|
service: OpsService = Depends(),
|
|
pg: PageParams = Depends(),
|
|
search: str | None = Query(None, description="상호·소유자 이메일·이름·로그인 아이디 부분 일치"),
|
|
category: int | None = Query(None, description="PlaceCategory"),
|
|
_user=Depends(RequireDeveloper),
|
|
):
|
|
return RemoveNoneResponse(await service.list_sites(pg, search, category))
|
|
|
|
|
|
@router.get(path="/users", response_model=Res_OpsUsers, summary="전 계정 목록(개발자 전용)")
|
|
async def list_users(
|
|
service: OpsService = Depends(),
|
|
pg: PageParams = Depends(),
|
|
search: str | None = Query(None, description="이메일·이름·로그인 아이디 부분 일치"),
|
|
_user=Depends(RequireDeveloper),
|
|
):
|
|
return RemoveNoneResponse(await service.list_users(pg, search))
|