from typing import Annotated from fastapi import Path, Query, Request, Response from sqlalchemy.ext.asyncio import AsyncSession from common.aspect.db_seesion import DBSessionDependency from common.router import APIRouterPro from common.vo import DataResponseModel, PageResponseModel from exceptions.exception import ServiceWarning from module_admin.dao.designer_dao import DesignerWorkDao from module_admin.entity.vo.designer_vo import ( DesignerCategoryModel, DesignerCategoryPageQueryModel, DesignerProfileModel, DesignerProfilePageQueryModel, DesignerWorkModel, DesignerWorkPageQueryModel, ) from module_admin.service.designer_service import DesignerCategoryService, DesignerProfileService, DesignerWorkService from utils.log_util import logger from utils.response_util import ResponseUtil designer_public_controller = APIRouterPro( prefix='/public/designer', order_num=21, tags=['设计师公开主页'] ) async def _get_profile_by_slug_or_404(query_db: AsyncSession, designer_slug: str) -> DesignerProfileModel: profile_result = await DesignerProfileService.get_profile_by_slug_services( query_db, designer_slug=designer_slug, only_active=True ) if not profile_result.profile_id: raise ServiceWarning(message='设计师不存在或未启用') return profile_result @designer_public_controller.get( '/default', summary='获取默认设计师公开档案接口', description='用于获取默认设计师公开档案信息', response_model=DataResponseModel[DesignerProfileModel], ) async def get_default_public_designer_profile( request: Request, query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: profile_result = await DesignerProfileService.get_default_profile_services(query_db) if not profile_result.profile_id: raise ServiceWarning(message='默认设计师未配置') logger.info('获取默认设计师公开档案成功') return ResponseUtil.success(data=profile_result) @designer_public_controller.get( '/list', summary='获取公开设计师列表接口', description='用于官网获取启用中的设计师档案列表(支持关键词搜索、分页)', response_model=PageResponseModel[DesignerProfileModel], ) async def get_public_designer_list( request: Request, profile_page_query: Annotated[DesignerProfilePageQueryModel, Query()], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: profile_page_query.status = '0' profile_list_result = await DesignerProfileService.get_profile_list_services( query_db, profile_page_query, is_page=True ) logger.info('获取公开设计师列表成功') return ResponseUtil.success(model_content=profile_list_result) @designer_public_controller.get( '/slug/{designer_slug}/profile', summary='根据slug获取设计师公开档案接口', description='用于根据设计师slug获取公开档案信息', response_model=DataResponseModel[DesignerProfileModel], ) async def get_public_designer_profile_by_slug( request: Request, designer_slug: Annotated[str, Path(description='设计师访问标识')], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug) logger.info(f'获取slug为{designer_slug}的公开档案成功') return ResponseUtil.success(data=profile_result) @designer_public_controller.get( '/slug/{designer_slug}/categories', summary='根据slug获取设计师公开分类列表接口', description='用于根据设计师slug获取公开作品分类列表', ) async def get_public_designer_categories_by_slug( request: Request, designer_slug: Annotated[str, Path(description='设计师访问标识')], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug) query_object = DesignerCategoryPageQueryModel(profileId=profile_result.profile_id, status='0') category_list_result = await DesignerCategoryService.get_category_list_services( query_db, query_object, is_page=False ) logger.info(f'获取slug为{designer_slug}的公开分类列表成功') return ResponseUtil.success(data=category_list_result) @designer_public_controller.get( '/slug/{designer_slug}/works', summary='根据slug获取设计师公开作品列表接口', description='用于根据设计师slug获取已发布的作品列表(支持分类筛选、分页)', response_model=PageResponseModel[DesignerWorkModel], ) async def get_public_designer_works_by_slug( request: Request, designer_slug: Annotated[str, Path(description='设计师访问标识')], work_page_query: Annotated[DesignerWorkPageQueryModel, Query()], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug) work_page_query.profile_id = profile_result.profile_id work_page_query.status = '0' work_list_result = await DesignerWorkService.get_work_list_services(query_db, work_page_query, is_page=True) logger.info(f'获取slug为{designer_slug}的公开作品列表成功') return ResponseUtil.success(model_content=work_list_result) @designer_public_controller.get( '/slug/{designer_slug}/works/{work_id}', summary='根据slug获取设计师作品详情接口', description='用于根据设计师slug获取作品详情并增加浏览次数', response_model=DataResponseModel[DesignerWorkModel], ) async def get_public_designer_work_detail_by_slug( request: Request, designer_slug: Annotated[str, Path(description='设计师访问标识')], work_id: Annotated[int, Path(description='作品ID')], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug) work_detail_result = await DesignerWorkService.work_detail_services(query_db, work_id) if work_detail_result.profile_id != profile_result.profile_id: return ResponseUtil.failure(msg='作品不存在') await DesignerWorkDao.increment_view_count(query_db, work_id) await query_db.commit() work_detail_result = await DesignerWorkService.work_detail_services(query_db, work_id) logger.info(f'获取slug为{designer_slug}、work_id为{work_id}的作品详情成功') return ResponseUtil.success(data=work_detail_result) @designer_public_controller.get( '/slug/{designer_slug}/featured', summary='根据slug获取设计师精选作品接口', description='用于根据设计师slug获取精选作品列表', ) async def get_public_designer_featured_works_by_slug( request: Request, designer_slug: Annotated[str, Path(description='设计师访问标识')], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug) query_object = DesignerWorkPageQueryModel(profileId=profile_result.profile_id, isFeatured='1', status='0') featured_list_result = await DesignerWorkService.get_work_list_services(query_db, query_object, is_page=False) logger.info(f'获取slug为{designer_slug}的精选作品列表成功') return ResponseUtil.success(data=featured_list_result) @designer_public_controller.get( '/{profile_id}/profile', summary='获取设计师公开档案接口', description='用于获取设计师公开档案信息', response_model=DataResponseModel[DesignerProfileModel], ) async def get_public_designer_profile( request: Request, profile_id: Annotated[int, Path(description='设计师档案ID')], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: profile_result = await DesignerProfileService.get_profile_services(query_db, profile_id) logger.info(f'获取profile_id为{profile_id}的公开档案成功') return ResponseUtil.success(data=profile_result) @designer_public_controller.get( '/{profile_id}/categories', summary='获取设计师作品分类列表接口', description='用于获取设计师公开作品分类列表', ) async def get_public_designer_categories( request: Request, profile_id: Annotated[int, Path(description='设计师档案ID')], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: query_object = DesignerCategoryPageQueryModel(profileId=profile_id, status='0') category_list_result = await DesignerCategoryService.get_category_list_services( query_db, query_object, is_page=False ) logger.info(f'获取profile_id为{profile_id}的分类列表成功') return ResponseUtil.success(data=category_list_result) @designer_public_controller.get( '/{profile_id}/works', summary='获取设计师公开作品列表接口', description='用于获取设计师已发布的作品列表(支持分类筛选、分页)', response_model=PageResponseModel[DesignerWorkModel], ) async def get_public_designer_works( request: Request, profile_id: Annotated[int, Path(description='设计师档案ID')], work_page_query: Annotated[DesignerWorkPageQueryModel, Query()], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: work_page_query.profile_id = profile_id work_page_query.status = '0' work_list_result = await DesignerWorkService.get_work_list_services(query_db, work_page_query, is_page=True) logger.info(f'获取profile_id为{profile_id}的公开作品列表成功') return ResponseUtil.success(model_content=work_list_result) @designer_public_controller.get( '/{profile_id}/works/{work_id}', summary='获取设计师作品详情接口', description='用于获取设计师作品详情并增加浏览次数', response_model=DataResponseModel[DesignerWorkModel], ) async def get_public_designer_work_detail( request: Request, profile_id: Annotated[int, Path(description='设计师档案ID')], work_id: Annotated[int, Path(description='作品ID')], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: await DesignerWorkDao.increment_view_count(query_db, work_id) await query_db.commit() work_detail_result = await DesignerWorkService.work_detail_services(query_db, work_id) logger.info(f'获取work_id为{work_id}的作品详情成功') return ResponseUtil.success(data=work_detail_result) @designer_public_controller.get( '/{profile_id}/featured', summary='获取设计师精选作品接口', description='用于获取设计师精选作品列表', ) async def get_public_designer_featured_works( request: Request, profile_id: Annotated[int, Path(description='设计师档案ID')], query_db: Annotated[AsyncSession, DBSessionDependency()], ) -> Response: query_object = DesignerWorkPageQueryModel(profileId=profile_id, isFeatured='1', status='0') featured_list_result = await DesignerWorkService.get_work_list_services(query_db, query_object, is_page=False) logger.info(f'获取profile_id为{profile_id}的精选作品列表成功') return ResponseUtil.success(data=featured_list_result)