Skip to content
This repository was archived by the owner on Feb 4, 2021. It is now read-only.

Commit 8a22523

Browse files
committed
Add ListPrivateUsers
1 parent 922020e commit 8a22523

10 files changed

+281
-92
lines changed

api/contribution_conllections.validator.pb.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/entries.validator.pb.go

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/invitations.validator.pb.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/protos/users.proto

+6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ service UserService {
1818
get: "/users"
1919
};
2020
}
21+
rpc ListPrivateUsers (ListUsersRequest) returns (ListUsersResponse) {
22+
option (google.api.http) = {
23+
get: "/private/users"
24+
};
25+
}
2126
rpc GetUser (GetUserRequest) returns (User) {
2227
option (google.api.http) = {
2328
get: "/users/{user_name}"
@@ -77,6 +82,7 @@ enum ProfileScope {
7782
message ListUsersRequest {
7883
uint32 page_token = 1;
7984
int32 page_size = 2;
85+
bool include_private_users = 3;
8086
}
8187

8288
message ListUsersResponse {

api/users.pb.go

+130-86
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/users.pb.gw.go

+50
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/users.swagger.json

+46
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,45 @@
1515
"application/json"
1616
],
1717
"paths": {
18+
"/private/users": {
19+
"get": {
20+
"operationId": "ListPrivateUsers",
21+
"responses": {
22+
"200": {
23+
"description": "",
24+
"schema": {
25+
"$ref": "#/definitions/prolab_accountsListUsersResponse"
26+
}
27+
}
28+
},
29+
"parameters": [
30+
{
31+
"name": "page_token",
32+
"in": "query",
33+
"required": false,
34+
"type": "integer",
35+
"format": "int64"
36+
},
37+
{
38+
"name": "page_size",
39+
"in": "query",
40+
"required": false,
41+
"type": "integer",
42+
"format": "int32"
43+
},
44+
{
45+
"name": "include_private_users",
46+
"in": "query",
47+
"required": false,
48+
"type": "boolean",
49+
"format": "boolean"
50+
}
51+
],
52+
"tags": [
53+
"UserService"
54+
]
55+
}
56+
},
1857
"/user": {
1958
"get": {
2059
"operationId": "GetCurrentUser",
@@ -124,6 +163,13 @@
124163
"required": false,
125164
"type": "integer",
126165
"format": "int32"
166+
},
167+
{
168+
"name": "include_private_users",
169+
"in": "query",
170+
"required": false,
171+
"type": "boolean",
172+
"format": "boolean"
127173
}
128174
],
129175
"tags": [

app/server/users_server.go

+23-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@ var (
6060
)
6161

6262
func (s *userServiceServerImpl) ListPublicUsers(ctx context.Context, req *api_pb.ListUsersRequest) (*api_pb.ListUsersResponse, error) {
63+
return s.listUsers(ctx, req, false)
64+
}
65+
66+
func (s *userServiceServerImpl) ListPrivateUsers(ctx context.Context, req *api_pb.ListUsersRequest) (*api_pb.ListUsersResponse, error) {
67+
_, ok := interceptor.GetCurrentUserID(ctx)
68+
if !ok {
69+
return nil, util.ErrUnauthenticated
70+
}
71+
72+
return s.listUsers(ctx, req, true)
73+
}
74+
75+
func (s *userServiceServerImpl) listUsers(ctx context.Context, req *api_pb.ListUsersRequest, includePrivateUsers bool) (*api_pb.ListUsersResponse, error) {
6376
size := req.GetPageSize()
6477
if size < 0 || 100 < size {
6578
return nil, ErrPageSizeOutOfRange
@@ -69,7 +82,16 @@ func (s *userServiceServerImpl) ListPublicUsers(ctx context.Context, req *api_pb
6982
}
7083

7184
us := s.UserStore(ctx)
72-
u, next, err := us.ListPublicUsers(model.UserID(req.GetPageToken()), int(size))
85+
var (
86+
u []*record.User
87+
next model.UserID
88+
err error
89+
)
90+
if includePrivateUsers {
91+
u, next, err = us.ListPrivateUsers(model.UserID(req.GetPageToken()), int(size))
92+
} else {
93+
u, next, err = us.ListPublicUsers(model.UserID(req.GetPageToken()), int(size))
94+
}
7395
if err != nil {
7496
return nil, err
7597
}

infra/store/user/user_store.go

+21-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func (s *userStoreImpl) ListPublicUsers(minUserID model.UserID, limit int) ([]*r
105105
mods := []qm.QueryMod{
106106
qm.Load("Profile.Role"),
107107
qm.Load("Profile.Department"),
108-
qm.Select("profiles.*", s.selectQuery(model.Public)),
108+
qm.Select("profiles.*"),
109109
qm.InnerJoin("profiles on profiles.id = users.profile_id"),
110110
qm.Where("? <= users.id", minUserID),
111111
qm.Where("profiles.profile_scope = ?", model.Public),
@@ -124,6 +124,26 @@ func (s *userStoreImpl) ListPublicUsers(minUserID model.UserID, limit int) ([]*r
124124
return u[:limit], model.UserID(u[limit].ID), nil
125125
}
126126

127+
func (s *userStoreImpl) ListPrivateUsers(minUserID model.UserID, limit int) ([]*record.User, model.UserID, error) {
128+
mods := []qm.QueryMod{
129+
qm.Load("Profile.Role"),
130+
qm.Load("Profile.Department"),
131+
qm.Where("? <= users.id", minUserID),
132+
qm.Limit(limit + 1),
133+
qm.OrderBy("users.id"),
134+
}
135+
136+
u, err := record.Users(mods...).All(s.ctx, s.db)
137+
if err != nil {
138+
return nil, 0, errors.WithStack(err)
139+
}
140+
141+
if len(u) <= limit {
142+
return u, 0, nil
143+
}
144+
return u[:limit], model.UserID(u[limit].ID), nil
145+
}
146+
127147
func (s *userStoreImpl) UpdateFullName(userID model.UserID, fullName string) (*record.User, error) {
128148
var u *record.User
129149
err := s.db.Watch(s.ctx, func(ctx context.Context, tx *sql.Tx) error {

infra/store/user_store.go

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type UserStore interface {
1313
GetUserByEmail(email string) (*record.User, error)
1414
GetUserWithPrivate(userID model.UserID) (*record.User, error)
1515
ListPublicUsers(minUserID model.UserID, limit int) ([]*record.User, model.UserID, error)
16+
ListPrivateUsers(minUserID model.UserID, limit int) ([]*record.User, model.UserID, error)
1617
UpdateFullName(userID model.UserID, fullName string) (*record.User, error)
1718
UpdateIcon(userID model.UserID, icon []byte) (*record.User, error)
1819
}

0 commit comments

Comments
 (0)