Skip to content

Commit b7905ad

Browse files
Merge pull request #286 from supertokens/feat/usercontext-request-helper
feat: Add a helper function to read the original request from the user context inside overrides
2 parents 714d2e0 + f6b0a7b commit b7905ad

File tree

5 files changed

+130
-1
lines changed

5 files changed

+130
-1
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [unreleased]
99

10+
## [0.12.4] - 2023-05-23
11+
12+
### Changes
13+
14+
- Added a new `GetRequestFromUserContext` function that can be used to read the original network request from the user context in overridden APIs and recipe functions
15+
1016
## [0.12.3] - 2023-05-22
1117

1218
### Added

recipe/emailpassword/userContext_test.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,101 @@ func TestDefaultUserContext(t *testing.T) {
122122
assert.True(t, signInAPIContextWorks)
123123
assert.True(t, createNewSessionContextWorks)
124124
}
125+
126+
func TestGetRequestFromUserContext(t *testing.T) {
127+
signInContextWorks := false
128+
signInAPIContextWorks := false
129+
createNewSessionContextWorks := false
130+
131+
configValue := supertokens.TypeInput{
132+
Supertokens: &supertokens.ConnectionInfo{
133+
ConnectionURI: "http://localhost:8080",
134+
},
135+
AppInfo: supertokens.AppInfo{
136+
APIDomain: "api.supertokens.io",
137+
AppName: "SuperTokens",
138+
WebsiteDomain: "supertokens.io",
139+
},
140+
RecipeList: []supertokens.Recipe{
141+
Init(&epmodels.TypeInput{
142+
Override: &epmodels.OverrideStruct{
143+
Functions: func(originalImplementation epmodels.RecipeInterface) epmodels.RecipeInterface {
144+
originalSignIn := *originalImplementation.SignIn
145+
newSignIn := func(email string, password string, userContext supertokens.UserContext) (epmodels.SignInResponse, error) {
146+
requestFromUserContext := supertokens.GetRequestFromUserContext(userContext)
147+
if requestFromUserContext != nil {
148+
assert.True(t, requestFromUserContext.Method == "POST")
149+
assert.True(t, requestFromUserContext.RequestURI == "/auth/signin")
150+
signInContextWorks = true
151+
}
152+
return originalSignIn(email, password, userContext)
153+
}
154+
*originalImplementation.SignIn = newSignIn
155+
return originalImplementation
156+
},
157+
158+
APIs: func(originalImplementation epmodels.APIInterface) epmodels.APIInterface {
159+
originalSignInPOST := *originalImplementation.SignInPOST
160+
newSignInPOST := func(formFields []epmodels.TypeFormField, options epmodels.APIOptions, userContext supertokens.UserContext) (epmodels.SignInPOSTResponse, error) {
161+
requestFromUserContext := supertokens.GetRequestFromUserContext(userContext)
162+
if requestFromUserContext != nil {
163+
assert.True(t, requestFromUserContext.Method == "POST")
164+
assert.True(t, requestFromUserContext.RequestURI == "/auth/signin")
165+
signInAPIContextWorks = true
166+
}
167+
return originalSignInPOST(formFields, options, userContext)
168+
}
169+
*originalImplementation.SignInPOST = newSignInPOST
170+
return originalImplementation
171+
},
172+
},
173+
}),
174+
session.Init(&sessmodels.TypeInput{
175+
GetTokenTransferMethod: func(req *http.Request, forCreateNewSession bool, userContext supertokens.UserContext) sessmodels.TokenTransferMethod {
176+
return sessmodels.CookieTransferMethod
177+
},
178+
179+
Override: &sessmodels.OverrideStruct{
180+
Functions: func(originalImplementation sessmodels.RecipeInterface) sessmodels.RecipeInterface {
181+
originalCreateNewSession := *originalImplementation.CreateNewSession
182+
newCreateNewSession := func(userID string, accessTokenPayload map[string]interface{}, sessionDataInDatabase map[string]interface{}, disableAntiCsrf *bool, userContext supertokens.UserContext) (sessmodels.SessionContainer, error) {
183+
requestFromUserContext := supertokens.GetRequestFromUserContext(userContext)
184+
if requestFromUserContext != nil {
185+
assert.True(t, requestFromUserContext.Method == "POST")
186+
assert.True(t, requestFromUserContext.RequestURI == "/auth/signin" || requestFromUserContext.RequestURI == "/auth/signup")
187+
createNewSessionContextWorks = true
188+
}
189+
return originalCreateNewSession(userID, accessTokenPayload, sessionDataInDatabase, disableAntiCsrf, userContext)
190+
}
191+
*originalImplementation.CreateNewSession = newCreateNewSession
192+
return originalImplementation
193+
},
194+
},
195+
}),
196+
},
197+
}
198+
199+
BeforeEach()
200+
unittesting.StartUpST("localhost", "8080")
201+
defer AfterEach()
202+
err := supertokens.Init(configValue)
203+
if err != nil {
204+
t.Error(err.Error())
205+
}
206+
mux := http.NewServeMux()
207+
testServer := httptest.NewServer(supertokens.Middleware(mux))
208+
defer testServer.Close()
209+
210+
unittesting.SignupRequest("[email protected]", "validpass123", testServer.URL)
211+
212+
res1, err := unittesting.SignInRequest("[email protected]", "validpass123", testServer.URL)
213+
214+
if err != nil {
215+
t.Error(err.Error())
216+
}
217+
218+
assert.Equal(t, 200, res1.StatusCode)
219+
assert.True(t, signInContextWorks)
220+
assert.True(t, signInAPIContextWorks)
221+
assert.True(t, createNewSessionContextWorks)
222+
}

supertokens/constants.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const (
2121
)
2222

2323
// VERSION current version of the lib
24-
const VERSION = "0.12.3"
24+
const VERSION = "0.12.4"
2525

2626
var (
2727
cdiSupported = []string{"2.21"}

supertokens/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,7 @@ func GetUsersNewestFirst(paginationToken *string, limit *int, includeRecipeIds *
7070
func DeleteUser(userId string) error {
7171
return deleteUser(userId)
7272
}
73+
74+
func GetRequestFromUserContext(userContext UserContext) *http.Request {
75+
return getRequestFromUserContext(userContext)
76+
}

supertokens/supertokens.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"errors"
2121
"flag"
2222
"net/http"
23+
"reflect"
2324
"strconv"
2425
"strings"
2526
)
@@ -378,3 +379,23 @@ func ResetForTest() {
378379
func IsRunningInTestMode() bool {
379380
return flag.Lookup("test.v") != nil || IsTestFlag
380381
}
382+
383+
func getRequestFromUserContext(userContext UserContext) *http.Request {
384+
if userContext == nil {
385+
return nil
386+
}
387+
388+
_userContext := *userContext
389+
defaultObj, ok := _userContext["_default"]
390+
391+
if !ok {
392+
return nil
393+
}
394+
395+
emptyMap := map[string]interface{}{}
396+
if reflect.TypeOf(defaultObj).Kind() != reflect.TypeOf(emptyMap).Kind() {
397+
return nil
398+
}
399+
400+
return defaultObj.(map[string]interface{})["request"].(*http.Request)
401+
}

0 commit comments

Comments
 (0)