Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor( analysis dependency injection) #113

Merged
merged 3 commits into from
Mar 26, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 17 additions & 18 deletions genotype_api/api/endpoints/analyses.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,61 +4,60 @@
from fastapi.responses import JSONResponse
from sqlmodel import Session

from genotype_api.database.crud.delete import delete_analysis
from genotype_api.database.crud.read import (
get_analysis_by_id,
)
from genotype_api.database.models import Analysis, User
from genotype_api.dto.analysis import AnalysisWithGenotypeResponse, AnalysisResponse
from genotype_api.database.models import User
from genotype_api.dto.analysis import AnalysisResponse
from genotype_api.database.session_handler import get_session
from genotype_api.security import get_active_user
from genotype_api.services.analysis_service.analysis_service import AnalysisService

router = APIRouter()


@router.get("/{analysis_id}", response_model=AnalysisWithGenotypeResponse)
def get_analysis_service(session: Session = Depends(get_session)):
return AnalysisService(session)


@router.get("/{analysis_id}", response_model=AnalysisResponse)
def read_analysis(
analysis_id: int,
session: Session = Depends(get_session),
analysis_service: AnalysisService = Depends(get_analysis_service),
current_user: User = Depends(get_active_user),
):
"""Return analysis."""
analysis_service = AnalysisService(session)
return analysis_service.get_analysis_with_genotype(analysis_id)


@router.get("/", response_model=list[AnalysisResponse])
@router.get("/", response_model=list[AnalysisResponse], response_model_exclude={"genotypes"})
def read_analyses(
skip: int = 0,
limit: int = Query(default=100, lte=100),
session: Session = Depends(get_session),
analysis_service: AnalysisService = Depends(get_analysis_service),
current_user: User = Depends(get_active_user),
):
"""Return all analyses."""
analysis_service = AnalysisService(session)
return analysis_service.get_analyses_to_display(skip=skip, limit=limit)


@router.delete("/{analysis_id}")
def delete_analysis(
analysis_id: int,
session: Session = Depends(get_session),
analysis_service: AnalysisService = Depends(get_analysis_service),
current_user: User = Depends(get_active_user),
):
"""Delete analysis based on analysis_id"""
analysis: Analysis = get_analysis_by_id(session=session, analysis_id=analysis_id)
delete_analysis(session=session, analysis=analysis)
analysis_service.delete_analysis(analysis_id)
return JSONResponse(f"Deleted analysis: {analysis_id}", status_code=status.HTTP_200_OK)


@router.post("/sequence", response_model=list[AnalysisResponse])
@router.post(
"/sequence", response_model=list[AnalysisResponse], response_model_exclude={"genotypes"}
)
def upload_sequence_analysis(
file: UploadFile = File(...),
session: Session = Depends(get_session),
analysis_service: AnalysisService = Depends(get_analysis_service),
current_user: User = Depends(get_active_user),
):
"""Reading VCF file, creating and uploading sequence analyses and sample objects to the database."""
analysis_service = AnalysisService(session)

analyses: list[AnalysisResponse] = analysis_service.get_upload_sequence_analyses(file)
return analyses
10 changes: 0 additions & 10 deletions genotype_api/dto/analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,4 @@ class AnalysisResponse(BaseModel):
sample_id: str | None
plate_id: str | None
id: int | None


class AnalysisWithGenotypeResponse(BaseModel):
type: Types | None
source: str | None
sex: Sexes | None
created_at: datetime | None
sample_id: str | None
plate_id: str | None
id: int | None
genotypes: list[GenotypeBase] | None
48 changes: 21 additions & 27 deletions genotype_api/services/analysis_service/analysis_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@

from genotype_api.constants import Types, FileExtension
from genotype_api.database.crud.create import create_analyses_samples, create_analysis
from genotype_api.database.crud.delete import delete_analysis
from genotype_api.database.crud.read import (
get_analysis_by_id,
get_analyses_with_skip_and_limit,
check_analyses_objects,
)
from genotype_api.database.crud.update import refresh_sample_status
from genotype_api.database.models import Analysis
from genotype_api.dto.analysis import AnalysisWithGenotypeResponse, AnalysisResponse
from genotype_api.dto.analysis import AnalysisResponse
from genotype_api.file_parsing.files import check_file
from genotype_api.file_parsing.vcf import SequenceAnalysis

Expand All @@ -25,24 +26,15 @@ class AnalysisService:
def __init__(self, session: Session):
self.session: Session = session

def get_analysis_with_genotype(self, analysis_id: int) -> AnalysisWithGenotypeResponse:
def get_analysis_with_genotype(self, analysis_id: int) -> AnalysisResponse:
analysis: Analysis = get_analysis_by_id(session=self.session, analysis_id=analysis_id)
return AnalysisWithGenotypeResponse(
type=analysis.type,
source=analysis.source,
sex=analysis.sex,
created_at=analysis.created_at,
sample_id=analysis.sample_id,
plate_id=analysis.plate_id,
id=analysis.id,
genotypes=analysis.genotypes,
)
return self._get_analyses_response(analysis)

def get_analyses_to_display(self, skip: int, limit: int) -> list[AnalysisResponse]:
analyses: list[Analysis] = get_analyses_with_skip_and_limit(
session=self.session, skip=skip, limit=limit
)
return self.create_analyses_response(analyses)
return [self._get_analyses_response(analysis) for analysis in analyses]

def get_upload_sequence_analyses(self, file: UploadFile) -> list[AnalysisResponse]:
"""
Expand All @@ -60,19 +52,21 @@ def get_upload_sequence_analyses(self, file: UploadFile) -> list[AnalysisRespons
analysis: Analysis = create_analysis(session=self.session, analysis=analysis)
refresh_sample_status(session=self.session, sample=analysis.sample)

return self.create_analyses_response(analyses)
return [self._get_analyses_response(analysis) for analysis in analyses]

@staticmethod
def create_analyses_response(analyses: list[Analysis]) -> list[AnalysisResponse]:
return [
AnalysisResponse(
type=analysis.type,
source=analysis.source,
sex=analysis.sex,
created_at=analysis.created_at,
sample_id=analysis.sample_id,
plate_id=analysis.plate_id,
id=analysis.id,
)
for analysis in analyses
]
def _get_analyses_response(analysis: Analysis) -> AnalysisResponse:
return AnalysisResponse(
type=analysis.type,
source=analysis.source,
sex=analysis.sex,
created_at=analysis.created_at,
sample_id=analysis.sample_id,
plate_id=analysis.plate_id,
id=analysis.id,
genotypes=analysis.genotypes,
)

def delete_analysis(self, analysis_id: int) -> None:
analysis: Analysis = get_analysis_by_id(session=self.session, analysis_id=analysis_id)
delete_analysis(session=self.session, analysis=analysis)
Loading