@aepstore-dev/contracts 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,18 @@
1
1
  export declare const PROTO_PATHS: {
2
+ readonly ACTIVITY: string;
2
3
  readonly AUTH: string;
4
+ readonly MAIL: string;
5
+ readonly PRODUCTS: string;
6
+ readonly TAXONOMY: string;
7
+ readonly UPLOAD: string;
8
+ readonly USERS: string;
9
+ };
10
+ export declare const PROTO_PACKAGES: {
11
+ readonly ACTIVITY: "activity.v1";
12
+ readonly AUTH: "auth.v1";
13
+ readonly MAIL: "mail.v1";
14
+ readonly PRODUCTS: "products.v1";
15
+ readonly TAXONOMY: "taxonomy.v1";
16
+ readonly UPLOAD: "upload.v1";
17
+ readonly USERS: "users.v1";
3
18
  };
@@ -1,7 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PROTO_PATHS = void 0;
3
+ exports.PROTO_PACKAGES = exports.PROTO_PATHS = void 0;
4
4
  const path_1 = require("path");
5
+ const PROTO_DIR = (0, path_1.join)(__dirname, "../../proto");
5
6
  exports.PROTO_PATHS = {
6
- AUTH: (0, path_1.join)(__dirname, "../../proto/auth.proto"),
7
+ ACTIVITY: (0, path_1.join)(PROTO_DIR, "activity.proto"),
8
+ AUTH: (0, path_1.join)(PROTO_DIR, "auth.proto"),
9
+ MAIL: (0, path_1.join)(PROTO_DIR, "mail.proto"),
10
+ PRODUCTS: (0, path_1.join)(PROTO_DIR, "products.proto"),
11
+ TAXONOMY: (0, path_1.join)(PROTO_DIR, "taxonomy.proto"),
12
+ UPLOAD: (0, path_1.join)(PROTO_DIR, "upload.proto"),
13
+ USERS: (0, path_1.join)(PROTO_DIR, "users.proto"),
14
+ };
15
+ exports.PROTO_PACKAGES = {
16
+ ACTIVITY: "activity.v1",
17
+ AUTH: "auth.v1",
18
+ MAIL: "mail.v1",
19
+ PRODUCTS: "products.v1",
20
+ TAXONOMY: "taxonomy.v1",
21
+ UPLOAD: "upload.v1",
22
+ USERS: "users.v1",
7
23
  };
