Skip to content

Commit b39f0b8

Browse files
authored
Merge pull request #313 from authorizerdev/feat/add-get-user
Add get user api for admin
2 parents 4f810d2 + b242314 commit b39f0b8

File tree

7 files changed

+286
-0
lines changed

7 files changed

+286
-0
lines changed

server/graph/generated/generated.go

Lines changed: 186 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/graph/model/models_gen.go

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/graph/schema.graphqls

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,10 @@ input ResendOTPRequest {
515515
state: String
516516
}
517517

518+
input GetUserRequest {
519+
id: String!
520+
}
521+
518522
type Mutation {
519523
signup(params: SignUpInput!): AuthResponse!
520524
mobile_signup(params: MobileSignUpInput): AuthResponse!
@@ -557,6 +561,7 @@ type Query {
557561
validate_jwt_token(params: ValidateJWTTokenInput!): ValidateJWTTokenResponse!
558562
# admin only apis
559563
_users(params: PaginatedInput): Users!
564+
_user(params: GetUserRequest!): User!
560565
_verification_requests(params: PaginatedInput): VerificationRequests!
561566
_admin_session: Response!
562567
_env: Env!

server/graph/schema.resolvers.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ func (r *queryResolver) Users(ctx context.Context, params *model.PaginatedInput)
191191
return resolvers.UsersResolver(ctx, params)
192192
}
193193

194+
// User is the resolver for the _user field.
195+
func (r *queryResolver) User(ctx context.Context, params model.GetUserRequest) (*model.User, error) {
196+
return resolvers.UserResolver(ctx, params)
197+
}
198+
194199
// VerificationRequests is the resolver for the _verification_requests field.
195200
func (r *queryResolver) VerificationRequests(ctx context.Context, params *model.PaginatedInput) (*model.VerificationRequests, error) {
196201
return resolvers.VerificationRequestsResolver(ctx, params)

server/resolvers/user.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package resolvers
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
log "github.com/sirupsen/logrus"
8+
9+
"github.com/authorizerdev/authorizer/server/db"
10+
"github.com/authorizerdev/authorizer/server/graph/model"
11+
"github.com/authorizerdev/authorizer/server/token"
12+
"github.com/authorizerdev/authorizer/server/utils"
13+
)
14+
15+
// UserResolver is a resolver for user query
16+
// This is admin only query
17+
func UserResolver(ctx context.Context, params model.GetUserRequest) (*model.User, error) {
18+
gc, err := utils.GinContextFromContext(ctx)
19+
if err != nil {
20+
log.Debug("Failed to get GinContext: ", err)
21+
return nil, err
22+
}
23+
24+
if !token.IsSuperAdmin(gc) {
25+
log.Debug("Not logged in as super admin.")
26+
return nil, fmt.Errorf("unauthorized")
27+
}
28+
29+
res, err := db.Provider.GetUserByID(ctx, params.ID)
30+
if err != nil {
31+
log.Debug("Failed to get users: ", err)
32+
return nil, err
33+
}
34+
35+
return res.AsAPIUser(), nil
36+
}

server/test/resolvers_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ func TestResolvers(t *testing.T) {
9393
webhookTest(t, s)
9494
webhooksTest(t, s)
9595
usersTest(t, s)
96+
userTest(t, s)
9697
deleteUserTest(t, s)
9798
updateUserTest(t, s)
9899
adminLoginTests(t, s)

server/test/user_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package test
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/authorizerdev/authorizer/server/constants"
8+
"github.com/authorizerdev/authorizer/server/crypto"
9+
"github.com/authorizerdev/authorizer/server/graph/model"
10+
"github.com/authorizerdev/authorizer/server/memorystore"
11+
"github.com/authorizerdev/authorizer/server/resolvers"
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func userTest(t *testing.T, s TestSetup) {
16+
t.Helper()
17+
t.Run(`should get users list with admin secret only`, func(t *testing.T) {
18+
req, ctx := createContext(s)
19+
email := "user." + s.TestInfo.Email
20+
res, err := resolvers.SignupResolver(ctx, model.SignUpInput{
21+
Email: email,
22+
Password: s.TestInfo.Password,
23+
ConfirmPassword: s.TestInfo.Password,
24+
})
25+
assert.NoError(t, err)
26+
assert.NotEmpty(t, res.User)
27+
28+
userRes, err := resolvers.UserResolver(ctx, model.GetUserRequest{
29+
ID: res.User.ID,
30+
})
31+
assert.Nil(t, userRes)
32+
assert.NotNil(t, err, "unauthorized")
33+
34+
adminSecret, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyAdminSecret)
35+
assert.Nil(t, err)
36+
h, err := crypto.EncryptPassword(adminSecret)
37+
assert.Nil(t, err)
38+
req.Header.Set("Cookie", fmt.Sprintf("%s=%s", constants.AdminCookieName, h))
39+
40+
userRes, err = resolvers.UserResolver(ctx, model.GetUserRequest{
41+
ID: res.User.ID,
42+
})
43+
assert.Nil(t, err)
44+
assert.Equal(t, res.User.ID, userRes.ID)
45+
assert.Equal(t, email, userRes.Email)
46+
47+
cleanData(email)
48+
})
49+
}

0 commit comments

Comments
 (0)