chore: tweak user service response

This commit is contained in:
johnnyjoy 2024-08-17 21:32:27 +08:00
parent 8d6ad68d47
commit 8eac931592
7 changed files with 292 additions and 808 deletions

View File

@ -53,36 +53,27 @@ const useUserStore = create<UserState>()((set, get) => ({
return userMap[id] as User; return userMap[id] as User;
} }
const { user } = await userServiceClient.getUser({ const user = await userServiceClient.getUser({
id: id, id: id,
}); });
if (!user) {
throw new Error("User not found");
}
userMap[id] = user; userMap[id] = user;
set(userMap); set(userMap);
return user; return user;
}, },
createUser: async (userCreate: Partial<User>) => { createUser: async (userCreate: Partial<User>) => {
const { user } = await userServiceClient.createUser({ const user = await userServiceClient.createUser({
user: userCreate, user: userCreate,
}); });
if (!user) {
throw new Error("User not found");
}
const userMap = get().userMapById; const userMap = get().userMapById;
userMap[user.id] = user; userMap[user.id] = user;
set(userMap); set(userMap);
return user; return user;
}, },
patchUser: async (userPatch: Partial<User>, updateMask: string[]) => { patchUser: async (userPatch: Partial<User>, updateMask: string[]) => {
const { user } = await userServiceClient.updateUser({ const user = await userServiceClient.updateUser({
user: userPatch, user: userPatch,
updateMask: updateMask, updateMask: updateMask,
}); });
if (!user) {
throw new Error("User not found");
}
const userMap = get().userMapById; const userMap = get().userMapById;
userMap[user.id] = user; userMap[user.id] = user;
set(userMap); set(userMap);

View File

@ -5,6 +5,7 @@ package slash.api.v1;
import "api/v1/common.proto"; import "api/v1/common.proto";
import "google/api/annotations.proto"; import "google/api/annotations.proto";
import "google/api/client.proto"; import "google/api/client.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto"; import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto"; import "google/protobuf/timestamp.proto";
@ -16,18 +17,18 @@ service UserService {
option (google.api.http) = {get: "/api/v1/users"}; option (google.api.http) = {get: "/api/v1/users"};
} }
// GetUser returns a user by id. // GetUser returns a user by id.
rpc GetUser(GetUserRequest) returns (GetUserResponse) { rpc GetUser(GetUserRequest) returns (User) {
option (google.api.http) = {get: "/api/v1/users/{id}"}; option (google.api.http) = {get: "/api/v1/users/{id}"};
option (google.api.method_signature) = "id"; option (google.api.method_signature) = "id";
} }
// CreateUser creates a new user. // CreateUser creates a new user.
rpc CreateUser(CreateUserRequest) returns (CreateUserResponse) { rpc CreateUser(CreateUserRequest) returns (User) {
option (google.api.http) = { option (google.api.http) = {
post: "/api/v1/users" post: "/api/v1/users"
body: "user" body: "user"
}; };
} }
rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse) { rpc UpdateUser(UpdateUserRequest) returns (User) {
option (google.api.http) = { option (google.api.http) = {
patch: "/api/v1/users/{user.id}" patch: "/api/v1/users/{user.id}"
body: "user" body: "user"
@ -35,7 +36,7 @@ service UserService {
option (google.api.method_signature) = "user,update_mask"; option (google.api.method_signature) = "user,update_mask";
} }
// DeleteUser deletes a user by id. // DeleteUser deletes a user by id.
rpc DeleteUser(DeleteUserRequest) returns (DeleteUserResponse) { rpc DeleteUser(DeleteUserRequest) returns (google.protobuf.Empty) {
option (google.api.http) = {delete: "/api/v1/users/{id}"}; option (google.api.http) = {delete: "/api/v1/users/{id}"};
option (google.api.method_signature) = "id"; option (google.api.method_signature) = "id";
} }
@ -45,7 +46,7 @@ service UserService {
option (google.api.method_signature) = "id"; option (google.api.method_signature) = "id";
} }
// CreateUserAccessToken creates a new access token for a user. // CreateUserAccessToken creates a new access token for a user.
rpc CreateUserAccessToken(CreateUserAccessTokenRequest) returns (CreateUserAccessTokenResponse) { rpc CreateUserAccessToken(CreateUserAccessTokenRequest) returns (UserAccessToken) {
option (google.api.http) = { option (google.api.http) = {
post: "/api/v1/users/{id}/access_tokens" post: "/api/v1/users/{id}/access_tokens"
body: "*" body: "*"
@ -53,7 +54,7 @@ service UserService {
option (google.api.method_signature) = "id"; option (google.api.method_signature) = "id";
} }
// DeleteUserAccessToken deletes an access token for a user. // DeleteUserAccessToken deletes an access token for a user.
rpc DeleteUserAccessToken(DeleteUserAccessTokenRequest) returns (DeleteUserAccessTokenResponse) { rpc DeleteUserAccessToken(DeleteUserAccessTokenRequest) returns (google.protobuf.Empty) {
option (google.api.http) = {delete: "/api/v1/users/{id}/access_tokens/{access_token}"}; option (google.api.http) = {delete: "/api/v1/users/{id}/access_tokens/{access_token}"};
option (google.api.method_signature) = "id,access_token"; option (google.api.method_signature) = "id,access_token";
} }
@ -95,34 +96,20 @@ message GetUserRequest {
int32 id = 1; int32 id = 1;
} }
message GetUserResponse {
User user = 1;
}
message CreateUserRequest { message CreateUserRequest {
User user = 1; User user = 1;
} }
message CreateUserResponse {
User user = 1;
}
message UpdateUserRequest { message UpdateUserRequest {
User user = 1; User user = 1;
google.protobuf.FieldMask update_mask = 2; google.protobuf.FieldMask update_mask = 2;
} }
message UpdateUserResponse {
User user = 1;
}
message DeleteUserRequest { message DeleteUserRequest {
int32 id = 1; int32 id = 1;
} }
message DeleteUserResponse {}
message ListUserAccessTokensRequest { message ListUserAccessTokensRequest {
// id is the user id. // id is the user id.
int32 id = 1; int32 id = 1;
@ -142,10 +129,6 @@ message CreateUserAccessTokenRequest {
optional google.protobuf.Timestamp expires_at = 3; optional google.protobuf.Timestamp expires_at = 3;
} }
message CreateUserAccessTokenResponse {
UserAccessToken access_token = 1;
}
message DeleteUserAccessTokenRequest { message DeleteUserAccessTokenRequest {
// id is the user id. // id is the user id.
int32 id = 1; int32 id = 1;
@ -153,8 +136,6 @@ message DeleteUserAccessTokenRequest {
string access_token = 2; string access_token = 2;
} }
message DeleteUserAccessTokenResponse {}
message UserAccessToken { message UserAccessToken {
string access_token = 1; string access_token = 1;
string description = 2; string description = 2;

View File

@ -9,21 +9,15 @@
- [api/v1/user_service.proto](#api_v1_user_service-proto) - [api/v1/user_service.proto](#api_v1_user_service-proto)
- [CreateUserAccessTokenRequest](#slash-api-v1-CreateUserAccessTokenRequest) - [CreateUserAccessTokenRequest](#slash-api-v1-CreateUserAccessTokenRequest)
- [CreateUserAccessTokenResponse](#slash-api-v1-CreateUserAccessTokenResponse)
- [CreateUserRequest](#slash-api-v1-CreateUserRequest) - [CreateUserRequest](#slash-api-v1-CreateUserRequest)
- [CreateUserResponse](#slash-api-v1-CreateUserResponse)
- [DeleteUserAccessTokenRequest](#slash-api-v1-DeleteUserAccessTokenRequest) - [DeleteUserAccessTokenRequest](#slash-api-v1-DeleteUserAccessTokenRequest)
- [DeleteUserAccessTokenResponse](#slash-api-v1-DeleteUserAccessTokenResponse)
- [DeleteUserRequest](#slash-api-v1-DeleteUserRequest) - [DeleteUserRequest](#slash-api-v1-DeleteUserRequest)
- [DeleteUserResponse](#slash-api-v1-DeleteUserResponse)
- [GetUserRequest](#slash-api-v1-GetUserRequest) - [GetUserRequest](#slash-api-v1-GetUserRequest)
- [GetUserResponse](#slash-api-v1-GetUserResponse)
- [ListUserAccessTokensRequest](#slash-api-v1-ListUserAccessTokensRequest) - [ListUserAccessTokensRequest](#slash-api-v1-ListUserAccessTokensRequest)
- [ListUserAccessTokensResponse](#slash-api-v1-ListUserAccessTokensResponse) - [ListUserAccessTokensResponse](#slash-api-v1-ListUserAccessTokensResponse)
- [ListUsersRequest](#slash-api-v1-ListUsersRequest) - [ListUsersRequest](#slash-api-v1-ListUsersRequest)
- [ListUsersResponse](#slash-api-v1-ListUsersResponse) - [ListUsersResponse](#slash-api-v1-ListUsersResponse)
- [UpdateUserRequest](#slash-api-v1-UpdateUserRequest) - [UpdateUserRequest](#slash-api-v1-UpdateUserRequest)
- [UpdateUserResponse](#slash-api-v1-UpdateUserResponse)
- [User](#slash-api-v1-User) - [User](#slash-api-v1-User)
- [UserAccessToken](#slash-api-v1-UserAccessToken) - [UserAccessToken](#slash-api-v1-UserAccessToken)
@ -181,21 +175,6 @@
<a name="slash-api-v1-CreateUserAccessTokenResponse"></a>
### CreateUserAccessTokenResponse
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| access_token | [UserAccessToken](#slash-api-v1-UserAccessToken) | | |
<a name="slash-api-v1-CreateUserRequest"></a> <a name="slash-api-v1-CreateUserRequest"></a>
### CreateUserRequest ### CreateUserRequest
@ -211,21 +190,6 @@
<a name="slash-api-v1-CreateUserResponse"></a>
### CreateUserResponse
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| user | [User](#slash-api-v1-User) | | |
<a name="slash-api-v1-DeleteUserAccessTokenRequest"></a> <a name="slash-api-v1-DeleteUserAccessTokenRequest"></a>
### DeleteUserAccessTokenRequest ### DeleteUserAccessTokenRequest
@ -242,16 +206,6 @@
<a name="slash-api-v1-DeleteUserAccessTokenResponse"></a>
### DeleteUserAccessTokenResponse
<a name="slash-api-v1-DeleteUserRequest"></a> <a name="slash-api-v1-DeleteUserRequest"></a>
### DeleteUserRequest ### DeleteUserRequest
@ -267,16 +221,6 @@
<a name="slash-api-v1-DeleteUserResponse"></a>
### DeleteUserResponse
<a name="slash-api-v1-GetUserRequest"></a> <a name="slash-api-v1-GetUserRequest"></a>
### GetUserRequest ### GetUserRequest
@ -292,21 +236,6 @@
<a name="slash-api-v1-GetUserResponse"></a>
### GetUserResponse
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| user | [User](#slash-api-v1-User) | | |
<a name="slash-api-v1-ListUserAccessTokensRequest"></a> <a name="slash-api-v1-ListUserAccessTokensRequest"></a>
### ListUserAccessTokensRequest ### ListUserAccessTokensRequest
@ -378,21 +307,6 @@
<a name="slash-api-v1-UpdateUserResponse"></a>
### UpdateUserResponse
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| user | [User](#slash-api-v1-User) | | |
<a name="slash-api-v1-User"></a> <a name="slash-api-v1-User"></a>
### User ### User
@ -460,13 +374,13 @@
| Method Name | Request Type | Response Type | Description | | Method Name | Request Type | Response Type | Description |
| ----------- | ------------ | ------------- | ------------| | ----------- | ------------ | ------------- | ------------|
| ListUsers | [ListUsersRequest](#slash-api-v1-ListUsersRequest) | [ListUsersResponse](#slash-api-v1-ListUsersResponse) | ListUsers returns a list of users. | | ListUsers | [ListUsersRequest](#slash-api-v1-ListUsersRequest) | [ListUsersResponse](#slash-api-v1-ListUsersResponse) | ListUsers returns a list of users. |
| GetUser | [GetUserRequest](#slash-api-v1-GetUserRequest) | [GetUserResponse](#slash-api-v1-GetUserResponse) | GetUser returns a user by id. | | GetUser | [GetUserRequest](#slash-api-v1-GetUserRequest) | [User](#slash-api-v1-User) | GetUser returns a user by id. |
| CreateUser | [CreateUserRequest](#slash-api-v1-CreateUserRequest) | [CreateUserResponse](#slash-api-v1-CreateUserResponse) | CreateUser creates a new user. | | CreateUser | [CreateUserRequest](#slash-api-v1-CreateUserRequest) | [User](#slash-api-v1-User) | CreateUser creates a new user. |
| UpdateUser | [UpdateUserRequest](#slash-api-v1-UpdateUserRequest) | [UpdateUserResponse](#slash-api-v1-UpdateUserResponse) | | | UpdateUser | [UpdateUserRequest](#slash-api-v1-UpdateUserRequest) | [User](#slash-api-v1-User) | |
| DeleteUser | [DeleteUserRequest](#slash-api-v1-DeleteUserRequest) | [DeleteUserResponse](#slash-api-v1-DeleteUserResponse) | DeleteUser deletes a user by id. | | DeleteUser | [DeleteUserRequest](#slash-api-v1-DeleteUserRequest) | [.google.protobuf.Empty](#google-protobuf-Empty) | DeleteUser deletes a user by id. |
| ListUserAccessTokens | [ListUserAccessTokensRequest](#slash-api-v1-ListUserAccessTokensRequest) | [ListUserAccessTokensResponse](#slash-api-v1-ListUserAccessTokensResponse) | ListUserAccessTokens returns a list of access tokens for a user. | | ListUserAccessTokens | [ListUserAccessTokensRequest](#slash-api-v1-ListUserAccessTokensRequest) | [ListUserAccessTokensResponse](#slash-api-v1-ListUserAccessTokensResponse) | ListUserAccessTokens returns a list of access tokens for a user. |
| CreateUserAccessToken | [CreateUserAccessTokenRequest](#slash-api-v1-CreateUserAccessTokenRequest) | [CreateUserAccessTokenResponse](#slash-api-v1-CreateUserAccessTokenResponse) | CreateUserAccessToken creates a new access token for a user. | | CreateUserAccessToken | [CreateUserAccessTokenRequest](#slash-api-v1-CreateUserAccessTokenRequest) | [UserAccessToken](#slash-api-v1-UserAccessToken) | CreateUserAccessToken creates a new access token for a user. |
| DeleteUserAccessToken | [DeleteUserAccessTokenRequest](#slash-api-v1-DeleteUserAccessTokenRequest) | [DeleteUserAccessTokenResponse](#slash-api-v1-DeleteUserAccessTokenResponse) | DeleteUserAccessToken deletes an access token for a user. | | DeleteUserAccessToken | [DeleteUserAccessTokenRequest](#slash-api-v1-DeleteUserAccessTokenRequest) | [.google.protobuf.Empty](#google-protobuf-Empty) | DeleteUserAccessToken deletes an access token for a user. |

File diff suppressed because it is too large Load Diff

View File

@ -11,6 +11,7 @@ import (
grpc "google.golang.org/grpc" grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes" codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status" status "google.golang.org/grpc/status"
emptypb "google.golang.org/protobuf/types/known/emptypb"
) )
// This is a compile-time assertion to ensure that this generated file // This is a compile-time assertion to ensure that this generated file
@ -36,18 +37,18 @@ type UserServiceClient interface {
// ListUsers returns a list of users. // ListUsers returns a list of users.
ListUsers(ctx context.Context, in *ListUsersRequest, opts ...grpc.CallOption) (*ListUsersResponse, error) ListUsers(ctx context.Context, in *ListUsersRequest, opts ...grpc.CallOption) (*ListUsersResponse, error)
// GetUser returns a user by id. // GetUser returns a user by id.
GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*User, error)
// CreateUser creates a new user. // CreateUser creates a new user.
CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*User, error)
UpdateUser(ctx context.Context, in *UpdateUserRequest, opts ...grpc.CallOption) (*UpdateUserResponse, error) UpdateUser(ctx context.Context, in *UpdateUserRequest, opts ...grpc.CallOption) (*User, error)
// DeleteUser deletes a user by id. // DeleteUser deletes a user by id.
DeleteUser(ctx context.Context, in *DeleteUserRequest, opts ...grpc.CallOption) (*DeleteUserResponse, error) DeleteUser(ctx context.Context, in *DeleteUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// ListUserAccessTokens returns a list of access tokens for a user. // ListUserAccessTokens returns a list of access tokens for a user.
ListUserAccessTokens(ctx context.Context, in *ListUserAccessTokensRequest, opts ...grpc.CallOption) (*ListUserAccessTokensResponse, error) ListUserAccessTokens(ctx context.Context, in *ListUserAccessTokensRequest, opts ...grpc.CallOption) (*ListUserAccessTokensResponse, error)
// CreateUserAccessToken creates a new access token for a user. // CreateUserAccessToken creates a new access token for a user.
CreateUserAccessToken(ctx context.Context, in *CreateUserAccessTokenRequest, opts ...grpc.CallOption) (*CreateUserAccessTokenResponse, error) CreateUserAccessToken(ctx context.Context, in *CreateUserAccessTokenRequest, opts ...grpc.CallOption) (*UserAccessToken, error)
// DeleteUserAccessToken deletes an access token for a user. // DeleteUserAccessToken deletes an access token for a user.
DeleteUserAccessToken(ctx context.Context, in *DeleteUserAccessTokenRequest, opts ...grpc.CallOption) (*DeleteUserAccessTokenResponse, error) DeleteUserAccessToken(ctx context.Context, in *DeleteUserAccessTokenRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
} }
type userServiceClient struct { type userServiceClient struct {
@ -68,9 +69,9 @@ func (c *userServiceClient) ListUsers(ctx context.Context, in *ListUsersRequest,
return out, nil return out, nil
} }
func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) { func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*User, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetUserResponse) out := new(User)
err := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, cOpts...) err := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
@ -78,9 +79,9 @@ func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opt
return out, nil return out, nil
} }
func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error) { func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*User, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(CreateUserResponse) out := new(User)
err := c.cc.Invoke(ctx, UserService_CreateUser_FullMethodName, in, out, cOpts...) err := c.cc.Invoke(ctx, UserService_CreateUser_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
@ -88,9 +89,9 @@ func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserReques
return out, nil return out, nil
} }
func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserRequest, opts ...grpc.CallOption) (*UpdateUserResponse, error) { func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserRequest, opts ...grpc.CallOption) (*User, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(UpdateUserResponse) out := new(User)
err := c.cc.Invoke(ctx, UserService_UpdateUser_FullMethodName, in, out, cOpts...) err := c.cc.Invoke(ctx, UserService_UpdateUser_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
@ -98,9 +99,9 @@ func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserReques
return out, nil return out, nil
} }
func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteUserRequest, opts ...grpc.CallOption) (*DeleteUserResponse, error) { func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(DeleteUserResponse) out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, UserService_DeleteUser_FullMethodName, in, out, cOpts...) err := c.cc.Invoke(ctx, UserService_DeleteUser_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
@ -118,9 +119,9 @@ func (c *userServiceClient) ListUserAccessTokens(ctx context.Context, in *ListUs
return out, nil return out, nil
} }
func (c *userServiceClient) CreateUserAccessToken(ctx context.Context, in *CreateUserAccessTokenRequest, opts ...grpc.CallOption) (*CreateUserAccessTokenResponse, error) { func (c *userServiceClient) CreateUserAccessToken(ctx context.Context, in *CreateUserAccessTokenRequest, opts ...grpc.CallOption) (*UserAccessToken, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(CreateUserAccessTokenResponse) out := new(UserAccessToken)
err := c.cc.Invoke(ctx, UserService_CreateUserAccessToken_FullMethodName, in, out, cOpts...) err := c.cc.Invoke(ctx, UserService_CreateUserAccessToken_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
@ -128,9 +129,9 @@ func (c *userServiceClient) CreateUserAccessToken(ctx context.Context, in *Creat
return out, nil return out, nil
} }
func (c *userServiceClient) DeleteUserAccessToken(ctx context.Context, in *DeleteUserAccessTokenRequest, opts ...grpc.CallOption) (*DeleteUserAccessTokenResponse, error) { func (c *userServiceClient) DeleteUserAccessToken(ctx context.Context, in *DeleteUserAccessTokenRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(DeleteUserAccessTokenResponse) out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, UserService_DeleteUserAccessToken_FullMethodName, in, out, cOpts...) err := c.cc.Invoke(ctx, UserService_DeleteUserAccessToken_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
@ -145,18 +146,18 @@ type UserServiceServer interface {
// ListUsers returns a list of users. // ListUsers returns a list of users.
ListUsers(context.Context, *ListUsersRequest) (*ListUsersResponse, error) ListUsers(context.Context, *ListUsersRequest) (*ListUsersResponse, error)
// GetUser returns a user by id. // GetUser returns a user by id.
GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) GetUser(context.Context, *GetUserRequest) (*User, error)
// CreateUser creates a new user. // CreateUser creates a new user.
CreateUser(context.Context, *CreateUserRequest) (*CreateUserResponse, error) CreateUser(context.Context, *CreateUserRequest) (*User, error)
UpdateUser(context.Context, *UpdateUserRequest) (*UpdateUserResponse, error) UpdateUser(context.Context, *UpdateUserRequest) (*User, error)
// DeleteUser deletes a user by id. // DeleteUser deletes a user by id.
DeleteUser(context.Context, *DeleteUserRequest) (*DeleteUserResponse, error) DeleteUser(context.Context, *DeleteUserRequest) (*emptypb.Empty, error)
// ListUserAccessTokens returns a list of access tokens for a user. // ListUserAccessTokens returns a list of access tokens for a user.
ListUserAccessTokens(context.Context, *ListUserAccessTokensRequest) (*ListUserAccessTokensResponse, error) ListUserAccessTokens(context.Context, *ListUserAccessTokensRequest) (*ListUserAccessTokensResponse, error)
// CreateUserAccessToken creates a new access token for a user. // CreateUserAccessToken creates a new access token for a user.
CreateUserAccessToken(context.Context, *CreateUserAccessTokenRequest) (*CreateUserAccessTokenResponse, error) CreateUserAccessToken(context.Context, *CreateUserAccessTokenRequest) (*UserAccessToken, error)
// DeleteUserAccessToken deletes an access token for a user. // DeleteUserAccessToken deletes an access token for a user.
DeleteUserAccessToken(context.Context, *DeleteUserAccessTokenRequest) (*DeleteUserAccessTokenResponse, error) DeleteUserAccessToken(context.Context, *DeleteUserAccessTokenRequest) (*emptypb.Empty, error)
mustEmbedUnimplementedUserServiceServer() mustEmbedUnimplementedUserServiceServer()
} }
@ -170,25 +171,25 @@ type UnimplementedUserServiceServer struct{}
func (UnimplementedUserServiceServer) ListUsers(context.Context, *ListUsersRequest) (*ListUsersResponse, error) { func (UnimplementedUserServiceServer) ListUsers(context.Context, *ListUsersRequest) (*ListUsersResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListUsers not implemented") return nil, status.Errorf(codes.Unimplemented, "method ListUsers not implemented")
} }
func (UnimplementedUserServiceServer) GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) { func (UnimplementedUserServiceServer) GetUser(context.Context, *GetUserRequest) (*User, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented")
} }
func (UnimplementedUserServiceServer) CreateUser(context.Context, *CreateUserRequest) (*CreateUserResponse, error) { func (UnimplementedUserServiceServer) CreateUser(context.Context, *CreateUserRequest) (*User, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented") return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented")
} }
func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UpdateUserRequest) (*UpdateUserResponse, error) { func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UpdateUserRequest) (*User, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented")
} }
func (UnimplementedUserServiceServer) DeleteUser(context.Context, *DeleteUserRequest) (*DeleteUserResponse, error) { func (UnimplementedUserServiceServer) DeleteUser(context.Context, *DeleteUserRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteUser not implemented") return nil, status.Errorf(codes.Unimplemented, "method DeleteUser not implemented")
} }
func (UnimplementedUserServiceServer) ListUserAccessTokens(context.Context, *ListUserAccessTokensRequest) (*ListUserAccessTokensResponse, error) { func (UnimplementedUserServiceServer) ListUserAccessTokens(context.Context, *ListUserAccessTokensRequest) (*ListUserAccessTokensResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListUserAccessTokens not implemented") return nil, status.Errorf(codes.Unimplemented, "method ListUserAccessTokens not implemented")
} }
func (UnimplementedUserServiceServer) CreateUserAccessToken(context.Context, *CreateUserAccessTokenRequest) (*CreateUserAccessTokenResponse, error) { func (UnimplementedUserServiceServer) CreateUserAccessToken(context.Context, *CreateUserAccessTokenRequest) (*UserAccessToken, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateUserAccessToken not implemented") return nil, status.Errorf(codes.Unimplemented, "method CreateUserAccessToken not implemented")
} }
func (UnimplementedUserServiceServer) DeleteUserAccessToken(context.Context, *DeleteUserAccessTokenRequest) (*DeleteUserAccessTokenResponse, error) { func (UnimplementedUserServiceServer) DeleteUserAccessToken(context.Context, *DeleteUserAccessTokenRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteUserAccessToken not implemented") return nil, status.Errorf(codes.Unimplemented, "method DeleteUserAccessToken not implemented")
} }
func (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {} func (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {}

View File

@ -439,7 +439,7 @@ paths:
"200": "200":
description: A successful response. description: A successful response.
schema: schema:
$ref: '#/definitions/v1CreateUserResponse' $ref: '#/definitions/v1User'
default: default:
description: An unexpected error response. description: An unexpected error response.
schema: schema:
@ -460,7 +460,7 @@ paths:
"200": "200":
description: A successful response. description: A successful response.
schema: schema:
$ref: '#/definitions/v1GetUserResponse' $ref: '#/definitions/v1User'
default: default:
description: An unexpected error response. description: An unexpected error response.
schema: schema:
@ -480,7 +480,8 @@ paths:
"200": "200":
description: A successful response. description: A successful response.
schema: schema:
$ref: '#/definitions/v1DeleteUserResponse' type: object
properties: {}
default: default:
description: An unexpected error response. description: An unexpected error response.
schema: schema:
@ -522,7 +523,7 @@ paths:
"200": "200":
description: A successful response. description: A successful response.
schema: schema:
$ref: '#/definitions/v1CreateUserAccessTokenResponse' $ref: '#/definitions/v1UserAccessToken'
default: default:
description: An unexpected error response. description: An unexpected error response.
schema: schema:
@ -549,7 +550,8 @@ paths:
"200": "200":
description: A successful response. description: A successful response.
schema: schema:
$ref: '#/definitions/v1DeleteUserAccessTokenResponse' type: object
properties: {}
default: default:
description: An unexpected error response. description: An unexpected error response.
schema: schema:
@ -624,7 +626,7 @@ paths:
"200": "200":
description: A successful response. description: A successful response.
schema: schema:
$ref: '#/definitions/v1UpdateUserResponse' $ref: '#/definitions/v1User'
default: default:
description: An unexpected error response. description: An unexpected error response.
schema: schema:
@ -989,22 +991,8 @@ definitions:
properties: properties:
collection: collection:
$ref: '#/definitions/apiv1Collection' $ref: '#/definitions/apiv1Collection'
v1CreateUserAccessTokenResponse:
type: object
properties:
accessToken:
$ref: '#/definitions/v1UserAccessToken'
v1CreateUserResponse:
type: object
properties:
user:
$ref: '#/definitions/v1User'
v1DeleteCollectionResponse: v1DeleteCollectionResponse:
type: object type: object
v1DeleteUserAccessTokenResponse:
type: object
v1DeleteUserResponse:
type: object
v1GetCollectionByNameResponse: v1GetCollectionByNameResponse:
type: object type: object
properties: properties:
@ -1033,11 +1021,6 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/GetShortcutAnalyticsResponseAnalyticsItem' $ref: '#/definitions/GetShortcutAnalyticsResponseAnalyticsItem'
v1GetUserResponse:
type: object
properties:
user:
$ref: '#/definitions/v1User'
v1GetUserSettingResponse: v1GetUserSettingResponse:
type: object type: object
properties: properties:
@ -1142,11 +1125,6 @@ definitions:
type: string type: string
required: required:
- licenseKey - licenseKey
v1UpdateUserResponse:
type: object
properties:
user:
$ref: '#/definitions/v1User'
v1UpdateUserSettingResponse: v1UpdateUserSettingResponse:
type: object type: object
properties: properties:

View File

@ -10,6 +10,7 @@ import (
"golang.org/x/exp/slices" "golang.org/x/exp/slices"
"google.golang.org/grpc/codes" "google.golang.org/grpc/codes"
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/timestamppb"
v1pb "github.com/yourselfhosted/slash/proto/gen/api/v1" v1pb "github.com/yourselfhosted/slash/proto/gen/api/v1"
@ -38,7 +39,7 @@ func (s *APIV1Service) ListUsers(ctx context.Context, _ *v1pb.ListUsersRequest)
return response, nil return response, nil
} }
func (s *APIV1Service) GetUser(ctx context.Context, request *v1pb.GetUserRequest) (*v1pb.GetUserResponse, error) { func (s *APIV1Service) GetUser(ctx context.Context, request *v1pb.GetUserRequest) (*v1pb.User, error) {
user, err := s.Store.GetUser(ctx, &store.FindUser{ user, err := s.Store.GetUser(ctx, &store.FindUser{
ID: &request.Id, ID: &request.Id,
}) })
@ -48,15 +49,10 @@ func (s *APIV1Service) GetUser(ctx context.Context, request *v1pb.GetUserRequest
if user == nil { if user == nil {
return nil, status.Errorf(codes.NotFound, "user not found") return nil, status.Errorf(codes.NotFound, "user not found")
} }
return convertUserFromStore(user), nil
userMessage := convertUserFromStore(user)
response := &v1pb.GetUserResponse{
User: userMessage,
}
return response, nil
} }
func (s *APIV1Service) CreateUser(ctx context.Context, request *v1pb.CreateUserRequest) (*v1pb.CreateUserResponse, error) { func (s *APIV1Service) CreateUser(ctx context.Context, request *v1pb.CreateUserRequest) (*v1pb.User, error) {
passwordHash, err := bcrypt.GenerateFromPassword([]byte(request.User.Password), bcrypt.DefaultCost) passwordHash, err := bcrypt.GenerateFromPassword([]byte(request.User.Password), bcrypt.DefaultCost)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to hash password: %v", err) return nil, status.Errorf(codes.Internal, "failed to hash password: %v", err)
@ -75,13 +71,10 @@ func (s *APIV1Service) CreateUser(ctx context.Context, request *v1pb.CreateUserR
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to create user: %v", err) return nil, status.Errorf(codes.Internal, "failed to create user: %v", err)
} }
response := &v1pb.CreateUserResponse{ return convertUserFromStore(user), nil
User: convertUserFromStore(user),
}
return response, nil
} }
func (s *APIV1Service) UpdateUser(ctx context.Context, request *v1pb.UpdateUserRequest) (*v1pb.UpdateUserResponse, error) { func (s *APIV1Service) UpdateUser(ctx context.Context, request *v1pb.UpdateUserRequest) (*v1pb.User, error) {
user, err := getCurrentUser(ctx, s.Store) user, err := getCurrentUser(ctx, s.Store)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err) return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err)
@ -107,12 +100,10 @@ func (s *APIV1Service) UpdateUser(ctx context.Context, request *v1pb.UpdateUserR
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to update user: %v", err) return nil, status.Errorf(codes.Internal, "failed to update user: %v", err)
} }
return &v1pb.UpdateUserResponse{ return convertUserFromStore(user), nil
User: convertUserFromStore(user),
}, nil
} }
func (s *APIV1Service) DeleteUser(ctx context.Context, request *v1pb.DeleteUserRequest) (*v1pb.DeleteUserResponse, error) { func (s *APIV1Service) DeleteUser(ctx context.Context, request *v1pb.DeleteUserRequest) (*emptypb.Empty, error) {
user, err := getCurrentUser(ctx, s.Store) user, err := getCurrentUser(ctx, s.Store)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err) return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err)
@ -124,8 +115,7 @@ func (s *APIV1Service) DeleteUser(ctx context.Context, request *v1pb.DeleteUserR
if err := s.Store.DeleteUser(ctx, &store.DeleteUser{ID: request.Id}); err != nil { if err := s.Store.DeleteUser(ctx, &store.DeleteUser{ID: request.Id}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to delete user: %v", err) return nil, status.Errorf(codes.Internal, "failed to delete user: %v", err)
} }
response := &v1pb.DeleteUserResponse{} return &emptypb.Empty{}, nil
return response, nil
} }
func (s *APIV1Service) ListUserAccessTokens(ctx context.Context, request *v1pb.ListUserAccessTokensRequest) (*v1pb.ListUserAccessTokensResponse, error) { func (s *APIV1Service) ListUserAccessTokens(ctx context.Context, request *v1pb.ListUserAccessTokensRequest) (*v1pb.ListUserAccessTokensResponse, error) {
@ -182,7 +172,7 @@ func (s *APIV1Service) ListUserAccessTokens(ctx context.Context, request *v1pb.L
return response, nil return response, nil
} }
func (s *APIV1Service) CreateUserAccessToken(ctx context.Context, request *v1pb.CreateUserAccessTokenRequest) (*v1pb.CreateUserAccessTokenResponse, error) { func (s *APIV1Service) CreateUserAccessToken(ctx context.Context, request *v1pb.CreateUserAccessTokenRequest) (*v1pb.UserAccessToken, error) {
user, err := getCurrentUser(ctx, s.Store) user, err := getCurrentUser(ctx, s.Store)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err) return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err)
@ -229,13 +219,10 @@ func (s *APIV1Service) CreateUserAccessToken(ctx context.Context, request *v1pb.
if claims.ExpiresAt != nil { if claims.ExpiresAt != nil {
userAccessToken.ExpiresAt = timestamppb.New(claims.ExpiresAt.Time) userAccessToken.ExpiresAt = timestamppb.New(claims.ExpiresAt.Time)
} }
response := &v1pb.CreateUserAccessTokenResponse{ return userAccessToken, nil
AccessToken: userAccessToken,
}
return response, nil
} }
func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb.DeleteUserAccessTokenRequest) (*v1pb.DeleteUserAccessTokenResponse, error) { func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb.DeleteUserAccessTokenRequest) (*emptypb.Empty, error) {
user, err := getCurrentUser(ctx, s.Store) user, err := getCurrentUser(ctx, s.Store)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err) return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err)
@ -263,7 +250,7 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb.
return nil, status.Errorf(codes.Internal, "failed to upsert user setting: %v", err) return nil, status.Errorf(codes.Internal, "failed to upsert user setting: %v", err)
} }
return &v1pb.DeleteUserAccessTokenResponse{}, nil return &emptypb.Empty{}, nil
} }
func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store.User, accessToken, description string) error { func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store.User, accessToken, description string) error {