Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
141 changes: 0 additions & 141 deletions apps/backend/src/rhesis/backend/app/crud/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -619,144 +619,3 @@ def _recompute_affected_test_sets(deleted_ids: List[uuid.UUID]) -> None:
user_id=user_id,
on_deleted=_recompute_affected_test_sets,
)


# TypeLookup CRUD
def get_type_lookup(
db: Session, type_lookup_id: uuid.UUID, organization_id: str = None, user_id: str = None
) -> Optional[models.TypeLookup]:
"""Get type_lookup."""
return get_item(db, models.TypeLookup, type_lookup_id, organization_id, user_id)


def get_type_lookups(
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.TypeLookup]:
return get_items(
db,
models.TypeLookup,
skip,
limit,
sort_by,
sort_order,
filter,
organization_id=organization_id,
user_id=user_id,
)


def create_type_lookup(
db: Session,
type_lookup: schemas.TypeLookupCreate,
organization_id: str = None,
user_id: str = None,
) -> models.TypeLookup:
"""Create type_lookup."""
return create_item(db, models.TypeLookup, type_lookup, organization_id, user_id)


def update_type_lookup(
db: Session,
type_lookup_id: uuid.UUID,
type_lookup: schemas.TypeLookupUpdate,
organization_id: str = None,
user_id: str = None,
) -> Optional[models.TypeLookup]:
"""Update type_lookup."""
return update_item(db, models.TypeLookup, type_lookup_id, type_lookup, organization_id, user_id)


def delete_type_lookup(
db: Session, type_lookup_id: uuid.UUID, organization_id: str, user_id: str
) -> Optional[models.TypeLookup]:
"""Delete type lookup."""
return delete_item(db, models.TypeLookup, type_lookup_id, organization_id, user_id)


def get_type_lookup_by_name_and_value(
db: Session, type_name: str, type_value: str, organization_id: str, user_id: str = None
) -> Optional[models.TypeLookup]:
"""Get a type lookup by its type_name and type_value"""
return (
QueryBuilder(db, models.TypeLookup)
.with_organization_filter(organization_id)
.with_custom_filter(
lambda q: q.filter(
models.TypeLookup.type_name == type_name, models.TypeLookup.type_value == type_value
)
)
.first()
)


# Tool CRUD
_TOOL_RELATED_FIELDS = (include(models.Tool.tool_provider_type),)


def get_tool(
db: Session, tool_id: uuid.UUID, organization_id: str, user_id: str = None
) -> Optional[models.Tool]:
"""Get a specific tool by ID with relationships loaded"""
return get_item_detail(
db,
models.Tool,
tool_id,
organization_id=organization_id,
user_id=user_id,
related_fields=_TOOL_RELATED_FIELDS,
)


def get_tools(
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.Tool]:
"""Get all tools for an organization with filtering and pagination"""
return (
QueryBuilder(db, models.Tool)
.with_related(*_TOOL_RELATED_FIELDS)
.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()
)


def create_tool(
db: Session, tool: schemas.ToolCreate, organization_id: str, user_id: str = None
) -> models.Tool:
"""Create a new tool"""
return create_item(db, models.Tool, tool, organization_id, user_id)


def update_tool(
db: Session,
tool_id: uuid.UUID,
tool: schemas.ToolUpdate,
organization_id: str,
user_id: str = None,
) -> Optional[models.Tool]:
"""Update a tool"""
return update_item(db, models.Tool, tool_id, tool, organization_id, user_id)


def delete_tool(
db: Session, tool_id: uuid.UUID, organization_id: str, user_id: str = None
) -> Optional[models.Tool]:
"""Delete a tool (soft delete)"""
return delete_item(db, models.Tool, tool_id, organization_id=organization_id, user_id=user_id)
84 changes: 84 additions & 0 deletions apps/backend/src/rhesis/backend/app/crud/tool.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"""CRUD operations for tools.

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.
"""

import uuid
from typing import List, Optional

from sqlalchemy.orm import Session

