Skip to content

Commit e899470

Browse files
committed
feat!(firebase): add FirebaseOrInternalIdInputType
for firebase and internal id support for id for Contributor user and userGroup BREAKING CHANGE: userId, userGroupId and id for contributor and community queries are changed
1 parent c145636 commit e899470

File tree

6 files changed

+65
-28
lines changed

6 files changed

+65
-28
lines changed

apps/community_dashboard/graphql/queries.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import strawberry
66
from asgiref.sync import sync_to_async
77
from django.db import models
8-
from django.shortcuts import aget_object_or_404
98
from django.utils import timezone
109

1110
from apps.community_dashboard.models import AggregatedUserGroupStatData, AggregatedUserStatData
12-
from apps.contributor.models import ContributorUser
11+
from apps.contributor.models import ContributorUser, ContributorUserGroup
12+
from utils.graphql.inputs import FirebaseOrInternalIdInputType
1313

1414
from .types import (
1515
AggregateHelper,
@@ -117,17 +117,19 @@ async def community_filtered_stats(
117117
) -> CommunityFilteredStats:
118118
return CommunityFilteredStats(date_range=date_range)
119119

120+
# By Internal ID
120121
@strawberry.field
121122
async def community_user_stats(
122123
self,
123-
firebase_id: strawberry.ID,
124+
user_id: FirebaseOrInternalIdInputType,
124125
) -> ContributorUserStats:
125-
user = await aget_object_or_404(ContributorUser, firebase_id=firebase_id)
126+
user = await FirebaseOrInternalIdInputType.aget_object_or_404(ContributorUser, object_id=user_id)
126127
return ContributorUserStats(user=user)
127128

128129
@strawberry.field
129130
async def community_user_group_stats(
130131
self,
131-
user_group_id: strawberry.ID,
132+
user_group_id: FirebaseOrInternalIdInputType,
132133
) -> ContributorUserGroupStats:
133-
return ContributorUserGroupStats(user_group_id=int(user_group_id))
134+
user_group = await FirebaseOrInternalIdInputType.aget_object_or_404(ContributorUserGroup, object_id=user_group_id)
135+
return ContributorUserGroupStats(user_group=user_group)

apps/community_dashboard/graphql/types.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from django_cte import With # type: ignore[reportMissingTypeStubs]
1212

1313
from apps.community_dashboard.models import AggregatedUserGroupStatData, AggregatedUserStatData
14-
from apps.contributor.models import ContributorUser
14+
from apps.contributor.models import ContributorUser, ContributorUserGroup
1515
from apps.project.models import Project, ProjectTypeEnum
1616
from utils.graphql.inputs import DateRangeInput
1717
from utils.graphql.types import AreaSqKm, GenericJSON
@@ -349,6 +349,10 @@ def __post_init__(self, user: ContributorUser):
349349
async def id(self) -> strawberry.ID:
350350
return typing.cast("strawberry.ID", self._user.pk)
351351

352+
@strawberry.field
353+
async def firebase_id(self) -> strawberry.ID:
354+
return typing.cast("strawberry.ID", self._user.firebase_id)
355+
352356
@strawberry.field
353357
async def stats(self) -> ContributorUserStatType:
354358
# TODO: Cache this
@@ -423,15 +427,15 @@ def __post_init__(self, date_range: DateRangeInput | None, user_group_id: int):
423427

424428
@strawberry.type
425429
class ContributorUserGroupStats:
426-
user_group_id: InitVar[int]
430+
user_group: InitVar[ContributorUserGroup]
427431

428432
_user_group_id: strawberry.Private[int] = dataclass_field(init=False)
429433
_ug_qs: strawberry.Private[models.QuerySet[AggregatedUserGroupStatData]] = dataclass_field(init=False)
430434

431-
def __post_init__(self, user_group_id: int):
432-
self._user_group_id = user_group_id
435+
def __post_init__(self, user_group: ContributorUserGroup):
436+
self._user_group_id = user_group.pk
433437
self._ug_qs = AggregatedUserGroupStatData.objects.filter(
434-
user_group_id=user_group_id,
438+
user_group_id=user_group.pk,
435439
)
436440

437441
@strawberry.field

apps/community_dashboard/tests/query_test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ def test_filtered_community_stats(self):
256256
def test_user_group_aggregated_calc(self):
257257
query = """
258258
query MyQuery($userGroupId: ID!) {
259-
communityUserGroupStats(userGroupId: $userGroupId) {
259+
communityUserGroupStats(userGroupId: {id: $userGroupId}) {
260260
stats {
261261
totalAreaSwiped
262262
totalContributors
@@ -306,7 +306,7 @@ def test_user_group_aggregated_calc(self):
306306
def test_user_group_query(self):
307307
query = """
308308
query MyQuery($userGroupId: ID!, $pagination: OffsetPaginationInput!) {
309-
contributorUserGroup(id: $userGroupId) {
309+
contributorUserGroup(userGroupId: {id: $userGroupId}) {
310310
id
311311
name
312312
createdAt
@@ -502,13 +502,13 @@ def test_user_query(self):
502502
$toDate: Date!,
503503
) {
504504
505-
contributorUserByFirebaseId(firebaseId: $firebaseId) {
505+
contributorUser(userId: {firebaseId: $firebaseId}) {
506506
id
507507
firebaseId
508508
username
509509
}
510510
511-
communityUserStats(firebaseId: $firebaseId) {
511+
communityUserStats(userId: {firebaseId: $firebaseId}) {
512512
id
513513
stats {
514514
totalSwipes
@@ -644,7 +644,7 @@ def test_user_query(self):
644644
)
645645

646646
assert {
647-
"contributorUserByFirebaseId": {
647+
"contributorUser": {
648648
"id": self.gID(contributor_user.pk),
649649
"firebaseId": contributor_user.firebase_id,
650650
"username": contributor_user.username,

apps/contributor/graphql/queries.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import strawberry
44
import strawberry_django
55
from django.db.models import QuerySet
6-
from django.shortcuts import aget_object_or_404
76
from strawberry_django.pagination import OffsetPaginated
87
from strawberry_django.permissions import IsAuthenticated
98

109
from apps.contributor.models import ContributorTeam, ContributorUser, ContributorUserGroup, ContributorUserGroupMembership
10+
from utils.graphql.inputs import FirebaseOrInternalIdInputType
1111

1212
from .filters import (
1313
ContributorTeamFilter,
@@ -31,18 +31,25 @@ class Query:
3131
filters=ContributorUserFilter,
3232
)
3333

34-
contributor_user: ContributorUserType = strawberry_django.field()
35-
36-
contributor_user_group: ContributorUserGroupType = strawberry_django.field()
37-
3834
# Team
3935
contributor_team: ContributorTeamType = strawberry_django.field()
4036

4137
@strawberry.field
42-
async def contributor_user_by_firebase_id(self, firebase_id: strawberry.ID) -> ContributorUserType:
43-
obj = await aget_object_or_404(ContributorUser, firebase_id=firebase_id)
38+
async def contributor_user(
39+
self,
40+
user_id: FirebaseOrInternalIdInputType,
41+
) -> ContributorUserType:
42+
obj = await FirebaseOrInternalIdInputType.aget_object_or_404(ContributorUser, object_id=user_id)
4443
return typing.cast("ContributorUserType", obj)
4544

45+
@strawberry.field
46+
async def contributor_user_group(
47+
self,
48+
user_group_id: FirebaseOrInternalIdInputType,
49+
) -> ContributorUserGroupType:
50+
obj = await FirebaseOrInternalIdInputType.aget_object_or_404(ContributorUserGroup, object_id=user_group_id)
51+
return typing.cast("ContributorUserGroupType", obj)
52+
4653
# --- Paginated
4754
# --- ContributorUserGroup
4855
@strawberry_django.offset_paginated(

schema.graphql

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,7 @@ type ContributorUserStatType {
663663

664664
type ContributorUserStats {
665665
filteredStats(dateRange: DateRangeInput = null): ContributorUserFilteredStats!
666+
firebaseId: ID!
666667
id: ID!
667668
stats: ContributorUserStatType!
668669

@@ -804,6 +805,11 @@ type FindTutorialTaskPropertyType {
804805
tileZ: Int!
805806
}
806807

808+
input FirebaseOrInternalIdInputType @oneOf {
809+
firebaseId: ID
810+
id: ID
811+
}
812+
807813
interface FirebasePushResourceTypeMixin {
808814
firebaseId: String!
809815
firebaseLastPushed: DateTime
@@ -2009,13 +2015,12 @@ type Query {
20092015

20102016
"""Stats from last 30 days."""
20112017
communityStatsLatest: CommunityStatsType!
2012-
communityUserGroupStats(userGroupId: ID!): ContributorUserGroupStats!
2013-
communityUserStats(firebaseId: ID!): ContributorUserStats!
2018+
communityUserGroupStats(userGroupId: FirebaseOrInternalIdInputType!): ContributorUserGroupStats!
2019+
communityUserStats(userId: FirebaseOrInternalIdInputType!): ContributorUserStats!
20142020
contributorTeam(id: ID!): ContributorTeamType!
20152021
contributorTeams(includeAll: Boolean! = false, filters: ContributorTeamFilter, order: ContributorTeamOrder, pagination: OffsetPaginationInput): ContributorTeamTypeOffsetPaginated! @isAuthenticated
2016-
contributorUser(id: ID!): ContributorUserType!
2017-
contributorUserByFirebaseId(firebaseId: ID!): ContributorUserType!
2018-
contributorUserGroup(id: ID!): ContributorUserGroupType!
2022+
contributorUser(userId: FirebaseOrInternalIdInputType!): ContributorUserType!
2023+
contributorUserGroup(userGroupId: FirebaseOrInternalIdInputType!): ContributorUserGroupType!
20192024
contributorUserGroupMembers(includeAll: Boolean! = false, filters: ContributorUserGroupMembershipFilter, order: ContributorUserGroupMembershipOrder, pagination: OffsetPaginationInput): ContributorUserGroupMembershipTypeOffsetPaginated!
20202025
contributorUserGroups(includeAll: Boolean! = false, filters: ContributorUserGroupFilter, order: ContributorUserGroupOrder, pagination: OffsetPaginationInput): ContributorUserGroupTypeOffsetPaginated!
20212026
contributorUsers(pagination: OffsetPaginationInput, filters: ContributorUserFilter, order: ContributorUserOrder): ContributorUserTypeOffsetPaginated!

utils/graphql/inputs.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,28 @@
11
import datetime
22

33
import strawberry
4+
from django.db import models
5+
from django.shortcuts import aget_object_or_404
46

57

68
@strawberry.input
79
class DateRangeInput:
810
from_date: datetime.date
911
to_date: datetime.date
12+
13+
14+
@strawberry.input(one_of=True)
15+
class FirebaseOrInternalIdInputType:
16+
id: strawberry.Maybe[strawberry.ID]
17+
firebase_id: strawberry.Maybe[strawberry.ID]
18+
19+
@staticmethod
20+
async def aget_object_or_404[M: models.Model](
21+
model: type[M],
22+
object_id: "FirebaseOrInternalIdInputType",
23+
) -> M:
24+
if object_id.id is not None:
25+
return await aget_object_or_404(model, id=object_id.id.value)
26+
if object_id.firebase_id is not None:
27+
return await aget_object_or_404(model, firebase_id=object_id.firebase_id.value)
28+
raise Exception("This should never be called")

0 commit comments

Comments
 (0)