Coverage for polar/meter/repository.py: 77%
18 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
1from uuid import UUID
3from sqlalchemy import Select, select
5from polar.auth.models import AuthSubject, Organization, User, is_organization, is_user
6from polar.kit.repository import RepositoryBase, RepositoryIDMixin
7from polar.models import Meter, UserOrganization
10class MeterRepository(RepositoryBase[Meter], RepositoryIDMixin[Meter, UUID]):
11 model = Meter
13 async def get_readable_by_id(
14 self, id: UUID, auth_subject: AuthSubject[User | Organization]
15 ) -> Meter | None:
16 statement = self.get_readable_statement(auth_subject).where(Meter.id == id)
17 return await self.get_one_or_none(statement)
19 def get_readable_statement(
20 self, auth_subject: AuthSubject[User | Organization]
21 ) -> Select[tuple[Meter]]:
22 statement = self.get_base_statement()
24 if is_user(auth_subject): 24 ↛ 34line 24 didn't jump to line 34 because the condition on line 24 was always true
25 user = auth_subject.subject
26 statement = statement.where(
27 Meter.organization_id.in_(
28 select(UserOrganization.organization_id).where(
29 UserOrganization.user_id == user.id,
30 UserOrganization.deleted_at.is_(None),
31 )
32 )
33 )
34 elif is_organization(auth_subject):
35 statement = statement.where(
36 Meter.organization_id == auth_subject.subject.id
37 )
39 return statement