from rhesis.backend.app import models, schemas
from rhesis.backend.app.utils.crud_utils import (
create_item,
delete_item,
get_item_detail,
update_item,
)
from rhesis.backend.app.utils.query_utils import QueryBuilder, include

_TOOL_RELATED_FIELDS = (include(models.Tool.tool_provider_type),)


def get_tool(
db: Session, tool_id: uuid.UUID, organization_id: str, user_id: str = None
) -> Optional[models.Tool]:
"""Get a specific tool by ID with relationships loaded"""
return get_item_detail(
db,
models.Tool,
tool_id,
organization_id=organization_id,
user_id=user_id,
related_fields=_TOOL_RELATED_FIELDS,
)


def get_tools(
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.Tool]:
"""Get all tools for an organization with filtering and pagination"""
return (
QueryBuilder(db, models.Tool)
.with_related(*_TOOL_RELATED_FIELDS)
.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()
)


def create_tool(
db: Session, tool: schemas.ToolCreate, organization_id: str, user_id: str = None
) -> models.Tool:
"""Create a new tool"""
return create_item(db, models.Tool, tool, organization_id, user_id)


def update_tool(
db: Session,
tool_id: uuid.UUID,
tool: schemas.ToolUpdate,
organization_id: str,
user_id: str = None,
) -> Optional[models.Tool]:
"""Update a tool"""
return update_item(db, models.Tool, tool_id, tool, organization_id, user_id)


def delete_tool(
db: Session, tool_id: uuid.UUID, organization_id: str, user_id: str = None
) -> Optional[models.Tool]:
"""Delete a tool (soft delete)"""
return delete_item(db, models.Tool, tool_id, organization_id=organization_id, user_id=user_id)
95 changes: 95 additions & 0 deletions apps/backend/src/rhesis/backend/app/crud/type_lookup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
"""CRUD operations for type lookups.

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.
"""

import uuid
from typing import List, Optional

from sqlalchemy.orm import Session

from rhesis.backend.app import models, schemas
from rhesis.backend.app.utils.crud_utils import (
create_item,
delete_item,
get_item,
get_items,
update_item,
)
from rhesis.backend.app.utils.query_utils import QueryBuilder


def get_type_lookup(
db: Session, type_lookup_id: uuid.UUID, organization_id: str = None, user_id: str = None
) -> Optional[models.TypeLookup]:
"""Get type_lookup."""
return get_item(db, models.TypeLookup, type_lookup_id, organization_id, user_id)


def get_type_lookups(
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.TypeLookup]:
return get_items(
db,
models.TypeLookup,
skip,
limit,
sort_by,
sort_order,
filter,
organization_id=organization_id,
user_id=user_id,
)


def create_type_lookup(
db: Session,
type_lookup: schemas.TypeLookupCreate,
organization_id: str = None,
user_id: str = None,
) -> models.TypeLookup:
"""Create type_lookup."""
return create_item(db, models.TypeLookup, type_lookup, organization_id, user_id)


def update_type_lookup(
db: Session,
type_lookup_id: uuid.UUID,
type_lookup: schemas.TypeLookupUpdate,
organization_id: str = None,
user_id: str = None,
) -> Optional[models.TypeLookup]:
"""Update type_lookup."""
return update_item(db, models.TypeLookup, type_lookup_id, type_lookup, organization_id, user_id)


def delete_type_lookup(
db: Session, type_lookup_id: uuid.UUID, organization_id: str, user_id: str
) -> Optional[models.TypeLookup]:
"""Delete type lookup."""
return delete_item(db, models.TypeLookup, type_lookup_id, organization_id, user_id)


def get_type_lookup_by_name_and_value(
db: Session, type_name: str, type_value: str, organization_id: str, user_id: str = None
) -> Optional[models.TypeLookup]:
"""Get a type lookup by its type_name and type_value"""
return (
QueryBuilder(db, models.TypeLookup)
.with_organization_filter(organization_id)
.with_custom_filter(
lambda q: q.filter(
models.TypeLookup.type_name == type_name, models.TypeLookup.type_value == type_value
)
)
.first()
)
Loading
Loading