[server] add ability to get user by email

This commit is contained in:
Lakhan Samani 2023-05-20 09:49:18 +05:30
parent 4e7074d75b
commit 930c934fdb
5 changed files with 63 additions and 17 deletions

View File

@ -2630,7 +2630,8 @@ input ResendOTPRequest {
} }
input GetUserRequest { input GetUserRequest {
id: String! id: String
email: String
} }
type Mutation { type Mutation {
@ -15369,7 +15370,7 @@ func (ec *executionContext) unmarshalInputGetUserRequest(ctx context.Context, ob
asMap[k] = v asMap[k] = v
} }
fieldsInOrder := [...]string{"id"} fieldsInOrder := [...]string{"id", "email"}
for _, k := range fieldsInOrder { for _, k := range fieldsInOrder {
v, ok := asMap[k] v, ok := asMap[k]
if !ok { if !ok {
@ -15380,7 +15381,15 @@ func (ec *executionContext) unmarshalInputGetUserRequest(ctx context.Context, ob
var err error var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id"))
it.ID, err = ec.unmarshalNString2string(ctx, v) it.ID, err = ec.unmarshalOString2ᚖstring(ctx, v)
if err != nil {
return it, err
}
case "email":
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email"))
it.Email, err = ec.unmarshalOString2ᚖstring(ctx, v)
if err != nil { if err != nil {
return it, err return it, err
} }

View File

@ -144,7 +144,8 @@ type GenerateJWTKeysResponse struct {
} }
type GetUserRequest struct { type GetUserRequest struct {
ID string `json:"id"` ID *string `json:"id"`
Email *string `json:"email"`
} }
type InviteMemberInput struct { type InviteMemberInput struct {

View File

@ -537,7 +537,8 @@ input ResendOTPRequest {
} }
input GetUserRequest { input GetUserRequest {
id: String! id: String
email: String
} }
type Mutation { type Mutation {

View File

@ -3,6 +3,7 @@ package resolvers
import ( import (
"context" "context"
"fmt" "fmt"
"strings"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@ -20,17 +21,28 @@ func UserResolver(ctx context.Context, params model.GetUserRequest) (*model.User
log.Debug("Failed to get GinContext: ", err) log.Debug("Failed to get GinContext: ", err)
return nil, err return nil, err
} }
if !token.IsSuperAdmin(gc) { if !token.IsSuperAdmin(gc) {
log.Debug("Not logged in as super admin.") log.Debug("Not logged in as super admin.")
return nil, fmt.Errorf("unauthorized") return nil, fmt.Errorf("unauthorized")
} }
// Try getting user by ID
res, err := db.Provider.GetUserByID(ctx, params.ID) if params.ID != nil && strings.Trim(*params.ID, " ") != "" {
if err != nil { res, err := db.Provider.GetUserByID(ctx, *params.ID)
log.Debug("Failed to get users: ", err) if err != nil {
return nil, err log.Debug("Failed to get users by ID: ", err)
return nil, err
}
return res.AsAPIUser(), nil
} }
// Try getting user by email
return res.AsAPIUser(), nil if params.Email != nil && strings.Trim(*params.Email, " ") != "" {
res, err := db.Provider.GetUserByEmail(ctx, *params.Email)
if err != nil {
log.Debug("Failed to get users by email: ", err)
return nil, err
}
return res.AsAPIUser(), nil
}
// Return error if no params are provided
return nil, fmt.Errorf("invalid params, user id or email is required")
} }

View File

@ -8,6 +8,7 @@ import (
"github.com/authorizerdev/authorizer/server/crypto" "github.com/authorizerdev/authorizer/server/crypto"
"github.com/authorizerdev/authorizer/server/graph/model" "github.com/authorizerdev/authorizer/server/graph/model"
"github.com/authorizerdev/authorizer/server/memorystore" "github.com/authorizerdev/authorizer/server/memorystore"
"github.com/authorizerdev/authorizer/server/refs"
"github.com/authorizerdev/authorizer/server/resolvers" "github.com/authorizerdev/authorizer/server/resolvers"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -26,7 +27,7 @@ func userTest(t *testing.T, s TestSetup) {
assert.NotEmpty(t, res.User) assert.NotEmpty(t, res.User)
userRes, err := resolvers.UserResolver(ctx, model.GetUserRequest{ userRes, err := resolvers.UserResolver(ctx, model.GetUserRequest{
ID: res.User.ID, ID: &res.User.ID,
}) })
assert.Nil(t, userRes) assert.Nil(t, userRes)
assert.NotNil(t, err, "unauthorized") assert.NotNil(t, err, "unauthorized")
@ -36,14 +37,36 @@ func userTest(t *testing.T, s TestSetup) {
h, err := crypto.EncryptPassword(adminSecret) h, err := crypto.EncryptPassword(adminSecret)
assert.Nil(t, err) assert.Nil(t, err)
req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, h)) req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, h))
// Should throw error for invalid params
userRes, err = resolvers.UserResolver(ctx, model.GetUserRequest{})
assert.Nil(t, userRes)
assert.NotNil(t, err, "invalid params, user id or email is required")
// Should throw error for invalid params with empty id
userRes, err = resolvers.UserResolver(ctx, model.GetUserRequest{ userRes, err = resolvers.UserResolver(ctx, model.GetUserRequest{
ID: res.User.ID, ID: refs.NewStringRef(" "),
})
assert.Nil(t, userRes)
assert.NotNil(t, err, "invalid params, user id or email is required")
// Should throw error for invalid params with empty email
userRes, err = resolvers.UserResolver(ctx, model.GetUserRequest{
Email: refs.NewStringRef(" "),
})
assert.Nil(t, userRes)
assert.NotNil(t, err, "invalid params, user id or email is required")
// Should get user by id
userRes, err = resolvers.UserResolver(ctx, model.GetUserRequest{
ID: &res.User.ID,
})
assert.Nil(t, err)
assert.Equal(t, res.User.ID, userRes.ID)
assert.Equal(t, email, userRes.Email)
// Should get user by email
userRes, err = resolvers.UserResolver(ctx, model.GetUserRequest{
Email: &email,
}) })
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, res.User.ID, userRes.ID) assert.Equal(t, res.User.ID, userRes.ID)
assert.Equal(t, email, userRes.Email) assert.Equal(t, email, userRes.Email)
cleanData(email) cleanData(email)
}) })
} }