Coverage for polar/customer_portal/service/customer_meter.py: 100%
26 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1import uuid
2from collections.abc import Sequence
4from sqlalchemy.orm import joinedload
5from sqlalchemy.orm.strategy_options import contains_eager
7from polar.auth.models import AuthSubject
8from polar.kit.db.postgres import AsyncSession
9from polar.kit.pagination import PaginationParams
10from polar.kit.sorting import Sorting
11from polar.models import Customer, CustomerMeter, Meter
13from ..repository.customer_meter import CustomerMeterRepository
14from ..sorting.customer_meter import CustomerCustomerMeterSortProperty
17class CustomerMeterService:
18 async def list(
19 self,
20 session: AsyncSession,
21 auth_subject: AuthSubject[Customer],
22 *,
23 meter_id: Sequence[uuid.UUID] | None = None,
24 query: str | None = None,
25 pagination: PaginationParams,
26 sorting: list[Sorting[CustomerCustomerMeterSortProperty]] = [
27 (CustomerCustomerMeterSortProperty.modified_at, True)
28 ],
29 ) -> tuple[Sequence[CustomerMeter], int]:
30 repository = CustomerMeterRepository.from_session(session)
31 statement = (
32 repository.get_readable_statement(auth_subject)
33 .join(CustomerMeter.meter)
34 .options(
35 contains_eager(CustomerMeter.meter),
36 )
37 )
39 if meter_id is not None:
40 statement = statement.where(CustomerMeter.meter_id.in_(meter_id))
42 if query is not None:
43 statement = statement.where(Meter.name.ilike(f"%{query}%"))
45 statement = repository.apply_sorting(statement, sorting)
47 return await repository.paginate(
48 statement, limit=pagination.limit, page=pagination.page
49 )
51 async def get(
52 self,
53 session: AsyncSession,
54 auth_subject: AuthSubject[Customer],
55 id: uuid.UUID,
56 ) -> CustomerMeter | None:
57 repository = CustomerMeterRepository.from_session(session)
58 statement = (
59 repository.get_readable_statement(auth_subject)
60 .where(CustomerMeter.id == id)
61 .options(joinedload(CustomerMeter.meter))
62 )
63 return await repository.get_one_or_none(statement)
66customer_meter = CustomerMeterService()