Coverage for polar/meter/repository.py: 41%

18 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-12-05 16:17 +0000

1from uuid import UUID 1a

2 

3from sqlalchemy import Select, select 1a

4 

5from polar.auth.models import AuthSubject, Organization, User, is_organization, is_user 1a

6from polar.kit.repository import RepositoryBase, RepositoryIDMixin 1a

7from polar.models import Meter, UserOrganization 1a

8 

9 

10class MeterRepository(RepositoryBase[Meter], RepositoryIDMixin[Meter, UUID]): 1a

11 model = Meter 1a

12 

13 async def get_readable_by_id( 1a

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) 

18 

19 def get_readable_statement( 1a

20 self, auth_subject: AuthSubject[User | Organization] 

21 ) -> Select[tuple[Meter]]: 

22 statement = self.get_base_statement() 

23 

24 if is_user(auth_subject): 

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 ) 

38 

39 return statement