16 Commits
v1.0.0 ... main

Author SHA1 Message Date
Дмитрий
d5472083d6 add media proto paths
All checks were successful
Publish / Publish Job (push) Successful in 2m3s
2026-05-08 17:22:59 +03:00
Дмитрий
c56ff16cde change tag version 2026-05-08 17:16:35 +03:00
github-actions[bot]
d32f0f2c77 chore: auto-generate protobuf files [skip ci] 2026-05-08 13:24:32 +00:00
Дмитрий
04bfccb868 add media proto file
All checks were successful
Publish / Publish Job (push) Successful in 2m23s
2026-05-08 16:22:10 +03:00
github-actions[bot]
1ce76254e5 chore: auto-generate protobuf files [skip ci] 2026-05-08 12:36:58 +00:00
Дмитрий
2733943488 add check membership for chat proto
All checks were successful
Publish / Publish Job (push) Successful in 2m27s
2026-05-08 15:34:31 +03:00
github-actions[bot]
e1ca345e38 chore: auto-generate protobuf files [skip ci] 2026-04-23 09:36:26 +00:00
Дмитрий
cbc5dd3551 add oauth methods for developers
All checks were successful
Publish / Publish Job (push) Successful in 2m30s
2026-04-23 12:33:59 +03:00
github-actions[bot]
ae86764d43 chore: auto-generate protobuf files [skip ci] 2026-04-23 07:49:02 +00:00
Дмитрий
5847a6e560 add oauth proto file
All checks were successful
Publish / Publish Job (push) Successful in 2m30s
2026-04-23 10:46:34 +03:00
github-actions[bot]
28f8834c7b chore: auto-generate protobuf files [skip ci] 2026-04-21 15:40:11 +00:00
lendry
d6f8906f22 oauth add GenerateOauthCodeRequest
All checks were successful
Publish / Publish Job (push) Successful in 2m32s
2026-04-21 18:36:24 +03:00
lendry
0f12ea6451 Merge branch 'main' of https://git.lendry.ru/lendry-erp/contracts
All checks were successful
Publish / Publish Job (push) Successful in 2m40s
2026-04-21 16:25:42 +03:00
lendry
e5d52ab0ba add oauth 2026-04-21 16:20:45 +03:00
github-actions[bot]
061cc7a928 chore: auto-generate protobuf files [skip ci] 2026-04-21 13:17:22 +00:00
656f90d11f main commit
Some checks failed
Publish / Publish Job (push) Failing after 2m43s
2026-04-21 13:10:57 +00:00
29 changed files with 2600 additions and 97 deletions

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: admin/admin-account.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: admin/audit.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: admin/rbac.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: chat/chat.proto
@@ -173,6 +173,15 @@ export interface MarkAsReadResponse {
success: boolean;
}
export interface CheckChatMembershipRequest {
userId: string;
chatId: string;
}
export interface CheckChatMembershipResponse {
isMember: boolean;
}
export const CHAT_V1_PACKAGE_NAME = "chat.v1";
export interface ChatServiceClient {
@@ -215,6 +224,11 @@ export interface ChatServiceClient {
/** Статусы */
markAsRead(request: MarkAsReadRequest, metadata?: Metadata): Observable<MarkAsReadResponse>;
checkChatMembership(
request: CheckChatMembershipRequest,
metadata?: Metadata,
): Observable<CheckChatMembershipResponse>;
}
export interface ChatServiceController {
@@ -293,6 +307,11 @@ export interface ChatServiceController {
request: MarkAsReadRequest,
metadata?: Metadata,
): Promise<MarkAsReadResponse> | Observable<MarkAsReadResponse> | MarkAsReadResponse;
checkChatMembership(
request: CheckChatMembershipRequest,
metadata?: Metadata,
): Promise<CheckChatMembershipResponse> | Observable<CheckChatMembershipResponse> | CheckChatMembershipResponse;
}
export function ChatServiceControllerMethods() {
@@ -310,6 +329,7 @@ export function ChatServiceControllerMethods() {
"editMessage",
"deleteMessage",
"markAsRead",
"checkChatMembership",
];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);

View File

@@ -1474,6 +1474,102 @@ func (x *MarkAsReadResponse) GetSuccess() bool {
return false
}
type CheckChatMembershipRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
ChatId string `protobuf:"bytes,2,opt,name=chat_id,json=chatId,proto3" json:"chat_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *CheckChatMembershipRequest) Reset() {
*x = CheckChatMembershipRequest{}
mi := &file_chat_chat_proto_msgTypes[25]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *CheckChatMembershipRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CheckChatMembershipRequest) ProtoMessage() {}
func (x *CheckChatMembershipRequest) ProtoReflect() protoreflect.Message {
mi := &file_chat_chat_proto_msgTypes[25]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use CheckChatMembershipRequest.ProtoReflect.Descriptor instead.
func (*CheckChatMembershipRequest) Descriptor() ([]byte, []int) {
return file_chat_chat_proto_rawDescGZIP(), []int{25}
}
func (x *CheckChatMembershipRequest) GetUserId() string {
if x != nil {
return x.UserId
}
return ""
}
func (x *CheckChatMembershipRequest) GetChatId() string {
if x != nil {
return x.ChatId
}
return ""
}
type CheckChatMembershipResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
IsMember bool `protobuf:"varint,1,opt,name=is_member,json=isMember,proto3" json:"is_member,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *CheckChatMembershipResponse) Reset() {
*x = CheckChatMembershipResponse{}
mi := &file_chat_chat_proto_msgTypes[26]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *CheckChatMembershipResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CheckChatMembershipResponse) ProtoMessage() {}
func (x *CheckChatMembershipResponse) ProtoReflect() protoreflect.Message {
mi := &file_chat_chat_proto_msgTypes[26]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use CheckChatMembershipResponse.ProtoReflect.Descriptor instead.
func (*CheckChatMembershipResponse) Descriptor() ([]byte, []int) {
return file_chat_chat_proto_rawDescGZIP(), []int{26}
}
func (x *CheckChatMembershipResponse) GetIsMember() bool {
if x != nil {
return x.IsMember
}
return false
}
var File_chat_chat_proto protoreflect.FileDescriptor
const file_chat_chat_proto_rawDesc = "" +
@@ -1581,7 +1677,12 @@ const file_chat_chat_proto_rawDesc = "" +
"\n" +
"message_id\x18\x03 \x01(\tR\tmessageId\".\n" +
"\x12MarkAsReadResponse\x12\x18\n" +
"\asuccess\x18\x01 \x01(\bR\asuccess2\xea\x06\n" +
"\asuccess\x18\x01 \x01(\bR\asuccess\"N\n" +
"\x1aCheckChatMembershipRequest\x12\x17\n" +
"\auser_id\x18\x01 \x01(\tR\x06userId\x12\x17\n" +
"\achat_id\x18\x02 \x01(\tR\x06chatId\":\n" +
"\x1bCheckChatMembershipResponse\x12\x1b\n" +
"\tis_member\x18\x01 \x01(\bR\bisMember2\xcc\a\n" +
"\vChatService\x12E\n" +
"\n" +
"CreateChat\x12\x1a.chat.v1.CreateChatRequest\x1a\x1b.chat.v1.CreateChatResponse\x12K\n" +
@@ -1596,7 +1697,8 @@ const file_chat_chat_proto_rawDesc = "" +
"\vEditMessage\x12\x1b.chat.v1.EditMessageRequest\x1a\x13.chat.v1.MessageDto\x12N\n" +
"\rDeleteMessage\x12\x1d.chat.v1.DeleteMessageRequest\x1a\x1e.chat.v1.DeleteMessageResponse\x12E\n" +
"\n" +
"MarkAsRead\x12\x1a.chat.v1.MarkAsReadRequest\x1a\x1b.chat.v1.MarkAsReadResponseB*Z(git.lendry.ru/lendry-erp/proto.git/go;pbb\x06proto3"
"MarkAsRead\x12\x1a.chat.v1.MarkAsReadRequest\x1a\x1b.chat.v1.MarkAsReadResponse\x12`\n" +
"\x13CheckChatMembership\x12#.chat.v1.CheckChatMembershipRequest\x1a$.chat.v1.CheckChatMembershipResponseB*Z(git.lendry.ru/lendry-erp/proto.git/go;pbb\x06proto3"
var (
file_chat_chat_proto_rawDescOnce sync.Once
@@ -1610,7 +1712,7 @@ func file_chat_chat_proto_rawDescGZIP() []byte {
return file_chat_chat_proto_rawDescData
}
var file_chat_chat_proto_msgTypes = make([]protoimpl.MessageInfo, 25)
var file_chat_chat_proto_msgTypes = make([]protoimpl.MessageInfo, 27)
var file_chat_chat_proto_goTypes = []any{
(*MessageDto)(nil), // 0: chat.v1.MessageDto
(*ChatMemberDto)(nil), // 1: chat.v1.ChatMemberDto
@@ -1637,6 +1739,8 @@ var file_chat_chat_proto_goTypes = []any{
(*DeleteMessageResponse)(nil), // 22: chat.v1.DeleteMessageResponse
(*MarkAsReadRequest)(nil), // 23: chat.v1.MarkAsReadRequest
(*MarkAsReadResponse)(nil), // 24: chat.v1.MarkAsReadResponse
(*CheckChatMembershipRequest)(nil), // 25: chat.v1.CheckChatMembershipRequest
(*CheckChatMembershipResponse)(nil), // 26: chat.v1.CheckChatMembershipResponse
}
var file_chat_chat_proto_depIdxs = []int32{
0, // 0: chat.v1.ChatDto.last_message:type_name -> chat.v1.MessageDto
@@ -1657,20 +1761,22 @@ var file_chat_chat_proto_depIdxs = []int32{
20, // 15: chat.v1.ChatService.EditMessage:input_type -> chat.v1.EditMessageRequest
21, // 16: chat.v1.ChatService.DeleteMessage:input_type -> chat.v1.DeleteMessageRequest
23, // 17: chat.v1.ChatService.MarkAsRead:input_type -> chat.v1.MarkAsReadRequest
4, // 18: chat.v1.ChatService.CreateChat:output_type -> chat.v1.CreateChatResponse
6, // 19: chat.v1.ChatService.GetUserChats:output_type -> chat.v1.GetUserChatsResponse
8, // 20: chat.v1.ChatService.GetChatDetails:output_type -> chat.v1.GetChatDetailsResponse
10, // 21: chat.v1.ChatService.JoinChat:output_type -> chat.v1.JoinChatResponse
12, // 22: chat.v1.ChatService.LeaveChat:output_type -> chat.v1.LeaveChatResponse
14, // 23: chat.v1.ChatService.RemoveMember:output_type -> chat.v1.RemoveMemberResponse
16, // 24: chat.v1.ChatService.MuteChat:output_type -> chat.v1.MuteChatResponse
18, // 25: chat.v1.ChatService.GetMessages:output_type -> chat.v1.GetMessagesResponse
0, // 26: chat.v1.ChatService.SendMessage:output_type -> chat.v1.MessageDto
0, // 27: chat.v1.ChatService.EditMessage:output_type -> chat.v1.MessageDto
22, // 28: chat.v1.ChatService.DeleteMessage:output_type -> chat.v1.DeleteMessageResponse
24, // 29: chat.v1.ChatService.MarkAsRead:output_type -> chat.v1.MarkAsReadResponse
18, // [18:30] is the sub-list for method output_type
6, // [6:18] is the sub-list for method input_type
25, // 18: chat.v1.ChatService.CheckChatMembership:input_type -> chat.v1.CheckChatMembershipRequest
4, // 19: chat.v1.ChatService.CreateChat:output_type -> chat.v1.CreateChatResponse
6, // 20: chat.v1.ChatService.GetUserChats:output_type -> chat.v1.GetUserChatsResponse
8, // 21: chat.v1.ChatService.GetChatDetails:output_type -> chat.v1.GetChatDetailsResponse
10, // 22: chat.v1.ChatService.JoinChat:output_type -> chat.v1.JoinChatResponse
12, // 23: chat.v1.ChatService.LeaveChat:output_type -> chat.v1.LeaveChatResponse
14, // 24: chat.v1.ChatService.RemoveMember:output_type -> chat.v1.RemoveMemberResponse
16, // 25: chat.v1.ChatService.MuteChat:output_type -> chat.v1.MuteChatResponse
18, // 26: chat.v1.ChatService.GetMessages:output_type -> chat.v1.GetMessagesResponse
0, // 27: chat.v1.ChatService.SendMessage:output_type -> chat.v1.MessageDto
0, // 28: chat.v1.ChatService.EditMessage:output_type -> chat.v1.MessageDto
22, // 29: chat.v1.ChatService.DeleteMessage:output_type -> chat.v1.DeleteMessageResponse
24, // 30: chat.v1.ChatService.MarkAsRead:output_type -> chat.v1.MarkAsReadResponse
26, // 31: chat.v1.ChatService.CheckChatMembership:output_type -> chat.v1.CheckChatMembershipResponse
19, // [19:32] is the sub-list for method output_type
6, // [6:19] is the sub-list for method input_type
6, // [6:6] is the sub-list for extension type_name
6, // [6:6] is the sub-list for extension extendee
0, // [0:6] is the sub-list for field type_name
@@ -1687,7 +1793,7 @@ func file_chat_chat_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_chat_chat_proto_rawDesc), len(file_chat_chat_proto_rawDesc)),
NumEnums: 0,
NumMessages: 25,
NumMessages: 27,
NumExtensions: 0,
NumServices: 1,
},

View File

@@ -31,6 +31,7 @@ const (
ChatService_EditMessage_FullMethodName = "/chat.v1.ChatService/EditMessage"
ChatService_DeleteMessage_FullMethodName = "/chat.v1.ChatService/DeleteMessage"
ChatService_MarkAsRead_FullMethodName = "/chat.v1.ChatService/MarkAsRead"
ChatService_CheckChatMembership_FullMethodName = "/chat.v1.ChatService/CheckChatMembership"
)
// ChatServiceClient is the client API for ChatService service.
@@ -53,6 +54,7 @@ type ChatServiceClient interface {
DeleteMessage(ctx context.Context, in *DeleteMessageRequest, opts ...grpc.CallOption) (*DeleteMessageResponse, error)
// Статусы
MarkAsRead(ctx context.Context, in *MarkAsReadRequest, opts ...grpc.CallOption) (*MarkAsReadResponse, error)
CheckChatMembership(ctx context.Context, in *CheckChatMembershipRequest, opts ...grpc.CallOption) (*CheckChatMembershipResponse, error)
}
type chatServiceClient struct {
@@ -183,6 +185,16 @@ func (c *chatServiceClient) MarkAsRead(ctx context.Context, in *MarkAsReadReques
return out, nil
}
func (c *chatServiceClient) CheckChatMembership(ctx context.Context, in *CheckChatMembershipRequest, opts ...grpc.CallOption) (*CheckChatMembershipResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(CheckChatMembershipResponse)
err := c.cc.Invoke(ctx, ChatService_CheckChatMembership_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
// ChatServiceServer is the server API for ChatService service.
// All implementations must embed UnimplementedChatServiceServer
// for forward compatibility.
@@ -203,6 +215,7 @@ type ChatServiceServer interface {
DeleteMessage(context.Context, *DeleteMessageRequest) (*DeleteMessageResponse, error)
// Статусы
MarkAsRead(context.Context, *MarkAsReadRequest) (*MarkAsReadResponse, error)
CheckChatMembership(context.Context, *CheckChatMembershipRequest) (*CheckChatMembershipResponse, error)
mustEmbedUnimplementedChatServiceServer()
}
@@ -249,6 +262,9 @@ func (UnimplementedChatServiceServer) DeleteMessage(context.Context, *DeleteMess
func (UnimplementedChatServiceServer) MarkAsRead(context.Context, *MarkAsReadRequest) (*MarkAsReadResponse, error) {
return nil, status.Error(codes.Unimplemented, "method MarkAsRead not implemented")
}
func (UnimplementedChatServiceServer) CheckChatMembership(context.Context, *CheckChatMembershipRequest) (*CheckChatMembershipResponse, error) {
return nil, status.Error(codes.Unimplemented, "method CheckChatMembership not implemented")
}
func (UnimplementedChatServiceServer) mustEmbedUnimplementedChatServiceServer() {}
func (UnimplementedChatServiceServer) testEmbeddedByValue() {}
@@ -486,6 +502,24 @@ func _ChatService_MarkAsRead_Handler(srv interface{}, ctx context.Context, dec f
return interceptor(ctx, in, info, handler)
}
func _ChatService_CheckChatMembership_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CheckChatMembershipRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ChatServiceServer).CheckChatMembership(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: ChatService_CheckChatMembership_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ChatServiceServer).CheckChatMembership(ctx, req.(*CheckChatMembershipRequest))
}
return interceptor(ctx, in, info, handler)
}
// ChatService_ServiceDesc is the grpc.ServiceDesc for ChatService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
@@ -541,6 +575,10 @@ var ChatService_ServiceDesc = grpc.ServiceDesc{
MethodName: "MarkAsRead",
Handler: _ChatService_MarkAsRead_Handler,
},
{
MethodName: "CheckChatMembership",
Handler: _ChatService_CheckChatMembership_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "chat/chat.proto",

308
gen/go/media/media.pb.go Normal file
View File

@@ -0,0 +1,308 @@
// contracts/proto/media/v1/media.proto
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.11
// protoc v4.25.9
// source: media/media.proto
package pb
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type UploadRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` // Сами байты файла
Mode string `protobuf:"bytes,3,opt,name=mode,proto3" json:"mode,omitempty"` // "avatar", "chat", "raw"
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UploadRequest) Reset() {
*x = UploadRequest{}
mi := &file_media_media_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UploadRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UploadRequest) ProtoMessage() {}
func (x *UploadRequest) ProtoReflect() protoreflect.Message {
mi := &file_media_media_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use UploadRequest.ProtoReflect.Descriptor instead.
func (*UploadRequest) Descriptor() ([]byte, []int) {
return file_media_media_proto_rawDescGZIP(), []int{0}
}
func (x *UploadRequest) GetFileName() string {
if x != nil {
return x.FileName
}
return ""
}
func (x *UploadRequest) GetData() []byte {
if x != nil {
return x.Data
}
return nil
}
func (x *UploadRequest) GetMode() string {
if x != nil {
return x.Mode
}
return ""
}
type UploadResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UploadResponse) Reset() {
*x = UploadResponse{}
mi := &file_media_media_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UploadResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UploadResponse) ProtoMessage() {}
func (x *UploadResponse) ProtoReflect() protoreflect.Message {
mi := &file_media_media_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use UploadResponse.ProtoReflect.Descriptor instead.
func (*UploadResponse) Descriptor() ([]byte, []int) {
return file_media_media_proto_rawDescGZIP(), []int{1}
}
func (x *UploadResponse) GetFileName() string {
if x != nil {
return x.FileName
}
return ""
}
func (x *UploadResponse) GetSize() int64 {
if x != nil {
return x.Size
}
return 0
}
type GetPresignedUrlRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
IsPublic bool `protobuf:"varint,2,opt,name=is_public,json=isPublic,proto3" json:"is_public,omitempty"` // Если true, ссылка живет 24 часа, иначе 2 минуты
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetPresignedUrlRequest) Reset() {
*x = GetPresignedUrlRequest{}
mi := &file_media_media_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetPresignedUrlRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetPresignedUrlRequest) ProtoMessage() {}
func (x *GetPresignedUrlRequest) ProtoReflect() protoreflect.Message {
mi := &file_media_media_proto_msgTypes[2]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetPresignedUrlRequest.ProtoReflect.Descriptor instead.
func (*GetPresignedUrlRequest) Descriptor() ([]byte, []int) {
return file_media_media_proto_rawDescGZIP(), []int{2}
}
func (x *GetPresignedUrlRequest) GetFileName() string {
if x != nil {
return x.FileName
}
return ""
}
func (x *GetPresignedUrlRequest) GetIsPublic() bool {
if x != nil {
return x.IsPublic
}
return false
}
type GetPresignedUrlResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetPresignedUrlResponse) Reset() {
*x = GetPresignedUrlResponse{}
mi := &file_media_media_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetPresignedUrlResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetPresignedUrlResponse) ProtoMessage() {}
func (x *GetPresignedUrlResponse) ProtoReflect() protoreflect.Message {
mi := &file_media_media_proto_msgTypes[3]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetPresignedUrlResponse.ProtoReflect.Descriptor instead.
func (*GetPresignedUrlResponse) Descriptor() ([]byte, []int) {
return file_media_media_proto_rawDescGZIP(), []int{3}
}
func (x *GetPresignedUrlResponse) GetUrl() string {
if x != nil {
return x.Url
}
return ""
}
var File_media_media_proto protoreflect.FileDescriptor
const file_media_media_proto_rawDesc = "" +
"\n" +
"\x11media/media.proto\x12\bmedia.v1\"T\n" +
"\rUploadRequest\x12\x1b\n" +
"\tfile_name\x18\x01 \x01(\tR\bfileName\x12\x12\n" +
"\x04data\x18\x02 \x01(\fR\x04data\x12\x12\n" +
"\x04mode\x18\x03 \x01(\tR\x04mode\"A\n" +
"\x0eUploadResponse\x12\x1b\n" +
"\tfile_name\x18\x01 \x01(\tR\bfileName\x12\x12\n" +
"\x04size\x18\x02 \x01(\x03R\x04size\"R\n" +
"\x16GetPresignedUrlRequest\x12\x1b\n" +
"\tfile_name\x18\x01 \x01(\tR\bfileName\x12\x1b\n" +
"\tis_public\x18\x02 \x01(\bR\bisPublic\"+\n" +
"\x17GetPresignedUrlResponse\x12\x10\n" +
"\x03url\x18\x01 \x01(\tR\x03url2\xa3\x01\n" +
"\fMediaService\x12;\n" +
"\x06Upload\x12\x17.media.v1.UploadRequest\x1a\x18.media.v1.UploadResponse\x12V\n" +
"\x0fGetPresignedUrl\x12 .media.v1.GetPresignedUrlRequest\x1a!.media.v1.GetPresignedUrlResponseB*Z(git.lendry.ru/lendry-erp/proto.git/go;pbb\x06proto3"
var (
file_media_media_proto_rawDescOnce sync.Once
file_media_media_proto_rawDescData []byte
)
func file_media_media_proto_rawDescGZIP() []byte {
file_media_media_proto_rawDescOnce.Do(func() {
file_media_media_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_media_media_proto_rawDesc), len(file_media_media_proto_rawDesc)))
})
return file_media_media_proto_rawDescData
}
var file_media_media_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_media_media_proto_goTypes = []any{
(*UploadRequest)(nil), // 0: media.v1.UploadRequest
(*UploadResponse)(nil), // 1: media.v1.UploadResponse
(*GetPresignedUrlRequest)(nil), // 2: media.v1.GetPresignedUrlRequest
(*GetPresignedUrlResponse)(nil), // 3: media.v1.GetPresignedUrlResponse
}
var file_media_media_proto_depIdxs = []int32{
0, // 0: media.v1.MediaService.Upload:input_type -> media.v1.UploadRequest
2, // 1: media.v1.MediaService.GetPresignedUrl:input_type -> media.v1.GetPresignedUrlRequest
1, // 2: media.v1.MediaService.Upload:output_type -> media.v1.UploadResponse
3, // 3: media.v1.MediaService.GetPresignedUrl:output_type -> media.v1.GetPresignedUrlResponse
2, // [2:4] is the sub-list for method output_type
0, // [0:2] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_media_media_proto_init() }
func file_media_media_proto_init() {
if File_media_media_proto != nil {
return
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_media_media_proto_rawDesc), len(file_media_media_proto_rawDesc)),
NumEnums: 0,
NumMessages: 4,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_media_media_proto_goTypes,
DependencyIndexes: file_media_media_proto_depIdxs,
MessageInfos: file_media_media_proto_msgTypes,
}.Build()
File_media_media_proto = out.File
file_media_media_proto_goTypes = nil
file_media_media_proto_depIdxs = nil
}

View File

@@ -0,0 +1,165 @@
// contracts/proto/media/v1/media.proto
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.6.1
// - protoc v4.25.9
// source: media/media.proto
package pb
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.64.0 or later.
const _ = grpc.SupportPackageIsVersion9
const (
MediaService_Upload_FullMethodName = "/media.v1.MediaService/Upload"
MediaService_GetPresignedUrl_FullMethodName = "/media.v1.MediaService/GetPresignedUrl"
)
// MediaServiceClient is the client API for MediaService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type MediaServiceClient interface {
// Загрузка файла
Upload(ctx context.Context, in *UploadRequest, opts ...grpc.CallOption) (*UploadResponse, error)
// Генерация временной ссылки для скачивания/просмотра
GetPresignedUrl(ctx context.Context, in *GetPresignedUrlRequest, opts ...grpc.CallOption) (*GetPresignedUrlResponse, error)
}
type mediaServiceClient struct {
cc grpc.ClientConnInterface
}
func NewMediaServiceClient(cc grpc.ClientConnInterface) MediaServiceClient {
return &mediaServiceClient{cc}
}
func (c *mediaServiceClient) Upload(ctx context.Context, in *UploadRequest, opts ...grpc.CallOption) (*UploadResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(UploadResponse)
err := c.cc.Invoke(ctx, MediaService_Upload_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *mediaServiceClient) GetPresignedUrl(ctx context.Context, in *GetPresignedUrlRequest, opts ...grpc.CallOption) (*GetPresignedUrlResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetPresignedUrlResponse)
err := c.cc.Invoke(ctx, MediaService_GetPresignedUrl_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
// MediaServiceServer is the server API for MediaService service.
// All implementations must embed UnimplementedMediaServiceServer
// for forward compatibility.
type MediaServiceServer interface {
// Загрузка файла
Upload(context.Context, *UploadRequest) (*UploadResponse, error)
// Генерация временной ссылки для скачивания/просмотра
GetPresignedUrl(context.Context, *GetPresignedUrlRequest) (*GetPresignedUrlResponse, error)
mustEmbedUnimplementedMediaServiceServer()
}
// UnimplementedMediaServiceServer must be embedded to have
// forward compatible implementations.
//
// NOTE: this should be embedded by value instead of pointer to avoid a nil
// pointer dereference when methods are called.
type UnimplementedMediaServiceServer struct{}
func (UnimplementedMediaServiceServer) Upload(context.Context, *UploadRequest) (*UploadResponse, error) {
return nil, status.Error(codes.Unimplemented, "method Upload not implemented")
}
func (UnimplementedMediaServiceServer) GetPresignedUrl(context.Context, *GetPresignedUrlRequest) (*GetPresignedUrlResponse, error) {
return nil, status.Error(codes.Unimplemented, "method GetPresignedUrl not implemented")
}
func (UnimplementedMediaServiceServer) mustEmbedUnimplementedMediaServiceServer() {}
func (UnimplementedMediaServiceServer) testEmbeddedByValue() {}
// UnsafeMediaServiceServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to MediaServiceServer will
// result in compilation errors.
type UnsafeMediaServiceServer interface {
mustEmbedUnimplementedMediaServiceServer()
}
func RegisterMediaServiceServer(s grpc.ServiceRegistrar, srv MediaServiceServer) {
// If the following call panics, it indicates UnimplementedMediaServiceServer was
// embedded by pointer and is nil. This will cause panics if an
// unimplemented method is ever invoked, so we test this at initialization
// time to prevent it from happening at runtime later due to I/O.
if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
t.testEmbeddedByValue()
}
s.RegisterService(&MediaService_ServiceDesc, srv)
}
func _MediaService_Upload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(UploadRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(MediaServiceServer).Upload(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: MediaService_Upload_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(MediaServiceServer).Upload(ctx, req.(*UploadRequest))
}
return interceptor(ctx, in, info, handler)
}
func _MediaService_GetPresignedUrl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetPresignedUrlRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(MediaServiceServer).GetPresignedUrl(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: MediaService_GetPresignedUrl_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(MediaServiceServer).GetPresignedUrl(ctx, req.(*GetPresignedUrlRequest))
}
return interceptor(ctx, in, info, handler)
}
// MediaService_ServiceDesc is the grpc.ServiceDesc for MediaService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var MediaService_ServiceDesc = grpc.ServiceDesc{
ServiceName: "media.v1.MediaService",
HandlerType: (*MediaServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "Upload",
Handler: _MediaService_Upload_Handler,
},
{
MethodName: "GetPresignedUrl",
Handler: _MediaService_GetPresignedUrl_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "media/media.proto",
}

1102
gen/go/sso/oauth.pb.go Normal file

File diff suppressed because it is too large Load Diff

353
gen/go/sso/oauth_grpc.pb.go Normal file
View File

@@ -0,0 +1,353 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.6.1
// - protoc v4.25.9
// source: sso/oauth.proto
package pb
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.64.0 or later.
const _ = grpc.SupportPackageIsVersion9
const (
OauthService_GenerateOauthCode_FullMethodName = "/oauth.v1.OauthService/GenerateOauthCode"
OauthService_ExchangeOauthCode_FullMethodName = "/oauth.v1.OauthService/ExchangeOauthCode"
OauthService_CreateOauthClient_FullMethodName = "/oauth.v1.OauthService/CreateOauthClient"
OauthService_GetOauthClients_FullMethodName = "/oauth.v1.OauthService/GetOauthClients"
OauthService_UpdateOauthClient_FullMethodName = "/oauth.v1.OauthService/UpdateOauthClient"
OauthService_ResetOauthSecret_FullMethodName = "/oauth.v1.OauthService/ResetOauthSecret"
OauthService_DeleteOauthClient_FullMethodName = "/oauth.v1.OauthService/DeleteOauthClient"
)
// OauthServiceClient is the client API for OauthService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type OauthServiceClient interface {
// === Базовый SSO (вызывается из Gateway / Графаны) ===
GenerateOauthCode(ctx context.Context, in *GenerateOauthCodeRequest, opts ...grpc.CallOption) (*GenerateOauthCodeResponse, error)
ExchangeOauthCode(ctx context.Context, in *ExchangeOauthCodeRequest, opts ...grpc.CallOption) (*ExchangeOauthCodeResponse, error)
// === Системные методы (Консоль Разработчика / Админка) ===
CreateOauthClient(ctx context.Context, in *CreateOauthClientRequest, opts ...grpc.CallOption) (*CreateOauthClientResponse, error)
GetOauthClients(ctx context.Context, in *GetOauthClientsRequest, opts ...grpc.CallOption) (*GetOauthClientsResponse, error)
UpdateOauthClient(ctx context.Context, in *UpdateOauthClientRequest, opts ...grpc.CallOption) (*UpdateOauthClientResponse, error)
ResetOauthSecret(ctx context.Context, in *ResetOauthSecretRequest, opts ...grpc.CallOption) (*ResetOauthSecretResponse, error)
DeleteOauthClient(ctx context.Context, in *DeleteOauthClientRequest, opts ...grpc.CallOption) (*DeleteOauthClientResponse, error)
}
type oauthServiceClient struct {
cc grpc.ClientConnInterface
}
func NewOauthServiceClient(cc grpc.ClientConnInterface) OauthServiceClient {
return &oauthServiceClient{cc}
}
func (c *oauthServiceClient) GenerateOauthCode(ctx context.Context, in *GenerateOauthCodeRequest, opts ...grpc.CallOption) (*GenerateOauthCodeResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GenerateOauthCodeResponse)
err := c.cc.Invoke(ctx, OauthService_GenerateOauthCode_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *oauthServiceClient) ExchangeOauthCode(ctx context.Context, in *ExchangeOauthCodeRequest, opts ...grpc.CallOption) (*ExchangeOauthCodeResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(ExchangeOauthCodeResponse)
err := c.cc.Invoke(ctx, OauthService_ExchangeOauthCode_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *oauthServiceClient) CreateOauthClient(ctx context.Context, in *CreateOauthClientRequest, opts ...grpc.CallOption) (*CreateOauthClientResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(CreateOauthClientResponse)
err := c.cc.Invoke(ctx, OauthService_CreateOauthClient_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *oauthServiceClient) GetOauthClients(ctx context.Context, in *GetOauthClientsRequest, opts ...grpc.CallOption) (*GetOauthClientsResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetOauthClientsResponse)
err := c.cc.Invoke(ctx, OauthService_GetOauthClients_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *oauthServiceClient) UpdateOauthClient(ctx context.Context, in *UpdateOauthClientRequest, opts ...grpc.CallOption) (*UpdateOauthClientResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(UpdateOauthClientResponse)
err := c.cc.Invoke(ctx, OauthService_UpdateOauthClient_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *oauthServiceClient) ResetOauthSecret(ctx context.Context, in *ResetOauthSecretRequest, opts ...grpc.CallOption) (*ResetOauthSecretResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(ResetOauthSecretResponse)
err := c.cc.Invoke(ctx, OauthService_ResetOauthSecret_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *oauthServiceClient) DeleteOauthClient(ctx context.Context, in *DeleteOauthClientRequest, opts ...grpc.CallOption) (*DeleteOauthClientResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(DeleteOauthClientResponse)
err := c.cc.Invoke(ctx, OauthService_DeleteOauthClient_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
// OauthServiceServer is the server API for OauthService service.
// All implementations must embed UnimplementedOauthServiceServer
// for forward compatibility.
type OauthServiceServer interface {
// === Базовый SSO (вызывается из Gateway / Графаны) ===
GenerateOauthCode(context.Context, *GenerateOauthCodeRequest) (*GenerateOauthCodeResponse, error)
ExchangeOauthCode(context.Context, *ExchangeOauthCodeRequest) (*ExchangeOauthCodeResponse, error)
// === Системные методы (Консоль Разработчика / Админка) ===
CreateOauthClient(context.Context, *CreateOauthClientRequest) (*CreateOauthClientResponse, error)
GetOauthClients(context.Context, *GetOauthClientsRequest) (*GetOauthClientsResponse, error)
UpdateOauthClient(context.Context, *UpdateOauthClientRequest) (*UpdateOauthClientResponse, error)
ResetOauthSecret(context.Context, *ResetOauthSecretRequest) (*ResetOauthSecretResponse, error)
DeleteOauthClient(context.Context, *DeleteOauthClientRequest) (*DeleteOauthClientResponse, error)
mustEmbedUnimplementedOauthServiceServer()
}
// UnimplementedOauthServiceServer must be embedded to have
// forward compatible implementations.
//
// NOTE: this should be embedded by value instead of pointer to avoid a nil
// pointer dereference when methods are called.
type UnimplementedOauthServiceServer struct{}
func (UnimplementedOauthServiceServer) GenerateOauthCode(context.Context, *GenerateOauthCodeRequest) (*GenerateOauthCodeResponse, error) {
return nil, status.Error(codes.Unimplemented, "method GenerateOauthCode not implemented")
}
func (UnimplementedOauthServiceServer) ExchangeOauthCode(context.Context, *ExchangeOauthCodeRequest) (*ExchangeOauthCodeResponse, error) {
return nil, status.Error(codes.Unimplemented, "method ExchangeOauthCode not implemented")
}
func (UnimplementedOauthServiceServer) CreateOauthClient(context.Context, *CreateOauthClientRequest) (*CreateOauthClientResponse, error) {
return nil, status.Error(codes.Unimplemented, "method CreateOauthClient not implemented")
}
func (UnimplementedOauthServiceServer) GetOauthClients(context.Context, *GetOauthClientsRequest) (*GetOauthClientsResponse, error) {
return nil, status.Error(codes.Unimplemented, "method GetOauthClients not implemented")
}
func (UnimplementedOauthServiceServer) UpdateOauthClient(context.Context, *UpdateOauthClientRequest) (*UpdateOauthClientResponse, error) {
return nil, status.Error(codes.Unimplemented, "method UpdateOauthClient not implemented")
}
func (UnimplementedOauthServiceServer) ResetOauthSecret(context.Context, *ResetOauthSecretRequest) (*ResetOauthSecretResponse, error) {
return nil, status.Error(codes.Unimplemented, "method ResetOauthSecret not implemented")
}
func (UnimplementedOauthServiceServer) DeleteOauthClient(context.Context, *DeleteOauthClientRequest) (*DeleteOauthClientResponse, error) {
return nil, status.Error(codes.Unimplemented, "method DeleteOauthClient not implemented")
}
func (UnimplementedOauthServiceServer) mustEmbedUnimplementedOauthServiceServer() {}
func (UnimplementedOauthServiceServer) testEmbeddedByValue() {}
// UnsafeOauthServiceServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to OauthServiceServer will
// result in compilation errors.
type UnsafeOauthServiceServer interface {
mustEmbedUnimplementedOauthServiceServer()
}
func RegisterOauthServiceServer(s grpc.ServiceRegistrar, srv OauthServiceServer) {
// If the following call panics, it indicates UnimplementedOauthServiceServer was
// embedded by pointer and is nil. This will cause panics if an
// unimplemented method is ever invoked, so we test this at initialization
// time to prevent it from happening at runtime later due to I/O.
if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
t.testEmbeddedByValue()
}
s.RegisterService(&OauthService_ServiceDesc, srv)
}
func _OauthService_GenerateOauthCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GenerateOauthCodeRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(OauthServiceServer).GenerateOauthCode(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: OauthService_GenerateOauthCode_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(OauthServiceServer).GenerateOauthCode(ctx, req.(*GenerateOauthCodeRequest))
}
return interceptor(ctx, in, info, handler)
}
func _OauthService_ExchangeOauthCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ExchangeOauthCodeRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(OauthServiceServer).ExchangeOauthCode(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: OauthService_ExchangeOauthCode_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(OauthServiceServer).ExchangeOauthCode(ctx, req.(*ExchangeOauthCodeRequest))
}
return interceptor(ctx, in, info, handler)
}
func _OauthService_CreateOauthClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateOauthClientRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(OauthServiceServer).CreateOauthClient(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: OauthService_CreateOauthClient_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(OauthServiceServer).CreateOauthClient(ctx, req.(*CreateOauthClientRequest))
}
return interceptor(ctx, in, info, handler)
}
func _OauthService_GetOauthClients_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetOauthClientsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(OauthServiceServer).GetOauthClients(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: OauthService_GetOauthClients_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(OauthServiceServer).GetOauthClients(ctx, req.(*GetOauthClientsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _OauthService_UpdateOauthClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateOauthClientRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(OauthServiceServer).UpdateOauthClient(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: OauthService_UpdateOauthClient_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(OauthServiceServer).UpdateOauthClient(ctx, req.(*UpdateOauthClientRequest))
}
return interceptor(ctx, in, info, handler)
}
func _OauthService_ResetOauthSecret_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ResetOauthSecretRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(OauthServiceServer).ResetOauthSecret(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: OauthService_ResetOauthSecret_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(OauthServiceServer).ResetOauthSecret(ctx, req.(*ResetOauthSecretRequest))
}
return interceptor(ctx, in, info, handler)
}
func _OauthService_DeleteOauthClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DeleteOauthClientRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(OauthServiceServer).DeleteOauthClient(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: OauthService_DeleteOauthClient_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(OauthServiceServer).DeleteOauthClient(ctx, req.(*DeleteOauthClientRequest))
}
return interceptor(ctx, in, info, handler)
}
// OauthService_ServiceDesc is the grpc.ServiceDesc for OauthService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var OauthService_ServiceDesc = grpc.ServiceDesc{
ServiceName: "oauth.v1.OauthService",
HandlerType: (*OauthServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "GenerateOauthCode",
Handler: _OauthService_GenerateOauthCode_Handler,
},
{
MethodName: "ExchangeOauthCode",
Handler: _OauthService_ExchangeOauthCode_Handler,
},
{
MethodName: "CreateOauthClient",
Handler: _OauthService_CreateOauthClient_Handler,
},
{
MethodName: "GetOauthClients",
Handler: _OauthService_GetOauthClients_Handler,
},
{
MethodName: "UpdateOauthClient",
Handler: _OauthService_UpdateOauthClient_Handler,
},
{
MethodName: "ResetOauthSecret",
Handler: _OauthService_ResetOauthSecret_Handler,
},
{
MethodName: "DeleteOauthClient",
Handler: _OauthService_DeleteOauthClient_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "sso/oauth.proto",
}

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: google/protobuf/struct.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: google/protobuf/timestamp.proto

82
gen/media/media.ts Normal file
View File

@@ -0,0 +1,82 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: media/media.proto
/* eslint-disable */
import type { Metadata } from "@grpc/grpc-js";
import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
import { Observable } from "rxjs";
export const protobufPackage = "media.v1";
/** contracts/proto/media/v1/media.proto */
export interface UploadRequest {
fileName: string;
/** Сами байты файла */
data: Uint8Array;
/** "avatar", "chat", "raw" */
mode: string;
}
export interface UploadResponse {
fileName: string;
size: number;
}
export interface GetPresignedUrlRequest {
fileName: string;
/** Если true, ссылка живет 24 часа, иначе 2 минуты */
isPublic: boolean;
}
export interface GetPresignedUrlResponse {
url: string;
}
export const MEDIA_V1_PACKAGE_NAME = "media.v1";
export interface MediaServiceClient {
/** Загрузка файла */
upload(request: UploadRequest, metadata?: Metadata): Observable<UploadResponse>;
/** Генерация временной ссылки для скачивания/просмотра */
getPresignedUrl(request: GetPresignedUrlRequest, metadata?: Metadata): Observable<GetPresignedUrlResponse>;
}
export interface MediaServiceController {
/** Загрузка файла */
upload(
request: UploadRequest,
metadata?: Metadata,
): Promise<UploadResponse> | Observable<UploadResponse> | UploadResponse;
/** Генерация временной ссылки для скачивания/просмотра */
getPresignedUrl(
request: GetPresignedUrlRequest,
metadata?: Metadata,
): Promise<GetPresignedUrlResponse> | Observable<GetPresignedUrlResponse> | GetPresignedUrlResponse;
}
export function MediaServiceControllerMethods() {
return function (constructor: Function) {
const grpcMethods: string[] = ["upload", "getPresignedUrl"];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcMethod("MediaService", method)(constructor.prototype[method], method, descriptor);
}
const grpcStreamMethods: string[] = [];
for (const method of grpcStreamMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcStreamMethod("MediaService", method)(constructor.prototype[method], method, descriptor);
}
};
}
export const MEDIA_SERVICE_NAME = "MediaService";

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: notifications/notifications.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: search/search.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: sso/account.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: sso/auth.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: sso/ldap-auth.proto

197
gen/sso/oauth.ts Normal file
View File

@@ -0,0 +1,197 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: sso/oauth.proto
/* eslint-disable */
import type { Metadata } from "@grpc/grpc-js";
import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
import { Observable } from "rxjs";
export const protobufPackage = "oauth.v1";
/** --- Сообщения для базового SSO --- */
export interface GenerateOauthCodeRequest {
userId: string;
clientId: string;
redirectUri: string;
}
export interface GenerateOauthCodeResponse {
code: string;
}
export interface ExchangeOauthCodeRequest {
code: string;
clientId: string;
clientSecret: string;
}
export interface ExchangeOauthCodeResponse {
accessToken: string;
expiresIn: number;
}
/** --- Сообщения для управления клиентами --- */
export interface CreateOauthClientRequest {
ownerId: string;
name: string;
redirectUris: string[];
description?: string | undefined;
}
export interface CreateOauthClientResponse {
id: string;
name: string;
clientId: string;
/** Отдается ТОЛЬКО здесь один раз */
plainSecret: string;
redirectUris: string[];
ownerId: string;
}
export interface GetOauthClientsRequest {
ownerId: string;
/** Если true, owner_id игнорируется, выдаются все клиенты */
isAdmin: boolean;
limit: number;
offset: number;
}
export interface OauthClientItem {
id: string;
name: string;
clientId: string;
redirectUris: string[];
description?: string | undefined;
ownerId: string;
createdAt: number;
}
export interface GetOauthClientsResponse {
clients: OauthClientItem[];
total: number;
}
export interface UpdateOauthClientRequest {
clientId: string;
/** ID того, кто делает запрос */
ownerId: string;
isAdmin: boolean;
name?: string | undefined;
redirectUris: string[];
description?: string | undefined;
}
export interface UpdateOauthClientResponse {
success: boolean;
}
export interface ResetOauthSecretRequest {
clientId: string;
ownerId: string;
isAdmin: boolean;
}
export interface ResetOauthSecretResponse {
newPlainSecret: string;
}
export interface DeleteOauthClientRequest {
clientId: string;
ownerId: string;
isAdmin: boolean;
}
export interface DeleteOauthClientResponse {
success: boolean;
}
export const OAUTH_V1_PACKAGE_NAME = "oauth.v1";
export interface OauthServiceClient {
/** === Базовый SSO (вызывается из Gateway / Графаны) === */
generateOauthCode(request: GenerateOauthCodeRequest, metadata?: Metadata): Observable<GenerateOauthCodeResponse>;
exchangeOauthCode(request: ExchangeOauthCodeRequest, metadata?: Metadata): Observable<ExchangeOauthCodeResponse>;
/** === Системные методы (Консоль Разработчика / Админка) === */
createOauthClient(request: CreateOauthClientRequest, metadata?: Metadata): Observable<CreateOauthClientResponse>;
getOauthClients(request: GetOauthClientsRequest, metadata?: Metadata): Observable<GetOauthClientsResponse>;
updateOauthClient(request: UpdateOauthClientRequest, metadata?: Metadata): Observable<UpdateOauthClientResponse>;
resetOauthSecret(request: ResetOauthSecretRequest, metadata?: Metadata): Observable<ResetOauthSecretResponse>;
deleteOauthClient(request: DeleteOauthClientRequest, metadata?: Metadata): Observable<DeleteOauthClientResponse>;
}
export interface OauthServiceController {
/** === Базовый SSO (вызывается из Gateway / Графаны) === */
generateOauthCode(
request: GenerateOauthCodeRequest,
metadata?: Metadata,
): Promise<GenerateOauthCodeResponse> | Observable<GenerateOauthCodeResponse> | GenerateOauthCodeResponse;
exchangeOauthCode(
request: ExchangeOauthCodeRequest,
metadata?: Metadata,
): Promise<ExchangeOauthCodeResponse> | Observable<ExchangeOauthCodeResponse> | ExchangeOauthCodeResponse;
/** === Системные методы (Консоль Разработчика / Админка) === */
createOauthClient(
request: CreateOauthClientRequest,
metadata?: Metadata,
): Promise<CreateOauthClientResponse> | Observable<CreateOauthClientResponse> | CreateOauthClientResponse;
getOauthClients(
request: GetOauthClientsRequest,
metadata?: Metadata,
): Promise<GetOauthClientsResponse> | Observable<GetOauthClientsResponse> | GetOauthClientsResponse;
updateOauthClient(
request: UpdateOauthClientRequest,
metadata?: Metadata,
): Promise<UpdateOauthClientResponse> | Observable<UpdateOauthClientResponse> | UpdateOauthClientResponse;
resetOauthSecret(
request: ResetOauthSecretRequest,
metadata?: Metadata,
): Promise<ResetOauthSecretResponse> | Observable<ResetOauthSecretResponse> | ResetOauthSecretResponse;
deleteOauthClient(
request: DeleteOauthClientRequest,
metadata?: Metadata,
): Promise<DeleteOauthClientResponse> | Observable<DeleteOauthClientResponse> | DeleteOauthClientResponse;
}
export function OauthServiceControllerMethods() {
return function (constructor: Function) {
const grpcMethods: string[] = [
"generateOauthCode",
"exchangeOauthCode",
"createOauthClient",
"getOauthClients",
"updateOauthClient",
"resetOauthSecret",
"deleteOauthClient",
];
for (const method of grpcMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcMethod("OauthService", method)(constructor.prototype[method], method, descriptor);
}
const grpcStreamMethods: string[] = [];
for (const method of grpcStreamMethods) {
const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
GrpcStreamMethod("OauthService", method)(constructor.prototype[method], method, descriptor);
}
};
}
export const OAUTH_SERVICE_NAME = "OauthService";

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: sso/twofa.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: users/ldap.proto

View File

@@ -1,6 +1,6 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.11.6
// protoc-gen-ts_proto v2.11.8
// protoc v4.25.9
// source: users/users.proto

3
go.mod
View File

@@ -1,3 +0,0 @@
module git.lendry.ru/lendry-erp/contracts.git
go 1.26.1

View File

@@ -1,6 +1,6 @@
{
"name": "@lendry-erp/contracts",
"version": "1.2.35",
"version": "1.2.43",
"description": "Protobuf definitions and generated TypeScript types",
"type": "commonjs",
"main": "./dist/index.js",

View File

@@ -24,6 +24,8 @@ service ChatService {
// Статусы
rpc MarkAsRead(MarkAsReadRequest) returns (MarkAsReadResponse);
rpc CheckChatMembership(CheckChatMembershipRequest) returns (CheckChatMembershipResponse);
}
// --- СТРУКТУРЫ ДАННЫХ --- //
@@ -152,3 +154,13 @@ message MarkAsReadRequest {
string message_id = 3; // ID последнего видимого сообщения
}
message MarkAsReadResponse { bool success = 1; }
message CheckChatMembershipRequest {
string user_id = 1;
string chat_id = 2;
}
message CheckChatMembershipResponse {
bool is_member = 1;
}

33
proto/media/media.proto Normal file
View File

@@ -0,0 +1,33 @@
// contracts/proto/media/v1/media.proto
syntax = "proto3";
package media.v1;
option go_package = "git.lendry.ru/lendry-erp/proto.git/go;pb";
service MediaService {
// Загрузка файла
rpc Upload(UploadRequest) returns (UploadResponse);
// Генерация временной ссылки для скачивания/просмотра
rpc GetPresignedUrl(GetPresignedUrlRequest) returns (GetPresignedUrlResponse);
}
message UploadRequest {
string file_name = 1;
bytes data = 2; // Сами байты файла
string mode = 3; // "avatar", "chat", "raw"
}
message UploadResponse {
string file_name = 1;
int64 size = 2;
}
message GetPresignedUrlRequest {
string file_name = 1;
bool is_public = 2; // Если true, ссылка живет 24 часа, иначе 2 минуты
}
message GetPresignedUrlResponse {
string url = 1;
}

View File

@@ -14,9 +14,6 @@ service AuthService {
rpc GetSessions(GetSessionRequest) returns (GetSessionsResponse);
rpc TerminateSession(TerminateSessionRequest) returns (TerminateSessionResponse);
// === OAuth2 SSO ===
rpc GenerateOauthCode (GenerateOauthCodeRequest) returns (GenerateOauthCodeResponse);
rpc ExchangeOauthCode (ExchangeOauthCodeRequest) returns (ExchangeOauthCodeResponse);
// Системные методы для админа
rpc SystemCreateAccount (SystemCreateAccountRequest) returns (SystemCreateAccountResponse);
@@ -118,27 +115,6 @@ message TerminateSessionResponse {
}
// === Сообщения для OAuth2 SSO ===
message GenerateOauthCodeRequest {
string user_id = 1;
}
message GenerateOauthCodeResponse {
string code = 1;
}
message ExchangeOauthCodeRequest {
string code = 1;
string client_id = 2;
string client_secret = 3;
}
message ExchangeOauthCodeResponse {
string access_token = 1;
int32 expires_in = 2;
}
message SystemCreateAccountRequest {
string username = 1;
string password_hash = 2; // Хеш пароля генерирует Admin Service и передает сюда

112
proto/sso/oauth.proto Normal file
View File

@@ -0,0 +1,112 @@
syntax = "proto3";
package oauth.v1;
option go_package = "git.lendry.ru/lendry-erp/proto.git/go;pb";
service OauthService {
// === Базовый SSO (вызывается из Gateway / Графаны) ===
rpc GenerateOauthCode (GenerateOauthCodeRequest) returns (GenerateOauthCodeResponse);
rpc ExchangeOauthCode (ExchangeOauthCodeRequest) returns (ExchangeOauthCodeResponse);
// === Системные методы (Консоль Разработчика / Админка) ===
rpc CreateOauthClient (CreateOauthClientRequest) returns (CreateOauthClientResponse);
rpc GetOauthClients (GetOauthClientsRequest) returns (GetOauthClientsResponse);
rpc UpdateOauthClient (UpdateOauthClientRequest) returns (UpdateOauthClientResponse);
rpc ResetOauthSecret (ResetOauthSecretRequest) returns (ResetOauthSecretResponse);
rpc DeleteOauthClient (DeleteOauthClientRequest) returns (DeleteOauthClientResponse);
}
// --- Сообщения для базового SSO ---
message GenerateOauthCodeRequest {
string user_id = 1;
string client_id = 2;
string redirect_uri = 3;
}
message GenerateOauthCodeResponse {
string code = 1;
}
message ExchangeOauthCodeRequest {
string code = 1;
string client_id = 2;
string client_secret = 3;
}
message ExchangeOauthCodeResponse {
string access_token = 1;
int32 expires_in = 2;
}
// --- Сообщения для управления клиентами ---
message CreateOauthClientRequest {
string owner_id = 1;
string name = 2;
repeated string redirect_uris = 3;
optional string description = 4;
}
message CreateOauthClientResponse {
string id = 1;
string name = 2;
string client_id = 3;
string plain_secret = 4; // Отдается ТОЛЬКО здесь один раз
repeated string redirect_uris = 5;
string owner_id = 6;
}
message GetOauthClientsRequest {
string owner_id = 1;
bool is_admin = 2; // Если true, owner_id игнорируется, выдаются все клиенты
int32 limit = 3;
int32 offset = 4;
}
message OauthClientItem {
string id = 1;
string name = 2;
string client_id = 3;
repeated string redirect_uris = 4;
optional string description = 5;
string owner_id = 6;
int64 created_at = 7;
}
message GetOauthClientsResponse {
repeated OauthClientItem clients = 1;
int32 total = 2;
}
message UpdateOauthClientRequest {
string client_id = 1;
string owner_id = 2; // ID того, кто делает запрос
bool is_admin = 3;
optional string name = 4;
repeated string redirect_uris = 5;
optional string description = 6;
}
message UpdateOauthClientResponse {
bool success = 1;
}
message ResetOauthSecretRequest {
string client_id = 1;
string owner_id = 2;
bool is_admin = 3;
}
message ResetOauthSecretResponse {
string new_plain_secret = 1;
}
message DeleteOauthClientRequest {
string client_id = 1;
string owner_id = 2;
bool is_admin = 3;
}
message DeleteOauthClientResponse {
bool success = 1;
}

View File

@@ -5,6 +5,7 @@ export const PROTO_PATHS = {
LDAP_AUTH: join(__dirname, "../../proto/sso/ldap-auth.proto"),
ACCOUNT: join(__dirname, "../../proto/sso/account.proto"),
TWOFA: join(__dirname, "../../proto/sso/twofa.proto"),
OAUTH: join(__dirname, "../../proto/sso/oauth.proto"),
ADMIN: join(__dirname, "../../proto/admin/admin-account.proto"),
RBAC: join(__dirname, "../../proto/admin/rbac.proto"),
USERS: join(__dirname, "../../proto/users/users.proto"),
@@ -16,4 +17,5 @@ export const PROTO_PATHS = {
"../../proto/notifications/notifications.proto",
),
CHAT: join(__dirname, "../../proto/chat/chat.proto"),
MEDIA: join(__dirname, "../../proto/media/media.proto"),
} as const;