diff --git a/api/v1/routers.py b/api/v1/routers.py index be62b2d..ddb509f 100644 --- a/api/v1/routers.py +++ b/api/v1/routers.py @@ -2,7 +2,7 @@ from api.v1.review import review_router from api.v1.auth import auth_router -from api.v1.user import user_router +from api.v1.user import user_router, certificate_router from api.v1.studybook import studybook_router from api.v1.studybook import studybook_question_router from api.v1.test import test_router @@ -13,4 +13,5 @@ router.include_router(user_router.router, tags=["user"], prefix="/user") router.include_router(studybook_router.router, tags=["studybook"], prefix="/studybook") router.include_router(studybook_question_router.router, tags=["studybook_question"], prefix="/studybook-question") -router.include_router(test_router.router, tags=["test"], prefix="/test") \ No newline at end of file +router.include_router(test_router.router, tags=["test"], prefix="/test") +router.include_router(certificate_router.router, tags=["certificate"], prefix="/user") \ No newline at end of file diff --git a/api/v1/test/test_router.py b/api/v1/test/test_router.py index 6403eda..28a3236 100644 --- a/api/v1/test/test_router.py +++ b/api/v1/test/test_router.py @@ -55,7 +55,7 @@ router = APIRouter() # 오늘의 문제 -@router.post("/create-today-questions/{certificate_id}", summary="오늘의 문제 생성 또는 불러오기") +@router.post("/create-today-questions/{certificate_id}", summary="오늘의 문제 생성") async def create_today_questions( certificate_id: int = Path(..., description="자격증 ID"), current_user: User = Depends(get_current_user), @@ -81,16 +81,6 @@ async def submit_today_test( ): return await submit_today_test_usecase(current_user, db) -# 시험 결과 제출 (시험 모드) -@router.post("/submit/{test_id}", response_model=SubmitTestResponse) -async def submit_test( - test_id: str = Path(...), - request: SubmitTestRequest = Depends(), - db: Session = Depends(get_db), - current_user: User = Depends(get_current_user) -): - return await submit_test_usecase(test_id, request, db, current_user) - # 문제 풀기 (쉬엄 모드) @router.get("/rest-mode/{question_count}", response_model=RestModeResponse) async def get_relax_mode_questions( diff --git a/api/v1/user/certificate_router.py b/api/v1/user/certificate_router.py new file mode 100644 index 0000000..74c8f9a --- /dev/null +++ b/api/v1/user/certificate_router.py @@ -0,0 +1,23 @@ +from typing import List + +from fastapi import APIRouter, Query, Depends +from sqlalchemy.ext.asyncio import AsyncSession + +from app.user.dto.response.certificates_response import CertificateResponseDto +from app.user.usecase.certificate_usecase import CertificateUseCase +from database.dependency import get_db +from domain.user.repository.certificate_repository import CertificateRepository +from domain.user.service.certificate_service import CertificateService +from exception.success import ok + +router = APIRouter() +@router.get("/get-certificates-list", response_model=CertificateResponseDto) +async def get_certificates_list( + offset: int = Query(0, ge=0), + limit: int = Query(20, ge=0), + db: AsyncSession = Depends(get_db) +): + usecase = CertificateUseCase() + data = await usecase.execute(db=db, offset=offset, limit=limit) + + return ok(data=data.model_dump() ,message="자격증 리스트 조회 성공") \ No newline at end of file diff --git a/app/test/usecase/create_today_test_usecase.py b/app/test/usecase/create_today_test_usecase.py index b5b6fc8..f11188e 100644 --- a/app/test/usecase/create_today_test_usecase.py +++ b/app/test/usecase/create_today_test_usecase.py @@ -159,6 +159,12 @@ async def create_today_questions_usecase(certificate_id: int, current_user: User await db.commit() + result = await db.execute( + select(TodayTestQuestion) + .where(TodayTestQuestion.today_test_by_ai_id == today_test.id) + ) + questions = result.scalars().all() + return ok( data={ "question_count": len(questions), diff --git a/app/user/dto/response/certificate.py b/app/user/dto/response/certificate.py new file mode 100644 index 0000000..cc5e15a --- /dev/null +++ b/app/user/dto/response/certificate.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class CertificateDto(BaseModel): + certificate_id: int + name: str \ No newline at end of file diff --git a/app/user/dto/response/certificates_response.py b/app/user/dto/response/certificates_response.py new file mode 100644 index 0000000..a9f588d --- /dev/null +++ b/app/user/dto/response/certificates_response.py @@ -0,0 +1,9 @@ +from typing import List +from pydantic import BaseModel +from app.user.dto.response.certificate import CertificateDto +from app.utils.dto.pagination import PaginationDto + + +class CertificateResponseDto(BaseModel): + certificates: List[CertificateDto] + pagination: PaginationDto \ No newline at end of file diff --git a/app/user/usecase/certificate_usecase.py b/app/user/usecase/certificate_usecase.py new file mode 100644 index 0000000..d6506b1 --- /dev/null +++ b/app/user/usecase/certificate_usecase.py @@ -0,0 +1,31 @@ +from typing import List + +from sqlalchemy.ext.asyncio import AsyncSession + +from app.user.dto.response.certificates_response import CertificateResponseDto +from app.utils.dto.pagination import PaginationDto +from domain.user.repository.certificate_repository import CertificateRepository +from domain.user.service.certificate_service import CertificateService +from exception.client_exception import NotFoundException, BadRequestException + + +class CertificateUseCase: + + @staticmethod + async def execute(db: AsyncSession, offset: int, limit: int) -> CertificateResponseDto: + certificates, total = await CertificateService.fetch_certificates(db, offset, limit) + + if offset >= total: + raise BadRequestException(message="더이상 불러올 내용이 없습니다.") + + pagination = PaginationDto( + offset=offset, + limit=limit, + total_count=total, + next_page=(offset + limit < total) + ) + + return CertificateResponseDto( + certificates=certificates, + pagination=pagination + ) \ No newline at end of file diff --git a/app/utils/__init__.py b/app/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/utils/dto/__init__.py b/app/utils/dto/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/utils/dto/pagination.py b/app/utils/dto/pagination.py new file mode 100644 index 0000000..c5ddc97 --- /dev/null +++ b/app/utils/dto/pagination.py @@ -0,0 +1,8 @@ +from openai import BaseModel + + +class PaginationDto(BaseModel): + offset: int + limit: int + total_count: int + next_page: bool \ No newline at end of file diff --git a/domain/user/repository/certificate_repository.py b/domain/user/repository/certificate_repository.py index 603f0ac..f3d57c6 100644 --- a/domain/user/repository/certificate_repository.py +++ b/domain/user/repository/certificate_repository.py @@ -1,4 +1,6 @@ -from sqlalchemy import Sequence +from typing import List + +from sqlalchemy import Sequence, select from sqlalchemy.ext.asyncio import AsyncSession from domain.user.entity.certificate import Certificate from domain.user.entity.user import User @@ -30,3 +32,14 @@ async def add_user_certificate(db: AsyncSession, user: User, certificates: Seque await db.commit() await db.refresh(user) return user + + + @staticmethod + async def get_certificates_list(db: AsyncSession, offset: int, limit: int) -> (List[Certificate], int): + result = await db.execute( + select(Certificate).offset(offset).limit(limit) + ) + certificates = result.scalars().all() + total_result = await db.execute(select(Certificate)) + total = len(total_result.scalars().all()) + return certificates, total \ No newline at end of file diff --git a/domain/user/service/certificate_service.py b/domain/user/service/certificate_service.py new file mode 100644 index 0000000..fdfc02a --- /dev/null +++ b/domain/user/service/certificate_service.py @@ -0,0 +1,17 @@ +from typing import List + +from sqlalchemy.ext.asyncio import AsyncSession + +from app.user.dto.response.certificate import CertificateDto +from domain.user.repository.certificate_repository import CertificateRepository + + +class CertificateService: + + @staticmethod + async def fetch_certificates(db: AsyncSession, offset: int, limit: int) -> (List[CertificateDto], int): + certificates, total = await CertificateRepository.get_certificates_list(db, offset, limit) + certificates_list = [ + CertificateDto(certificate_id=certificate.id, name=certificate.name) for certificate in certificates + ] + return certificates_list, total \ No newline at end of file