Validation_Suite/validation-suite/backend/mercury/app/repositories/domain.py

82 lines
2.4 KiB
Python

from __future__ import annotations
from sqlalchemy import or_, select
from sqlalchemy.orm import Session
from app.models.customer import Customer
from app.models.device import Device
from app.models.document import Document
from app.models.equipment import Equipment
from app.models.contact import Contact
from app.models.location import Location
from app.models.user import User
from app.models.validation import Validation
from app.repositories.base import Repository
class UserRepository(Repository[User]):
model = User
def by_email(self, email: str) -> User | None:
return self.session.scalar(select(User).where(User.email == email.strip().lower()))
class CustomerRepository(Repository[Customer]):
model = Customer
def _search_statement(self, search: str | None = None):
statement = select(Customer)
if search:
term = f"%{search.strip()}%"
statement = statement.where(
or_(
Customer.name.ilike(term),
Customer.city.ilike(term),
Customer.postal_code.ilike(term),
Customer.email.ilike(term),
Customer.phone.ilike(term),
Customer.contacts.any(Contact.full_name.ilike(term)),
)
)
return statement
class LocationRepository(Repository[Location]):
model = Location
search_columns = ("name", "city", "room")
class ContactRepository(Repository[Contact]):
model = Contact
search_columns = ("full_name", "function", "email", "phone")
class DeviceRepository(Repository[Device]):
model = Device
search_columns = ("manufacturer", "model", "serial_number", "device_type")
class EquipmentRepository(Repository[Equipment]):
model = Equipment
search_columns = ("manufacturer", "model", "serial_number")
class ValidationRepository(Repository[Validation]):
model = Validation
class DocumentRepository(Repository[Document]):
model = Document
def repositories(session: Session) -> dict[str, Repository]:
return {
"users": UserRepository(session),
"customers": CustomerRepository(session),
"locations": LocationRepository(session),
"contacts": ContactRepository(session),
"devices": DeviceRepository(session),
"equipment": EquipmentRepository(session),
"validations": ValidationRepository(session),
"documents": DocumentRepository(session),
}