Commit dac059a7 authored by Steven's avatar Steven

refactor: identity provider service

parent 8d8e9b3b
...@@ -4,6 +4,8 @@ package memos.api.v1; ...@@ -4,6 +4,8 @@ package memos.api.v1;
import "google/api/annotations.proto"; import "google/api/annotations.proto";
import "google/api/client.proto"; import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/protobuf/empty.proto"; import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto"; import "google/protobuf/field_mask.proto";
...@@ -14,18 +16,22 @@ service IdentityProviderService { ...@@ -14,18 +16,22 @@ service IdentityProviderService {
rpc ListIdentityProviders(ListIdentityProvidersRequest) returns (ListIdentityProvidersResponse) { rpc ListIdentityProviders(ListIdentityProvidersRequest) returns (ListIdentityProvidersResponse) {
option (google.api.http) = {get: "/api/v1/identityProviders"}; option (google.api.http) = {get: "/api/v1/identityProviders"};
} }
// GetIdentityProvider gets an identity provider. // GetIdentityProvider gets an identity provider.
rpc GetIdentityProvider(GetIdentityProviderRequest) returns (IdentityProvider) { rpc GetIdentityProvider(GetIdentityProviderRequest) returns (IdentityProvider) {
option (google.api.http) = {get: "/api/v1/{name=identityProviders/*}"}; option (google.api.http) = {get: "/api/v1/{name=identityProviders/*}"};
option (google.api.method_signature) = "name"; option (google.api.method_signature) = "name";
} }
// CreateIdentityProvider creates an identity provider. // CreateIdentityProvider creates an identity provider.
rpc CreateIdentityProvider(CreateIdentityProviderRequest) returns (IdentityProvider) { rpc CreateIdentityProvider(CreateIdentityProviderRequest) returns (IdentityProvider) {
option (google.api.http) = { option (google.api.http) = {
post: "/api/v1/identityProviders" post: "/api/v1/identityProviders"
body: "identity_provider" body: "identity_provider"
}; };
option (google.api.method_signature) = "identity_provider";
} }
// UpdateIdentityProvider updates an identity provider. // UpdateIdentityProvider updates an identity provider.
rpc UpdateIdentityProvider(UpdateIdentityProviderRequest) returns (IdentityProvider) { rpc UpdateIdentityProvider(UpdateIdentityProviderRequest) returns (IdentityProvider) {
option (google.api.http) = { option (google.api.http) = {
...@@ -34,6 +40,7 @@ service IdentityProviderService { ...@@ -34,6 +40,7 @@ service IdentityProviderService {
}; };
option (google.api.method_signature) = "identity_provider,update_mask"; option (google.api.method_signature) = "identity_provider,update_mask";
} }
// DeleteIdentityProvider deletes an identity provider. // DeleteIdentityProvider deletes an identity provider.
rpc DeleteIdentityProvider(DeleteIdentityProviderRequest) returns (google.protobuf.Empty) { rpc DeleteIdentityProvider(DeleteIdentityProviderRequest) returns (google.protobuf.Empty) {
option (google.api.http) = {delete: "/api/v1/{name=identityProviders/*}"}; option (google.api.http) = {delete: "/api/v1/{name=identityProviders/*}"};
...@@ -42,21 +49,37 @@ service IdentityProviderService { ...@@ -42,21 +49,37 @@ service IdentityProviderService {
} }
message IdentityProvider { message IdentityProvider {
// The name of the identityProvider. option (google.api.resource) = {
// Format: identityProviders/{id}, id is the system generated auto-incremented id. type: "memos.api.v1/IdentityProvider"
string name = 1; pattern: "identityProviders/{idp}"
name_field: "name"
singular: "identityProvider"
plural: "identityProviders"
};
// The resource name of the identity provider.
// Format: identityProviders/{idp}
string name = 1 [(google.api.field_behavior) = IDENTIFIER];
// Output only. The system generated unique identifier.
string uid = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
// Required. The type of the identity provider.
Type type = 3 [(google.api.field_behavior) = REQUIRED];
// Required. The display title of the identity provider.
string title = 4 [(google.api.field_behavior) = REQUIRED];
// Optional. Filter applied to user identifiers.
string identifier_filter = 5 [(google.api.field_behavior) = OPTIONAL];
// Required. Configuration for the identity provider.
IdentityProviderConfig config = 6 [(google.api.field_behavior) = REQUIRED];
enum Type { enum Type {
TYPE_UNSPECIFIED = 0; TYPE_UNSPECIFIED = 0;
OAUTH2 = 1; OAUTH2 = 1;
} }
Type type = 2;
string title = 3;
string identifier_filter = 4;
IdentityProviderConfig config = 5;
} }
message IdentityProviderConfig { message IdentityProviderConfig {
...@@ -82,32 +105,54 @@ message OAuth2Config { ...@@ -82,32 +105,54 @@ message OAuth2Config {
FieldMapping field_mapping = 7; FieldMapping field_mapping = 7;
} }
message ListIdentityProvidersRequest {} message ListIdentityProvidersRequest {
// Optional. The maximum number of identity providers to return.
int32 page_size = 1 [(google.api.field_behavior) = OPTIONAL];
// Optional. A page token for pagination.
string page_token = 2 [(google.api.field_behavior) = OPTIONAL];
}
message ListIdentityProvidersResponse { message ListIdentityProvidersResponse {
// The list of identity providers.
repeated IdentityProvider identity_providers = 1; repeated IdentityProvider identity_providers = 1;
// A token for the next page of results.
string next_page_token = 2;
} }
message GetIdentityProviderRequest { message GetIdentityProviderRequest {
// The name of the identityProvider to get. // Required. The resource name of the identity provider to get.
string name = 1; // Format: identityProviders/{idp}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/IdentityProvider"}
];
} }
message CreateIdentityProviderRequest { message CreateIdentityProviderRequest {
// The identityProvider to create. // Required. The identity provider to create.
IdentityProvider identity_provider = 1; IdentityProvider identity_provider = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. The ID to use for the identity provider, which will become the final component of the resource name.
// If not provided, the system will generate one.
string identity_provider_id = 2 [(google.api.field_behavior) = OPTIONAL];
} }
message UpdateIdentityProviderRequest { message UpdateIdentityProviderRequest {
// The identityProvider to update. // Required. The identity provider to update.
IdentityProvider identity_provider = 1; IdentityProvider identity_provider = 1 [(google.api.field_behavior) = REQUIRED];
// The update mask applies to the resource. Only the top level fields of // Required. The update mask applies to the resource. Only the top level fields of
// IdentityProvider are supported. // IdentityProvider are supported.
google.protobuf.FieldMask update_mask = 2; google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
} }
message DeleteIdentityProviderRequest { message DeleteIdentityProviderRequest {
// The name of the identityProvider to delete. // Required. The resource name of the identity provider to delete.
string name = 1; // Format: identityProviders/{idp}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/IdentityProvider"}
];
} }
This diff is collapsed.
...@@ -35,12 +35,20 @@ var ( ...@@ -35,12 +35,20 @@ var (
_ = metadata.Join _ = metadata.Join
) )
var filter_IdentityProviderService_ListIdentityProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
func request_IdentityProviderService_ListIdentityProviders_0(ctx context.Context, marshaler runtime.Marshaler, client IdentityProviderServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_IdentityProviderService_ListIdentityProviders_0(ctx context.Context, marshaler runtime.Marshaler, client IdentityProviderServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq ListIdentityProvidersRequest protoReq ListIdentityProvidersRequest
metadata runtime.ServerMetadata metadata runtime.ServerMetadata
) )
io.Copy(io.Discard, req.Body) io.Copy(io.Discard, req.Body)
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_IdentityProviderService_ListIdentityProviders_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.ListIdentityProviders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.ListIdentityProviders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
...@@ -50,6 +58,12 @@ func local_request_IdentityProviderService_ListIdentityProviders_0(ctx context.C ...@@ -50,6 +58,12 @@ func local_request_IdentityProviderService_ListIdentityProviders_0(ctx context.C
protoReq ListIdentityProvidersRequest protoReq ListIdentityProvidersRequest
metadata runtime.ServerMetadata metadata runtime.ServerMetadata
) )
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_IdentityProviderService_ListIdentityProviders_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.ListIdentityProviders(ctx, &protoReq) msg, err := server.ListIdentityProviders(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
...@@ -91,6 +105,8 @@ func local_request_IdentityProviderService_GetIdentityProvider_0(ctx context.Con ...@@ -91,6 +105,8 @@ func local_request_IdentityProviderService_GetIdentityProvider_0(ctx context.Con
return msg, metadata, err return msg, metadata, err
} }
var filter_IdentityProviderService_CreateIdentityProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"identity_provider": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
func request_IdentityProviderService_CreateIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, client IdentityProviderServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_IdentityProviderService_CreateIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, client IdentityProviderServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq CreateIdentityProviderRequest protoReq CreateIdentityProviderRequest
...@@ -99,6 +115,12 @@ func request_IdentityProviderService_CreateIdentityProvider_0(ctx context.Contex ...@@ -99,6 +115,12 @@ func request_IdentityProviderService_CreateIdentityProvider_0(ctx context.Contex
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.IdentityProvider); err != nil && !errors.Is(err, io.EOF) { if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.IdentityProvider); err != nil && !errors.Is(err, io.EOF) {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_IdentityProviderService_CreateIdentityProvider_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.CreateIdentityProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.CreateIdentityProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
...@@ -111,6 +133,12 @@ func local_request_IdentityProviderService_CreateIdentityProvider_0(ctx context. ...@@ -111,6 +133,12 @@ func local_request_IdentityProviderService_CreateIdentityProvider_0(ctx context.
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.IdentityProvider); err != nil && !errors.Is(err, io.EOF) { if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.IdentityProvider); err != nil && !errors.Is(err, io.EOF) {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_IdentityProviderService_CreateIdentityProvider_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.CreateIdentityProvider(ctx, &protoReq) msg, err := server.CreateIdentityProvider(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
......
...@@ -136,6 +136,18 @@ paths: ...@@ -136,6 +136,18 @@ paths:
description: An unexpected error response. description: An unexpected error response.
schema: schema:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters:
- name: pageSize
description: Optional. The maximum number of identity providers to return.
in: query
required: false
type: integer
format: int32
- name: pageToken
description: Optional. A page token for pagination.
in: query
required: false
type: string
tags: tags:
- IdentityProviderService - IdentityProviderService
post: post:
...@@ -152,11 +164,20 @@ paths: ...@@ -152,11 +164,20 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: identityProvider - name: identityProvider
description: The identityProvider to create. description: Required. The identity provider to create.
in: body in: body
required: true required: true
schema: schema:
$ref: '#/definitions/apiv1IdentityProvider' $ref: '#/definitions/apiv1IdentityProvider'
required:
- identityProvider
- name: identityProviderId
description: |-
Optional. The ID to use for the identity provider, which will become the final component of the resource name.
If not provided, the system will generate one.
in: query
required: false
type: string
tags: tags:
- IdentityProviderService - IdentityProviderService
/api/v1/inboxes: /api/v1/inboxes:
...@@ -722,28 +743,41 @@ paths: ...@@ -722,28 +743,41 @@ paths:
parameters: parameters:
- name: identityProvider.name - name: identityProvider.name
description: |- description: |-
The name of the identityProvider. The resource name of the identity provider.
Format: identityProviders/{id}, id is the system generated auto-incremented id. Format: identityProviders/{idp}
in: path in: path
required: true required: true
type: string type: string
pattern: identityProviders/[^/]+ pattern: identityProviders/[^/]+
- name: identityProvider - name: identityProvider
description: The identityProvider to update. description: Required. The identity provider to update.
in: body in: body
required: true required: true
schema: schema:
type: object type: object
properties: properties:
uid:
type: string
description: Output only. The system generated unique identifier.
readOnly: true
type: type:
$ref: '#/definitions/apiv1IdentityProviderType' $ref: '#/definitions/apiv1IdentityProviderType'
description: Required. The type of the identity provider.
title: title:
type: string type: string
description: Required. The display title of the identity provider.
identifierFilter: identifierFilter:
type: string type: string
description: Optional. Filter applied to user identifiers.
config: config:
$ref: '#/definitions/apiv1IdentityProviderConfig' $ref: '#/definitions/apiv1IdentityProviderConfig'
title: The identityProvider to update. description: Required. Configuration for the identity provider.
title: Required. The identity provider to update.
required:
- type
- title
- config
- identityProvider
tags: tags:
- IdentityProviderService - IdentityProviderService
/api/v1/{inbox.name}: /api/v1/{inbox.name}:
...@@ -965,7 +999,9 @@ paths: ...@@ -965,7 +999,9 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name_2 - name: name_2
description: The name of the identityProvider to get. description: |-
Required. The resource name of the identity provider to get.
Format: identityProviders/{idp}
in: path in: path
required: true required: true
type: string type: string
...@@ -987,7 +1023,9 @@ paths: ...@@ -987,7 +1023,9 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name_2 - name: name_2
description: The name of the identityProvider to delete. description: |-
Required. The resource name of the identity provider to delete.
Format: identityProviders/{idp}
in: path in: path
required: true required: true
type: string type: string
...@@ -2394,17 +2432,29 @@ definitions: ...@@ -2394,17 +2432,29 @@ definitions:
properties: properties:
name: name:
type: string type: string
description: |- title: |-
The name of the identityProvider. The resource name of the identity provider.
Format: identityProviders/{id}, id is the system generated auto-incremented id. Format: identityProviders/{idp}
uid:
type: string
description: Output only. The system generated unique identifier.
readOnly: true
type: type:
$ref: '#/definitions/apiv1IdentityProviderType' $ref: '#/definitions/apiv1IdentityProviderType'
description: Required. The type of the identity provider.
title: title:
type: string type: string
description: Required. The display title of the identity provider.
identifierFilter: identifierFilter:
type: string type: string
description: Optional. Filter applied to user identifiers.
config: config:
$ref: '#/definitions/apiv1IdentityProviderConfig' $ref: '#/definitions/apiv1IdentityProviderConfig'
description: Required. Configuration for the identity provider.
required:
- type
- title
- config
apiv1IdentityProviderConfig: apiv1IdentityProviderConfig:
type: object type: object
properties: properties:
...@@ -3036,6 +3086,10 @@ definitions: ...@@ -3036,6 +3086,10 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/apiv1IdentityProvider' $ref: '#/definitions/apiv1IdentityProvider'
description: The list of identity providers.
nextPageToken:
type: string
description: A token for the next page of results.
v1ListInboxesResponse: v1ListInboxesResponse:
type: object type: object
properties: properties:
......
...@@ -106,6 +106,7 @@ func (s *APIV1Service) DeleteIdentityProvider(ctx context.Context, request *v1pb ...@@ -106,6 +106,7 @@ func (s *APIV1Service) DeleteIdentityProvider(ctx context.Context, request *v1pb
func convertIdentityProviderFromStore(identityProvider *storepb.IdentityProvider) *v1pb.IdentityProvider { func convertIdentityProviderFromStore(identityProvider *storepb.IdentityProvider) *v1pb.IdentityProvider {
temp := &v1pb.IdentityProvider{ temp := &v1pb.IdentityProvider{
Name: fmt.Sprintf("%s%d", IdentityProviderNamePrefix, identityProvider.Id), Name: fmt.Sprintf("%s%d", IdentityProviderNamePrefix, identityProvider.Id),
Uid: fmt.Sprintf("%d", identityProvider.Id),
Title: identityProvider.Name, Title: identityProvider.Name,
IdentifierFilter: identityProvider.IdentifierFilter, IdentifierFilter: identityProvider.IdentifierFilter,
Type: v1pb.IdentityProvider_Type(v1pb.IdentityProvider_Type_value[identityProvider.Type.String()]), Type: v1pb.IdentityProvider_Type(v1pb.IdentityProvider_Type_value[identityProvider.Type.String()]),
......
...@@ -12,6 +12,7 @@ import { generateDialog } from "./Dialog"; ...@@ -12,6 +12,7 @@ import { generateDialog } from "./Dialog";
const templateList: IdentityProvider[] = [ const templateList: IdentityProvider[] = [
{ {
name: "", name: "",
uid: "",
title: "GitHub", title: "GitHub",
type: IdentityProvider_Type.OAUTH2, type: IdentityProvider_Type.OAUTH2,
identifierFilter: "", identifierFilter: "",
...@@ -33,6 +34,7 @@ const templateList: IdentityProvider[] = [ ...@@ -33,6 +34,7 @@ const templateList: IdentityProvider[] = [
}, },
{ {
name: "", name: "",
uid: "",
title: "GitLab", title: "GitLab",
type: IdentityProvider_Type.OAUTH2, type: IdentityProvider_Type.OAUTH2,
identifierFilter: "", identifierFilter: "",
...@@ -54,6 +56,7 @@ const templateList: IdentityProvider[] = [ ...@@ -54,6 +56,7 @@ const templateList: IdentityProvider[] = [
}, },
{ {
name: "", name: "",
uid: "",
title: "Google", title: "Google",
type: IdentityProvider_Type.OAUTH2, type: IdentityProvider_Type.OAUTH2,
identifierFilter: "", identifierFilter: "",
...@@ -75,6 +78,7 @@ const templateList: IdentityProvider[] = [ ...@@ -75,6 +78,7 @@ const templateList: IdentityProvider[] = [
}, },
{ {
name: "", name: "",
uid: "",
title: "Custom", title: "Custom",
type: IdentityProvider_Type.OAUTH2, type: IdentityProvider_Type.OAUTH2,
identifierFilter: "", identifierFilter: "",
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment