13
13
# under the License.
14
14
import json
15
15
import os
16
+ from typing import List , Dict , Any
16
17
17
18
from django .conf import settings
18
19
from django .http import HttpRequest , HttpResponse , JsonResponse
19
20
from mysite .store import get_codes , get_url_with_token
20
21
from mysite .utils import custom_init
22
+
23
+ from supertokens_python .recipe .emailverification import EmailVerificationClaim
21
24
from supertokens_python .recipe .session import SessionContainer
25
+ from supertokens_python .recipe .session .interfaces import SessionClaimValidator
26
+ from supertokens_python .recipe .userroles import UserRoleClaim , PermissionClaim
22
27
23
28
mode = os .environ .get ("APP_MODE" , "asgi" )
24
29
30
+
31
+ async def override_global_claim_validators (
32
+ gv : List [SessionClaimValidator ],
33
+ _session : SessionContainer ,
34
+ user_context : Dict [str , Any ],
35
+ ):
36
+ validators = gv .copy ()
37
+ req = user_context ["_default" ]["request" ]
38
+ body = await req .json ()
39
+
40
+ if body .get ("role" ):
41
+ info = body ["role" ]
42
+ validator = getattr (UserRoleClaim .validators , info ["validator" ])
43
+ validators .append (validator (* info ["args" ]))
44
+
45
+ if body .get ("permission" ):
46
+ info = body ["permission" ]
47
+ validator = getattr (PermissionClaim .validators , info ["validator" ])
48
+ validators .append (validator (* info ["args" ]))
49
+
50
+ return validators
51
+
52
+
25
53
if mode == "asgi" :
26
54
from supertokens_python .recipe .session .framework .django .asyncio import (
27
55
verify_session ,
28
56
)
57
+ from supertokens_python .recipe .userroles .asyncio import (
58
+ create_new_role_or_add_permissions ,
59
+ add_role_to_user ,
60
+ )
61
+ from supertokens_python .recipe .emailverification .asyncio import unverify_email
29
62
30
63
@verify_session ()
31
64
async def session_info (request : HttpRequest ): # type: ignore
@@ -39,8 +72,36 @@ async def session_info(request: HttpRequest): # type: ignore
39
72
}
40
73
)
41
74
75
+ @verify_session ()
76
+ async def set_role_api (request : HttpRequest ):
77
+ session_ : SessionContainer = request .supertokens # type: ignore
78
+ body = json .loads (request .body )
79
+ await create_new_role_or_add_permissions (body ["role" ], body ["permissions" ])
80
+ await add_role_to_user (session_ .get_user_id (), body ["role" ])
81
+ await session_ .fetch_and_set_claim (UserRoleClaim )
82
+ await session_ .fetch_and_set_claim (PermissionClaim )
83
+ return JsonResponse ({"status" : "OK" })
84
+
85
+ @verify_session ()
86
+ async def unverify_email_api (request : HttpRequest ):
87
+ session_ : SessionContainer = request .supertokens # type: ignore
88
+ await unverify_email (session_ .get_user_id ())
89
+ await session_ .fetch_and_set_claim (EmailVerificationClaim )
90
+ return JsonResponse ({"status" : "OK" })
91
+
92
+ @verify_session (override_global_claim_validators = override_global_claim_validators )
93
+ async def check_role_api (): # type: ignore
94
+ return JsonResponse ({"status" : "OK" })
95
+
42
96
else :
43
97
from supertokens_python .recipe .session .framework .django .syncio import verify_session
98
+ from supertokens_python .recipe .userroles .syncio import (
99
+ create_new_role_or_add_permissions as sync_create_new_role_or_add_permissions ,
100
+ add_role_to_user as sync_add_role_to_user ,
101
+ )
102
+ from supertokens_python .recipe .emailverification .syncio import (
103
+ unverify_email as sync_unverify_email ,
104
+ )
44
105
45
106
@verify_session ()
46
107
def session_info (request : HttpRequest ):
@@ -54,6 +115,27 @@ def session_info(request: HttpRequest):
54
115
}
55
116
)
56
117
118
+ @verify_session ()
119
+ def sync_set_role_api (request : HttpRequest ):
120
+ session_ : SessionContainer = request .supertokens # type: ignore
121
+ body = json .loads (request .body )
122
+ sync_create_new_role_or_add_permissions (body ["role" ], body ["permissions" ])
123
+ sync_add_role_to_user (session_ .get_user_id (), body ["role" ])
124
+ session_ .sync_fetch_and_set_claim (UserRoleClaim )
125
+ session_ .sync_fetch_and_set_claim (PermissionClaim )
126
+ return JsonResponse ({"status" : "OK" })
127
+
128
+ @verify_session ()
129
+ def sync_unverify_email_api (request : HttpRequest ):
130
+ session_ : SessionContainer = request .supertokens # type: ignore
131
+ sync_unverify_email (session_ .get_user_id ())
132
+ session_ .sync_fetch_and_set_claim (EmailVerificationClaim )
133
+ return JsonResponse ({"status" : "OK" })
134
+
135
+ @verify_session (override_global_claim_validators = override_global_claim_validators )
136
+ def sync_check_role_api ():
137
+ return JsonResponse ({"status" : "OK" })
138
+
57
139
58
140
def ping (request : HttpRequest ):
59
141
return HttpResponse ("success" )
@@ -87,5 +169,12 @@ def before_each(request: HttpRequest):
87
169
88
170
def test_feature_flags (request : HttpRequest ):
89
171
return JsonResponse (
90
- {"available" : ["passwordless" , "thirdpartypasswordless" , "generalerror" ]}
172
+ {
173
+ "available" : [
174
+ "passwordless" ,
175
+ "thirdpartypasswordless" ,
176
+ "generalerror" ,
177
+ "userroles" ,
178
+ ]
179
+ }
91
180
)
0 commit comments