@@ -0,0 +1,281 @@
1
+ // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
2
+ // versions:
3
+ // protoc-gen-ts_proto v2.10.1
4
+ // protoc v7.35.0
5
+ // source: activity.proto
6
+
7
+ /* eslint-disable */
8
+ import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
9
+ import { Observable } from "rxjs";
10
+
11
+ export const protobufPackage = "activity.v1";
12
+
13
+ export enum ReportType {
14
+ REPORT_TYPE_UNSPECIFIED = 0,
15
+ REPORT_TYPE_PRODUCT = 1,
16
+ REPORT_TYPE_PROFILE = 2,
17
+ REPORT_TYPE_REVIEW = 3,
18
+ UNRECOGNIZED = -1,
19
+ }
20
+
21
+ export enum ReportStatus {
22
+ REPORT_STATUS_UNSPECIFIED = 0,
23
+ REPORT_STATUS_PENDING = 1,
24
+ REPORT_STATUS_IN_PROGRESS = 2,
25
+ REPORT_STATUS_RESOLVED = 3,
26
+ REPORT_STATUS_DISMISSED = 4,
27
+ UNRECOGNIZED = -1,
28
+ }
29
+
30
+ export interface Report {
31
+ id: string;
32
+ type: ReportType;
33
+ objectId: string;
34
+ userId: string;
35
+ productId: string;
36
+ categories: ReportCategory[];
37
+ message: string;
38
+ status: ReportStatus;
39
+ createdAt: string;
40
+ updatedAt: string;
41
+ }
42
+
43
+ export interface ReportResponse {
44
+ report: Report | undefined;
45
+ }
46
+
47
+ export interface CreateReportRequest {
48
+ userId: string;
49
+ type: ReportType;
50
+ objectId: string;
51
+ /** names */
52
+ categories: string[];
53
+ message: string;
54
+ }
55
+
56
+ export interface ListReportsRequest {
57
+ type: ReportType;
58
+ status: ReportStatus;
59
+ userId: string;
60
+ objectId: string;
61
+ page: number;
62
+ limit: number;
63
+ }
64
+
65
+ export interface ReportsListResponse {
66
+ items: Report[];
67
+ total: number;
68
+ page: number;
69
+ limit: number;
70
+ }
71
+
72
+ export interface ReportIdRequest {
73
+ id: string;
74
+ }
75
+
76
+ export interface ModerateReportRequest {
77
+ id: string;
78
+ /** 'accept' | 'reject' */
79
+ action: string;
80
+ }
81
+
82
+ export interface ReportCategory {
83
+ id: string;
84
+ name: string;
85
+ type: ReportType;
86
+ icon: string;
87
+ description: string;
88
+ }
89
+
90
+ export interface ReportCategoryResponse {
91
+ category: ReportCategory | undefined;
92
+ }
93
+
94
+ export interface CreateReportCategoryRequest {
95
+ name: string;
96
+ type: ReportType;
97
+ icon: string;
98
+ description: string;
99
+ }
100
+
101
+ export interface UpdateReportCategoryRequest {
102
+ id: string;
103
+ name: string;
104
+ icon: string;
105
+ description: string;
106
+ }
107
+
108
+ export interface ListReportCategoriesRequest {
109
+ type: ReportType;
110
+ }
111
+
112
+ export interface ReportCategoriesListResponse {
113
+ items: ReportCategory[];
114
+ }
115
+
116
+ export interface ReportCategoryIdRequest {
117
+ id: string;
118
+ }
119
+
120
+ export interface Review {
121
+ id: string;
122
+ rating: number;
123
+ text: string;
124
+ userId: string;
125
+ productId: string;
126
+ createdAt: string;
127
+ updatedAt: string;
128
+ userUsername: string;
129
+ userAvatarUrl: string;
130
+ }
131
+
132
+ export interface ReviewResponse {
133
+ review: Review | undefined;
134
+ }
135
+
136
+ export interface CreateReviewRequest {
137
+ userId: string;
138
+ productId: string;
139
+ rating: number;
140
+ text: string;
141
+ }
142
+
143
+ export interface GetProductReviewsRequest {
144
+ productId: string;
145
+ page: number;
146
+ limit: number;
147
+ }
148
+
149
+ export interface ReviewsListResponse {
150
+ items: Review[];
151
+ total: number;
152
+ page: number;
153
+ limit: number;
154
+ }
155
+
156
+ export interface ToggleSubscriptionRequest {
157
+ userId: string;
158
+ targetUsername: string;
159
+ }
160
+
161
+ export interface ToggleSubscriptionResponse {
162
+ subscribed: boolean;
163
+ }
164
+
165
+ export interface Ok {
166
+ ok: boolean;
167
+ }
168
+
169
+ export const ACTIVITY_V1_PACKAGE_NAME = "activity.v1";
170
+
171
+ export interface ActivityServiceClient {
172
+ /** Reports */
173
+
174
+ reportCreate(request: CreateReportRequest): Observable<ReportResponse>;
175
+
176
+ reportList(request: ListReportsRequest): Observable<ReportsListResponse>;
177
+
178
+ reportGet(request: ReportIdRequest): Observable<ReportResponse>;
179
+
180
+ reportModerate(request: ModerateReportRequest): Observable<ReportResponse>;
181
+
182
+ /** Report categories */
183
+
184
+ reportCategoryCreate(request: CreateReportCategoryRequest): Observable<ReportCategoryResponse>;
185
+
186
+ reportCategoryList(request: ListReportCategoriesRequest): Observable<ReportCategoriesListResponse>;
187
+
188
+ reportCategoryGet(request: ReportCategoryIdRequest): Observable<ReportCategoryResponse>;
189
+
190
+ reportCategoryUpdate(request: UpdateReportCategoryRequest): Observable<ReportCategoryResponse>;
191
+
192
+ reportCategoryDelete(request: ReportCategoryIdRequest): Observable<Ok>;
193
+
194
+ /** Reviews */
195
+
196
+ reviewCreate(request: CreateReviewRequest): Observable<ReviewResponse>;
197
+
198
+ getProductReviews(request: GetProductReviewsRequest): Observable<ReviewsListResponse>;
199
+
200
+ /** Subscriptions */
201
+
202
+ toggleSubscription(request: ToggleSubscriptionRequest): Observable<ToggleSubscriptionResponse>;
203
+ }
204
+
205
+ export interface ActivityServiceController {
206
+ /** Reports */
207
+
208
+ reportCreate(request: CreateReportRequest): Promise<ReportResponse> | Observable<ReportResponse> | ReportResponse;
209
+
210
+ reportList(
211
+ request: ListReportsRequest,
212
+ ): Promise<ReportsListResponse> | Observable<ReportsListResponse> | ReportsListResponse;
213
+
214
+ reportGet(request: ReportIdRequest): Promise<ReportResponse> | Observable<ReportResponse> | ReportResponse;
215
+
216
+ reportModerate(request: ModerateReportRequest): Promise<ReportResponse> | Observable<ReportResponse> | ReportResponse;
217
+
218
+ /** Report categories */
219
+
220
+ reportCategoryCreate(
221
+ request: CreateReportCategoryRequest,
222
+ ): Promise<ReportCategoryResponse> | Observable<ReportCategoryResponse> | ReportCategoryResponse;
223
+
224
+ reportCategoryList(
225
+ request: ListReportCategoriesRequest,
226
+ ): Promise<ReportCategoriesListResponse> | Observable<ReportCategoriesListResponse> | ReportCategoriesListResponse;
227
+
228
+ reportCategoryGet(
229
+ request: ReportCategoryIdRequest,
230
+ ): Promise<ReportCategoryResponse> | Observable<ReportCategoryResponse> | ReportCategoryResponse;
231
+
232
+ reportCategoryUpdate(
233
+ request: UpdateReportCategoryRequest,
234
+ ): Promise<ReportCategoryResponse> | Observable<ReportCategoryResponse> | ReportCategoryResponse;
235
+
236
+ reportCategoryDelete(request: ReportCategoryIdRequest): Promise<Ok> | Observable<Ok> | Ok;
237
+
238
+ /** Reviews */
239
+
240
+ reviewCreate(request: CreateReviewRequest): Promise<ReviewResponse> | Observable<ReviewResponse> | ReviewResponse;
241
+
242
+ getProductReviews(
243
+ request: GetProductReviewsRequest,
244
+ ): Promise<ReviewsListResponse> | Observable<ReviewsListResponse> | ReviewsListResponse;
245
+
246
+ /** Subscriptions */
247
+
248
+ toggleSubscription(
249
+ request: ToggleSubscriptionRequest,
250
+ ): Promise<ToggleSubscriptionResponse> | Observable<ToggleSubscriptionResponse> | ToggleSubscriptionResponse;
251
+ }
252
+
253
+ export function ActivityServiceControllerMethods() {
254
+ return function (constructor: Function) {
255
+ const grpcMethods: string[] = [
256
+ "reportCreate",
257
+ "reportList",
258
+ "reportGet",
259
+ "reportModerate",
260
+ "reportCategoryCreate",
261
+ "reportCategoryList",
262
+ "reportCategoryGet",
263
+ "reportCategoryUpdate",
264
+ "reportCategoryDelete",
265
+ "reviewCreate",
266
+ "getProductReviews",
267
+ "toggleSubscription",
268
+ ];
269
+ for (const method of grpcMethods) {
270
+ const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
271
+ GrpcMethod("ActivityService", method)(constructor.prototype[method], method, descriptor);
272
+ }
273
+ const grpcStreamMethods: string[] = [];
274
+ for (const method of grpcStreamMethods) {
275
+ const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
276
+ GrpcStreamMethod("ActivityService", method)(constructor.prototype[method], method, descriptor);
277
+ }
278
+ };
279
+ }
280
+
281
+ export const ACTIVITY_SERVICE_NAME = "ActivityService";
package/gen/auth.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
2
2
  // versions:
