From 4cc8a4e2696fdf2d4743fbe9bb83c41465987f82 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kwasigroch Date: Tue, 25 Aug 2026 17:29:10 +0200 Subject: [PATCH] refactor(backend): extract experiment crud module Continues the incremental split of the crud monolith. Experiment moves to its own module; the router switches to a direct submodule import. Pure move -- no logic changes. --- .../src/rhesis/backend/app/crud/__init__.py | 23 ------------ .../src/rhesis/backend/app/crud/experiment.py | 35 +++++++++++++++++++ .../rhesis/backend/app/routers/experiments.py | 3 +- 3 files changed, 37 insertions(+), 24 deletions(-) create mode 100644 apps/backend/src/rhesis/backend/app/crud/experiment.py diff --git a/apps/backend/src/rhesis/backend/app/crud/__init__.py b/apps/backend/src/rhesis/backend/app/crud/__init__.py index ddee4a03f7..8dc541d37c 100644 --- a/apps/backend/src/rhesis/backend/app/crud/__init__.py +++ b/apps/backend/src/rhesis/backend/app/crud/__init__.py @@ -103,29 +103,6 @@ def delete_endpoint( ) -# Experiment CRUD -def get_experiments( - db: Session, - skip: int = 0, - limit: int = 10, - sort_by: str = "created_at", - sort_order: str = "desc", - filter: str | None = None, - organization_id: str = None, - user_id: str = None, -) -> List[models.Experiment]: - return ( - QueryBuilder(db, models.Experiment) - .with_related(include(models.Experiment.project)) - .with_organization_filter(organization_id) - .with_visibility_filter(user_id) - .with_odata_filter(filter) - .with_sorting(sort_by, sort_order) - .with_pagination(skip, limit) - .all() - ) - - # TestSet CRUD def get_test_set( db: Session, test_set_id: uuid.UUID, organization_id: str = None, user_id: str = None diff --git a/apps/backend/src/rhesis/backend/app/crud/experiment.py b/apps/backend/src/rhesis/backend/app/crud/experiment.py new file mode 100644 index 0000000000..22ac10e73f --- /dev/null +++ b/apps/backend/src/rhesis/backend/app/crud/experiment.py @@ -0,0 +1,35 @@ +"""CRUD operations for experiments. + +Part of the incremental split of the ``crud`` monolith: ``crud/__init__.py`` still holds +the bulk of the functions, and per-entity modules like this one take over as the code +around them is touched -- see ``apps/backend/AGENTS.md``'s crud-layout rule. +""" + +from typing import List + +from sqlalchemy.orm import Session + +from rhesis.backend.app import models +from rhesis.backend.app.utils.query_utils import QueryBuilder, include + + +def get_experiments( + db: Session, + skip: int = 0, + limit: int = 10, + sort_by: str = "created_at", + sort_order: str = "desc", + filter: str | None = None, + organization_id: str = None, + user_id: str = None, +) -> List[models.Experiment]: + return ( + QueryBuilder(db, models.Experiment) + .with_related(include(models.Experiment.project)) + .with_organization_filter(organization_id) + .with_visibility_filter(user_id) + .with_odata_filter(filter) + .with_sorting(sort_by, sort_order) + .with_pagination(skip, limit) + .all() + ) diff --git a/apps/backend/src/rhesis/backend/app/routers/experiments.py b/apps/backend/src/rhesis/backend/app/routers/experiments.py index b0c640f1d0..d5d9cde569 100644 --- a/apps/backend/src/rhesis/backend/app/routers/experiments.py +++ b/apps/backend/src/rhesis/backend/app/routers/experiments.py @@ -24,6 +24,7 @@ from rhesis.backend.app.auth.principal import resolve_principal_from_request from rhesis.backend.app.auth.rbac import authorize_object, project_id_from_scope from rhesis.backend.app.auth.user_utils import require_current_user_or_token +from rhesis.backend.app.crud import experiment as experiment_crud from rhesis.backend.app.crud.project import get_project from rhesis.backend.app.crud.test_run import get_test_runs from rhesis.backend.app.dependencies import ( @@ -81,7 +82,7 @@ def list_experiments( belonging to other users are excluded. """ organization_id, user_id = tenant_context - rows = crud.get_experiments( + rows = experiment_crud.get_experiments( db, skip=skip, limit=limit,