3
3
  // protoc-gen-ts_proto v2.10.1
4
- // protoc v3.21.12
4
+ // protoc v7.35.0
5
5
  // source: auth.proto
6
6
 
7
7
  /* eslint-disable */
@@ -10,56 +10,201 @@ import { Observable } from "rxjs";
10
10
 
11
11
  export const protobufPackage = "auth.v1";
12
12
 
13
- export interface SendOtpRequest {
14
- identifier: string;
13
+ export enum TwoFactorType {
14
+ NONE = 0,
15
+ APP = 1,
16
+ EMAIL = 2,
17
+ UNRECOGNIZED = -1,
18
+ }
19
+
20
+ /** Login by username OR email (one of the two must be set). */
21
+ export interface LoginRequest {
22
+ password: string;
23
+ /** optional */
24
+ username: string;
25
+ /** optional */
26
+ email: string;
27
+ }
28
+
29
+ export interface RegisterRequest {
30
+ email: string;
31
+ username: string;
32
+ password: string;
33
+ /** optional, attached by gateway from req */
34
+ ip: string;
35
+ }
36
+
37
+ /** Standard tokens-plus-user payload returned by Login / Register / RefreshToken. */
38
+ export interface AuthResponse {
39
+ accessToken: string;
40
+ refreshToken: string;
41
+ user: AuthUser | undefined;
42
+ }
43
+
44
+ export interface AuthUser {
45
+ id: string;
46
+ email: string;
47
+ username: string;
48
+ /** primary role for backwards compat ("User" / "Administrator" / "Moderator") */
49
+ role: string;
50
+ }
51
+
52
+ /** Code types: '2fa', 'reset', 'confirm', 'totp' (legacy strings preserved as-is). */
53
+ export interface CreateCodeRequest {
54
+ email: string;
15
55
  type: string;
16
56
  }
17
57
 
18
- export interface SendOtpResponse {
58
+ export interface CreateCodeResponse {
19
59
  ok: boolean;
20
60
  }
21
61
 
22
- export interface VerifyOtpRequest {
23
- identifier: string;
24
- type: string;
62
+ /** `new_password` is only used by the 'reset' flow. */
63
+ export interface VerifyCodeRequest {
64
+ email: string;
25
65
  code: string;
66
+ type: string;
67
+ /** optional */
68
+ newPassword: string;
26
69
  }
27
70
 
28
- export interface VerifyOtpResponse {
71
+ /**
72
+ * Some verification flows (e.g. confirm-on-register) issue tokens immediately;
73
+ * others just return ok=true.
74
+ */
75
+ export interface VerifyCodeResponse {
76
+ ok: boolean;
77
+ /** optional */
29
78
  accessToken: string;
79
+ /** optional */
30
80
  refreshToken: string;
31
81
  }
32
82
 
33
- export interface RefreshRequest {
34
- refreshToken: string;
83
+ export interface CheckTokenRequest {
84
+ token: string;
35
85
  }
36
86
 
37
- export interface RefreshResponse {
38
- accessToken: string;
87
+ export interface CheckTokenResponse {
88
+ valid: boolean;
89
+ userId: string;
90
+ /** populated when valid=false */
91
+ reason: string;
92
+ }
93
+
94
+ export interface RefreshTokenRequest {
39
95
  refreshToken: string;
96
+ /** optional */
97
+ userAgent: string;
98
+ /** optional */
99
+ ip: string;
100
+ }
101
+
102
+ export interface Get2faStatusRequest {
103
+ username: string;
104
+ }
105
+
106
+ export interface Get2faStatusResponse {
107
+ enabled: boolean;
108
+ type: TwoFactorType;
109
+ }
110
+
111
+ export interface GetProfileRequest {
112
+ userId: string;
113
+ }
114
+
115
+ export interface UserProfileResponse {
116
+ id: string;
117
+ email: string;
118
+ username: string;
119
+ fullName: string;
120
+ isVerified: boolean;
121
+ twoFactorEnabled: boolean;
122
+ twoFactorType: TwoFactorType;
123
+ roles: string[];
124
+ }
125
+
126
+ export interface Empty {
40
127
  }
41
128
 
42
129
  export const AUTH_V1_PACKAGE_NAME = "auth.v1";
43
130
 
131
+ /**
132
+ * Ported from legacy auth-service (@MessagePattern → @GrpcMethod).
133
+ * All tokens are HMAC primitives minted by @aepstore-dev/passport;
134
+ * the access token only carries `userId`. Username / roles / 2FA state
135
+ * must be looked up via Prisma or RbacService on the consumer side.
136
+ */
137
+
44
138
  export interface AuthServiceClient {
45
- sendOtp(request: SendOtpRequest): Observable<SendOtpResponse>;
139
+ login(request: LoginRequest): Observable<AuthResponse>;
140
+
141
+ register(request: RegisterRequest): Observable<AuthResponse>;
142
+
143
+ createCode(request: CreateCodeRequest): Observable<CreateCodeResponse>;
144
+
145
+ verifyCode(request: VerifyCodeRequest): Observable<VerifyCodeResponse>;
46
146
 
47
- verifyOtp(request: VerifyOtpRequest): Observable<VerifyOtpResponse>;
147
+ checkToken(request: CheckTokenRequest): Observable<CheckTokenResponse>;
48
148
 
49
- refresh(request: RefreshRequest): Observable<RefreshResponse>;
149
+ refreshToken(request: RefreshTokenRequest): Observable<AuthResponse>;
150
+
151
+ get2FaStatus(request: Get2faStatusRequest): Observable<Get2faStatusResponse>;
152
+
153
+ getProfile(request: GetProfileRequest): Observable<UserProfileResponse>;
154
+
155
+ cleanupExpiredTotpSetups(request: Empty): Observable<Empty>;
50
156
  }
51
157
 
158
+ /**
159
+ * Ported from legacy auth-service (@MessagePattern → @GrpcMethod).
160
+ * All tokens are HMAC primitives minted by @aepstore-dev/passport;
161
+ * the access token only carries `userId`. Username / roles / 2FA state
162
+ * must be looked up via Prisma or RbacService on the consumer side.
163
+ */
164
+
52
165
  export interface AuthServiceController {
53
- sendOtp(request: SendOtpRequest): Promise<SendOtpResponse> | Observable<SendOtpResponse> | SendOtpResponse;
166
+ login(request: LoginRequest): Promise<AuthResponse> | Observable<AuthResponse> | AuthResponse;
167
+
168
+ register(request: RegisterRequest): Promise<AuthResponse> | Observable<AuthResponse> | AuthResponse;
169
+
170
+ createCode(
171
+ request: CreateCodeRequest,
172
+ ): Promise<CreateCodeResponse> | Observable<CreateCodeResponse> | CreateCodeResponse;
173
+
174
+ verifyCode(
175
+ request: VerifyCodeRequest,
176
+ ): Promise<VerifyCodeResponse> | Observable<VerifyCodeResponse> | VerifyCodeResponse;
177
+
178
+ checkToken(
179
+ request: CheckTokenRequest,
180
+ ): Promise<CheckTokenResponse> | Observable<CheckTokenResponse> | CheckTokenResponse;
181
+
182
+ refreshToken(request: RefreshTokenRequest): Promise<AuthResponse> | Observable<AuthResponse> | AuthResponse;
183
+
184
+ get2FaStatus(
185
+ request: Get2faStatusRequest,
186
+ ): Promise<Get2faStatusResponse> | Observable<Get2faStatusResponse> | Get2faStatusResponse;
54
187
 
55
- verifyOtp(request: VerifyOtpRequest): Promise<VerifyOtpResponse> | Observable<VerifyOtpResponse> | VerifyOtpResponse;
188
+ getProfile(
189
+ request: GetProfileRequest,
190
+ ): Promise<UserProfileResponse> | Observable<UserProfileResponse> | UserProfileResponse;
56
191
 
57
- refresh(request: RefreshRequest): Promise<RefreshResponse> | Observable<RefreshResponse> | RefreshResponse;
192
+ cleanupExpiredTotpSetups(request: Empty): Promise<Empty> | Observable<Empty> | Empty;
58
193
  }
59
194
 
60
195
  export function AuthServiceControllerMethods() {
61
196
  return function (constructor: Function) {
62
- const grpcMethods: string[] = ["sendOtp", "verifyOtp", "refresh"];
197
+ const grpcMethods: string[] = [
198
+ "login",
199
+ "register",
200
+ "createCode",
201
+ "verifyCode",
202
+ "checkToken",
203
+ "refreshToken",
204
+ "get2FaStatus",
205
+ "getProfile",
206
+ "cleanupExpiredTotpSetups",
207
+ ];
63
208
  for (const method of grpcMethods) {
64
209
  const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
65
210
  GrpcMethod("AuthService", method)(constructor.prototype[method], method, descriptor);
package/gen/mail.ts ADDED
@@ -0,0 +1,91 @@
1
+ // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
2
+ // versions:
3
+ // protoc-gen-ts_proto v2.10.1
4
+ // protoc v7.35.0
5
+ // source: mail.proto
6
+
7
+ /* eslint-disable */
8
+ import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
9
+ import { Observable } from "rxjs";
10
+
11
+ export const protobufPackage = "mail.v1";
12
+
13
+ export interface MailAck {
14
+ queued: boolean;
15
+ }
16
+
17
+ export interface SendRegRequest {
18
+ userId: string;
19
+ email: string;
20
+ username: string;
21
+ fullName: string;
22
+ }
23
+
24
+ export interface Send2faRequest {
25
+ email: string;
26
+ code: string;
27
+ username: string;
28
+ }
29
+
30
+ export interface SendPasswordResetRequest {
31
+ email: string;
32
+ code: string;
33
+ username: string;
34
+ }
35
+
36
+ export interface SendRegistrationConfirmRequest {
37
+ email: string;
38
+ code: string;
39
+ username: string;
40
+ }
41
+
42
+ export const MAIL_V1_PACKAGE_NAME = "mail.v1";
43
+
44
+ /**
45
+ * Legacy mail-service used @EventPattern (fire-and-forget). In the new gRPC
46
+ * stack each becomes a unary RPC that returns an Ack. Callers ignore the
47
+ * response if they don't care about delivery.
48
+ */
49
+
50
+ export interface MailServiceClient {
51
+ sendReg(request: SendRegRequest): Observable<MailAck>;
52
+
53
+ send2Fa(request: Send2faRequest): Observable<MailAck>;
54
+
55
+ sendPasswordReset(request: SendPasswordResetRequest): Observable<MailAck>;
56
+
57
+ sendRegistrationConfirm(request: SendRegistrationConfirmRequest): Observable<MailAck>;
58
+ }
59
+
60
+ /**
61
+ * Legacy mail-service used @EventPattern (fire-and-forget). In the new gRPC
62
+ * stack each becomes a unary RPC that returns an Ack. Callers ignore the
63
+ * response if they don't care about delivery.
64
+ */
65
+
66
+ export interface MailServiceController {
67
+ sendReg(request: SendRegRequest): Promise<MailAck> | Observable<MailAck> | MailAck;
68
+
69
+ send2Fa(request: Send2faRequest): Promise<MailAck> | Observable<MailAck> | MailAck;
70
+
71
+ sendPasswordReset(request: SendPasswordResetRequest): Promise<MailAck> | Observable<MailAck> | MailAck;
72
+
73
+ sendRegistrationConfirm(request: SendRegistrationConfirmRequest): Promise<MailAck> | Observable<MailAck> | MailAck;
74
+ }
75
+
76
+ export function MailServiceControllerMethods() {
77
+ return function (constructor: Function) {
78
+ const grpcMethods: string[] = ["sendReg", "send2Fa", "sendPasswordReset", "sendRegistrationConfirm"];
79
+ for (const method of grpcMethods) {
80
+ const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
81
+ GrpcMethod("MailService", method)(constructor.prototype[method], method, descriptor);
82
+ }
83
+ const grpcStreamMethods: string[] = [];
84
+ for (const method of grpcStreamMethods) {
85
+ const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
86
+ GrpcStreamMethod("MailService", method)(constructor.prototype[method], method, descriptor);
87
+ }
88
+ };
89
+ }
90
+
91
+ export const MAIL_SERVICE_NAME = "MailService";