@mamindom/contracts 1.0.135 → 1.0.137

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.
@@ -137,6 +137,8 @@ export interface Order {
137
137
  * Сортуються від новіших до старіших — server-side.
138
138
  */
139
139
  notes: OrderNote[];
140
+ /** 0 = не в архіві; інакше timestamp коли архівовано. */
141
+ archivedAt: number;
140
142
  }
141
143
  export interface CreateOrderRequest {
142
144
  idempotencyKey: string;
@@ -185,6 +187,11 @@ export interface ListOrdersRequest {
185
187
  totalTo: number;
186
188
  sortBy: string;
187
189
  sortDir: string;
190
+ /**
191
+ * 0 = тільки активні (default), 1 = тільки архівні, 2 = всі.
192
+ * Менеджер бачить тільки свої через manager_id (вище).
193
+ */
194
+ archivedFilter: number;
188
195
  }
189
196
  export interface ListUserOrdersRequest {
190
197
  userId: string;
@@ -212,6 +219,16 @@ export interface CancelOrderRequest {
212
219
  actorId: string;
213
220
  actorName: string;
214
221
  }
222
+ export interface ArchiveOrderRequest {
223
+ id: string;
224
+ actorId: string;
225
+ actorName: string;
226
+ }
227
+ export interface UnarchiveOrderRequest {
228
+ id: string;
229
+ actorId: string;
230
+ actorName: string;
231
+ }
215
232
  export interface AssignManagerRequest {
216
233
  id: string;
217
234
  managerId: string;
@@ -275,6 +292,12 @@ export interface OrderServiceClient {
275
292
  listUserOrders(request: ListUserOrdersRequest): Observable<ListOrdersResponse>;
276
293
  updateStatus(request: UpdateStatusRequest): Observable<OrderResponse>;
277
294
  cancelOrder(request: CancelOrderRequest): Observable<OrderResponse>;
295
+ /**
296
+ * Archive (soft delete) — встановлює archived_at. Замовлення зникає
297
+ * з дефолтного списку, але доступне через ?archived=true.
298
+ */
299
+ archiveOrder(request: ArchiveOrderRequest): Observable<OrderResponse>;
300
+ unarchiveOrder(request: UnarchiveOrderRequest): Observable<OrderResponse>;
278
301
  assignManager(request: AssignManagerRequest): Observable<OrderResponse>;
279
302
  addNote(request: AddNoteRequest): Observable<OrderResponse>;
280
303
  addTag(request: AddTagRequest): Observable<OrderResponse>;
@@ -295,6 +318,12 @@ export interface OrderServiceController {
295
318
  listUserOrders(request: ListUserOrdersRequest): Promise<ListOrdersResponse> | Observable<ListOrdersResponse> | ListOrdersResponse;
296
319
  updateStatus(request: UpdateStatusRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
297
320
  cancelOrder(request: CancelOrderRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
321
+ /**
322
+ * Archive (soft delete) — встановлює archived_at. Замовлення зникає
323
+ * з дефолтного списку, але доступне через ?archived=true.
324
+ */
325
+ archiveOrder(request: ArchiveOrderRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
326
+ unarchiveOrder(request: UnarchiveOrderRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
298
327
  assignManager(request: AssignManagerRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
299
328
  addNote(request: AddNoteRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
300
329
  addTag(request: AddTagRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
package/dist/gen/order.js CHANGED
@@ -22,6 +22,8 @@ function OrderServiceControllerMethods() {
22
22
  "listUserOrders",
23
23
  "updateStatus",
24
24
  "cancelOrder",
25
+ "archiveOrder",
26
+ "unarchiveOrder",
25
27
  "assignManager",
26
28
  "addNote",
27
29
  "addTag",
@@ -0,0 +1,161 @@
1
+ import { Observable } from "rxjs";
2
+ import { DeleteResponse, SuccessResponse } from "./common";
3
+ export declare const protobufPackage = "catalog.v1";
4
+ export declare enum SynonymType {
5
+ SYNONYM_MULTI_WAY = 0,
6
+ SYNONYM_ONE_WAY = 1,
7
+ UNRECOGNIZED = -1
8
+ }
9
+ export interface SuggestRequest {
10
+ q: string;
11
+ /** 1..20, default 8 */
12
+ limit: number;
13
+ /** default true */
14
+ onlyInStock: boolean;
15
+ /** 'uk' | 'ru', default 'uk' */
16
+ locale: string;
17
+ }
18
+ export interface SuggestProduct {
19
+ id: string;
20
+ sku: string;
21
+ slug: string;
22
+ /** already локалізована (uk/ru) */
23
+ name: string;
24
+ mainImage: string;
25
+ price: number;
26
+ oldPrice?: number | undefined;
27
+ rating: number;
28
+ reviewCount: number;
29
+ inStock: boolean;
30
+ }
31
+ export interface SuggestCategory {
32
+ id: string;
33
+ slug: string;
34
+ name: string;
35
+ productCount: number;
36
+ }
37
+ export interface SuggestResponse {
38
+ query: string;
39
+ products: SuggestProduct[];
40
+ categories: SuggestCategory[];
41
+ popularQueries: string[];
42
+ /** загальна кількість збігів у продуктах */
43
+ total: number;
44
+ }
45
+ export interface SynonymResponse {
46
+ id: string;
47
+ type: SynonymType;
48
+ queryTerms: string[];
49
+ synonyms: string[];
50
+ locale?: string | undefined;
51
+ isActive: boolean;
52
+ createdAt: string;
53
+ updatedAt: string;
54
+ }
55
+ export interface ListSynonymsRequest {
56
+ search?: string | undefined;
57
+ isActive?: boolean | undefined;
58
+ }
59
+ export interface ListSynonymsResponse {
60
+ items: SynonymResponse[];
61
+ }
62
+ export interface CreateSynonymRequest {
63
+ type: SynonymType;
64
+ queryTerms: string[];
65
+ synonyms: string[];
66
+ locale?: string | undefined;
67
+ isActive: boolean;
68
+ }
69
+ export interface UpdateSynonymRequest {
70
+ id: string;
71
+ type?: SynonymType | undefined;
72
+ queryTerms: string[];
73
+ synonyms: string[];
74
+ locale?: string | undefined;
75
+ isActive?: boolean | undefined;
76
+ clearQueryTerms: boolean;
77
+ clearSynonyms: boolean;
78
+ }
79
+ export interface DeleteSynonymRequest {
80
+ id: string;
81
+ }
82
+ export interface SyncSynonymsRequest {
83
+ }
84
+ export interface PopularQueryResponse {
85
+ id: string;
86
+ query: string;
87
+ sortOrder: number;
88
+ isActive: boolean;
89
+ createdAt: string;
90
+ updatedAt: string;
91
+ }
92
+ export interface ListPopularQueriesRequest {
93
+ isActive?: boolean | undefined;
94
+ }
95
+ export interface ListPopularQueriesResponse {
96
+ items: PopularQueryResponse[];
97
+ }
98
+ export interface CreatePopularQueryRequest {
99
+ query: string;
100
+ sortOrder: number;
101
+ isActive: boolean;
102
+ }
103
+ export interface UpdatePopularQueryRequest {
104
+ id: string;
105
+ query?: string | undefined;
106
+ sortOrder?: number | undefined;
107
+ isActive?: boolean | undefined;
108
+ }
109
+ export interface DeletePopularQueryRequest {
110
+ id: string;
111
+ }
112
+ export interface ReorderPopularQueriesRequest {
113
+ items: ReorderPopularQueryItem[];
114
+ }
115
+ export interface ReorderPopularQueryItem {
116
+ id: string;
117
+ sortOrder: number;
118
+ }
119
+ export declare const CATALOG_V1_PACKAGE_NAME = "catalog.v1";
120
+ /**
121
+ * SearchService — окремий сервіс під autocomplete та керування пошуком
122
+ * (синоніми, популярні запити). Логіка та індекс живуть у catalog-service.
123
+ */
124
+ export interface SearchServiceClient {
125
+ /** ─── Public (autocomplete) ─────────────────────────────────────────────── */
126
+ suggest(request: SuggestRequest): Observable<SuggestResponse>;
127
+ /** ─── Admin: synonyms ───────────────────────────────────────────────────── */
128
+ listSynonyms(request: ListSynonymsRequest): Observable<ListSynonymsResponse>;
129
+ createSynonym(request: CreateSynonymRequest): Observable<SynonymResponse>;
130
+ updateSynonym(request: UpdateSynonymRequest): Observable<SynonymResponse>;
131
+ deleteSynonym(request: DeleteSynonymRequest): Observable<DeleteResponse>;
132
+ syncSynonymsToTypesense(request: SyncSynonymsRequest): Observable<SuccessResponse>;
133
+ /** ─── Admin: popular queries ────────────────────────────────────────────── */
134
+ listPopularQueries(request: ListPopularQueriesRequest): Observable<ListPopularQueriesResponse>;
135
+ createPopularQuery(request: CreatePopularQueryRequest): Observable<PopularQueryResponse>;
136
+ updatePopularQuery(request: UpdatePopularQueryRequest): Observable<PopularQueryResponse>;
137
+ deletePopularQuery(request: DeletePopularQueryRequest): Observable<DeleteResponse>;
138
+ reorderPopularQueries(request: ReorderPopularQueriesRequest): Observable<SuccessResponse>;
139
+ }
140
+ /**
141
+ * SearchService — окремий сервіс під autocomplete та керування пошуком
142
+ * (синоніми, популярні запити). Логіка та індекс живуть у catalog-service.
143
+ */
144
+ export interface SearchServiceController {
145
+ /** ─── Public (autocomplete) ─────────────────────────────────────────────── */
146
+ suggest(request: SuggestRequest): Promise<SuggestResponse> | Observable<SuggestResponse> | SuggestResponse;
147
+ /** ─── Admin: synonyms ───────────────────────────────────────────────────── */
148
+ listSynonyms(request: ListSynonymsRequest): Promise<ListSynonymsResponse> | Observable<ListSynonymsResponse> | ListSynonymsResponse;
149
+ createSynonym(request: CreateSynonymRequest): Promise<SynonymResponse> | Observable<SynonymResponse> | SynonymResponse;
150
+ updateSynonym(request: UpdateSynonymRequest): Promise<SynonymResponse> | Observable<SynonymResponse> | SynonymResponse;
151
+ deleteSynonym(request: DeleteSynonymRequest): Promise<DeleteResponse> | Observable<DeleteResponse> | DeleteResponse;
152
+ syncSynonymsToTypesense(request: SyncSynonymsRequest): Promise<SuccessResponse> | Observable<SuccessResponse> | SuccessResponse;
153
+ /** ─── Admin: popular queries ────────────────────────────────────────────── */
154
+ listPopularQueries(request: ListPopularQueriesRequest): Promise<ListPopularQueriesResponse> | Observable<ListPopularQueriesResponse> | ListPopularQueriesResponse;
155
+ createPopularQuery(request: CreatePopularQueryRequest): Promise<PopularQueryResponse> | Observable<PopularQueryResponse> | PopularQueryResponse;
156
+ updatePopularQuery(request: UpdatePopularQueryRequest): Promise<PopularQueryResponse> | Observable<PopularQueryResponse> | PopularQueryResponse;
157
+ deletePopularQuery(request: DeletePopularQueryRequest): Promise<DeleteResponse> | Observable<DeleteResponse> | DeleteResponse;
158
+ reorderPopularQueries(request: ReorderPopularQueriesRequest): Promise<SuccessResponse> | Observable<SuccessResponse> | SuccessResponse;
159
+ }
160
+ export declare function SearchServiceControllerMethods(): (constructor: Function) => void;
161
+ export declare const SEARCH_SERVICE_NAME = "SearchService";
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
3
+ // versions:
4
+ // protoc-gen-ts_proto v2.11.4
5
+ // protoc v3.21.12
6
+ // source: search.proto
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SEARCH_SERVICE_NAME = exports.CATALOG_V1_PACKAGE_NAME = exports.SynonymType = exports.protobufPackage = void 0;
9
+ exports.SearchServiceControllerMethods = SearchServiceControllerMethods;
10
+ /* eslint-disable */
11
+ const microservices_1 = require("@nestjs/microservices");
12
+ exports.protobufPackage = "catalog.v1";
13
+ var SynonymType;
14
+ (function (SynonymType) {
15
+ SynonymType[SynonymType["SYNONYM_MULTI_WAY"] = 0] = "SYNONYM_MULTI_WAY";
16
+ SynonymType[SynonymType["SYNONYM_ONE_WAY"] = 1] = "SYNONYM_ONE_WAY";
17
+ SynonymType[SynonymType["UNRECOGNIZED"] = -1] = "UNRECOGNIZED";
18
+ })(SynonymType || (exports.SynonymType = SynonymType = {}));
19
+ exports.CATALOG_V1_PACKAGE_NAME = "catalog.v1";
20
+ function SearchServiceControllerMethods() {
21
+ return function (constructor) {
22
+ const grpcMethods = [
23
+ "suggest",
24
+ "listSynonyms",
25
+ "createSynonym",
26
+ "updateSynonym",
27
+ "deleteSynonym",
28
+ "syncSynonymsToTypesense",
29
+ "listPopularQueries",
30
+ "createPopularQuery",
31
+ "updatePopularQuery",
32
+ "deletePopularQuery",
33
+ "reorderPopularQueries",
34
+ ];
35
+ for (const method of grpcMethods) {
36
+ const descriptor = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
37
+ (0, microservices_1.GrpcMethod)("SearchService", method)(constructor.prototype[method], method, descriptor);
38
+ }
39
+ const grpcStreamMethods = [];
40
+ for (const method of grpcStreamMethods) {
41
+ const descriptor = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
42
+ (0, microservices_1.GrpcStreamMethod)("SearchService", method)(constructor.prototype[method], method, descriptor);
43
+ }
44
+ };
45
+ }
46
+ exports.SEARCH_SERVICE_NAME = "SearchService";
@@ -14,6 +14,11 @@ service OrderService {
14
14
  rpc UpdateStatus(UpdateStatusRequest) returns (OrderResponse);
15
15
  rpc CancelOrder(CancelOrderRequest) returns (OrderResponse);
16
16
 
17
+ // Archive (soft delete) — встановлює archived_at. Замовлення зникає
18
+ // з дефолтного списку, але доступне через ?archived=true.
19
+ rpc ArchiveOrder(ArchiveOrderRequest) returns (OrderResponse);
20
+ rpc UnarchiveOrder(UnarchiveOrderRequest) returns (OrderResponse);
21
+
17
22
  rpc AssignManager(AssignManagerRequest) returns (OrderResponse);
18
23
  rpc AddNote(AddNoteRequest) returns (OrderResponse);
19
24
  rpc AddTag(AddTagRequest) returns (OrderResponse);
@@ -185,6 +190,9 @@ message Order {
185
190
  // Внутрішні нотатки менеджерів (видимі тільки в адмінці).
186
191
  // Сортуються від новіших до старіших — server-side.
187
192
  repeated OrderNote notes = 22;
193
+
194
+ // 0 = не в архіві; інакше timestamp коли архівовано.
195
+ int64 archived_at = 23;
188
196
  }
189
197
 
190
198
  // ─── Requests ──────────────────────────────────────────────────
@@ -243,6 +251,9 @@ message ListOrdersRequest {
243
251
  double total_to = 13;
244
252
  string sort_by = 14;
245
253
  string sort_dir = 15;
254
+ // 0 = тільки активні (default), 1 = тільки архівні, 2 = всі.
255
+ // Менеджер бачить тільки свої через manager_id (вище).
256
+ int32 archived_filter = 16;
246
257
  }
247
258
 
248
259
  message ListUserOrdersRequest {
@@ -275,6 +286,18 @@ message CancelOrderRequest {
275
286
  string actor_name = 4;
276
287
  }
277
288
 
289
+ message ArchiveOrderRequest {
290
+ string id = 1;
291
+ string actor_id = 2;
292
+ string actor_name = 3;
293
+ }
294
+
295
+ message UnarchiveOrderRequest {
296
+ string id = 1;
297
+ string actor_id = 2;
298
+ string actor_name = 3;
299
+ }
300
+
278
301
  message AssignManagerRequest {
279
302
  string id = 1;
280
303
  string manager_id = 2;
@@ -0,0 +1,161 @@
1
+ syntax = "proto3";
2
+
3
+ package catalog.v1;
4
+
5
+ import "common.proto";
6
+
7
+ // SearchService — окремий сервіс під autocomplete та керування пошуком
8
+ // (синоніми, популярні запити). Логіка та індекс живуть у catalog-service.
9
+ service SearchService {
10
+ // ─── Public (autocomplete) ───────────────────────────────────────────────
11
+ rpc Suggest (SuggestRequest) returns (SuggestResponse);
12
+
13
+ // ─── Admin: synonyms ─────────────────────────────────────────────────────
14
+ rpc ListSynonyms (ListSynonymsRequest) returns (ListSynonymsResponse);
15
+ rpc CreateSynonym (CreateSynonymRequest) returns (SynonymResponse);
16
+ rpc UpdateSynonym (UpdateSynonymRequest) returns (SynonymResponse);
17
+ rpc DeleteSynonym (DeleteSynonymRequest) returns (DeleteResponse);
18
+ rpc SyncSynonymsToTypesense (SyncSynonymsRequest) returns (SuccessResponse);
19
+
20
+ // ─── Admin: popular queries ──────────────────────────────────────────────
21
+ rpc ListPopularQueries (ListPopularQueriesRequest) returns (ListPopularQueriesResponse);
22
+ rpc CreatePopularQuery (CreatePopularQueryRequest) returns (PopularQueryResponse);
23
+ rpc UpdatePopularQuery (UpdatePopularQueryRequest) returns (PopularQueryResponse);
24
+ rpc DeletePopularQuery (DeletePopularQueryRequest) returns (DeleteResponse);
25
+ rpc ReorderPopularQueries (ReorderPopularQueriesRequest) returns (SuccessResponse);
26
+ }
27
+
28
+ // ─────────────────────────── Suggest (public) ─────────────────────────────
29
+
30
+ message SuggestRequest {
31
+ string q = 1;
32
+ int32 limit = 2; // 1..20, default 8
33
+ bool only_in_stock = 3; // default true
34
+ string locale = 4; // 'uk' | 'ru', default 'uk'
35
+ }
36
+
37
+ message SuggestProduct {
38
+ string id = 1;
39
+ string sku = 2;
40
+ string slug = 3;
41
+ string name = 4; // already локалізована (uk/ru)
42
+ string main_image = 5;
43
+ double price = 6;
44
+ optional double old_price = 7;
45
+ float rating = 8;
46
+ int32 review_count = 9;
47
+ bool in_stock = 10;
48
+ }
49
+
50
+ message SuggestCategory {
51
+ string id = 1;
52
+ string slug = 2;
53
+ string name = 3;
54
+ int32 product_count = 4;
55
+ }
56
+
57
+ message SuggestResponse {
58
+ string query = 1;
59
+ repeated SuggestProduct products = 2;
60
+ repeated SuggestCategory categories = 3;
61
+ repeated string popular_queries = 4;
62
+ int32 total = 5; // загальна кількість збігів у продуктах
63
+ }
64
+
65
+ // ─────────────────────────── Synonyms (admin) ─────────────────────────────
66
+
67
+ enum SynonymType {
68
+ SYNONYM_MULTI_WAY = 0;
69
+ SYNONYM_ONE_WAY = 1;
70
+ }
71
+
72
+ message SynonymResponse {
73
+ string id = 1;
74
+ SynonymType type = 2;
75
+ repeated string query_terms = 3;
76
+ repeated string synonyms = 4;
77
+ optional string locale = 5;
78
+ bool is_active = 6;
79
+ string created_at = 7;
80
+ string updated_at = 8;
81
+ }
82
+
83
+ message ListSynonymsRequest {
84
+ optional string search = 1;
85
+ optional bool is_active = 2;
86
+ }
87
+
88
+ message ListSynonymsResponse {
89
+ repeated SynonymResponse items = 1;
90
+ }
91
+
92
+ message CreateSynonymRequest {
93
+ SynonymType type = 1;
94
+ repeated string query_terms = 2;
95
+ repeated string synonyms = 3;
96
+ optional string locale = 4;
97
+ bool is_active = 5;
98
+ }
99
+
100
+ message UpdateSynonymRequest {
101
+ string id = 1;
102
+ optional SynonymType type = 2;
103
+ repeated string query_terms = 3;
104
+ repeated string synonyms = 4;
105
+ optional string locale = 5;
106
+ optional bool is_active = 6;
107
+ bool clear_query_terms = 7;
108
+ bool clear_synonyms = 8;
109
+ }
110
+
111
+ message DeleteSynonymRequest {
112
+ string id = 1;
113
+ }
114
+
115
+ message SyncSynonymsRequest {
116
+ }
117
+
118
+ // ───────────────────────── Popular queries (admin) ────────────────────────
119
+
120
+ message PopularQueryResponse {
121
+ string id = 1;
122
+ string query = 2;
123
+ int32 sort_order = 3;
124
+ bool is_active = 4;
125
+ string created_at = 5;
126
+ string updated_at = 6;
127
+ }
128
+
129
+ message ListPopularQueriesRequest {
130
+ optional bool is_active = 1;
131
+ }
132
+
133
+ message ListPopularQueriesResponse {
134
+ repeated PopularQueryResponse items = 1;
135
+ }
136
+
137
+ message CreatePopularQueryRequest {
138
+ string query = 1;
139
+ int32 sort_order = 2;
140
+ bool is_active = 3;
141
+ }
142
+
143
+ message UpdatePopularQueryRequest {
144
+ string id = 1;
145
+ optional string query = 2;
146
+ optional int32 sort_order = 3;
147
+ optional bool is_active = 4;
148
+ }
149
+
150
+ message DeletePopularQueryRequest {
151
+ string id = 1;
152
+ }
153
+
154
+ message ReorderPopularQueriesRequest {
155
+ repeated ReorderPopularQueryItem items = 1;
156
+ }
157
+
158
+ message ReorderPopularQueryItem {
159
+ string id = 1;
160
+ int32 sort_order = 2;
161
+ }
@@ -15,6 +15,7 @@ export declare const PROTO_PATHS: {
15
15
  readonly STOCK: string;
16
16
  readonly BUNDLE: string;
17
17
  readonly FILTER: string;
18
+ readonly SEARCH: string;
18
19
  readonly PICKUP: string;
19
20
  readonly PRODUCT_REVIEW: string;
20
21
  readonly COMMON_PROMO: string;
@@ -19,6 +19,7 @@ exports.PROTO_PATHS = {
19
19
  STOCK: (0, node_path_1.join)(__dirname, '../../proto/stock.proto'),
20
20
  BUNDLE: (0, node_path_1.join)(__dirname, '../../proto/bundle.proto'),
21
21
  FILTER: (0, node_path_1.join)(__dirname, '../../proto/shop_filters.proto'),
22
+ SEARCH: (0, node_path_1.join)(__dirname, '../../proto/search.proto'),
22
23
  PICKUP: (0, node_path_1.join)(__dirname, '../../proto/pickup.proto'),
23
24
  PRODUCT_REVIEW: (0, node_path_1.join)(__dirname, '../../proto/product_review.proto'),
24
25
  COMMON_PROMO: (0, node_path_1.join)(__dirname, '../../proto/common_promo.proto'),
package/gen/order.ts CHANGED
@@ -159,6 +159,8 @@ export interface Order {
159
159
  * Сортуються від новіших до старіших — server-side.
160
160
  */
161
161
  notes: OrderNote[];
162
+ /** 0 = не в архіві; інакше timestamp коли архівовано. */
163
+ archivedAt: number;
162
164
  }
163
165
 
164
166
  export interface CreateOrderRequest {
@@ -213,6 +215,11 @@ export interface ListOrdersRequest {
213
215
  totalTo: number;
214
216
  sortBy: string;
215
217
  sortDir: string;
218
+ /**
219
+ * 0 = тільки активні (default), 1 = тільки архівні, 2 = всі.
220
+ * Менеджер бачить тільки свої через manager_id (вище).
221
+ */
222
+ archivedFilter: number;
216
223
  }
217
224
 
218
225
  export interface ListUserOrdersRequest {
@@ -245,6 +252,18 @@ export interface CancelOrderRequest {
245
252
  actorName: string;
246
253
  }
247
254
 
255
+ export interface ArchiveOrderRequest {
256
+ id: string;
257
+ actorId: string;
258
+ actorName: string;
259
+ }
260
+
261
+ export interface UnarchiveOrderRequest {
262
+ id: string;
263
+ actorId: string;
264
+ actorName: string;
265
+ }
266
+
248
267
  export interface AssignManagerRequest {
249
268
  id: string;
250
269
  managerId: string;
@@ -328,6 +347,15 @@ export interface OrderServiceClient {
328
347
 
329
348
  cancelOrder(request: CancelOrderRequest): Observable<OrderResponse>;
330
349
 
350
+ /**
351
+ * Archive (soft delete) — встановлює archived_at. Замовлення зникає
352
+ * з дефолтного списку, але доступне через ?archived=true.
353
+ */
354
+
355
+ archiveOrder(request: ArchiveOrderRequest): Observable<OrderResponse>;
356
+
357
+ unarchiveOrder(request: UnarchiveOrderRequest): Observable<OrderResponse>;
358
+
331
359
  assignManager(request: AssignManagerRequest): Observable<OrderResponse>;
332
360
 
333
361
  addNote(request: AddNoteRequest): Observable<OrderResponse>;
@@ -374,6 +402,15 @@ export interface OrderServiceController {
374
402
 
375
403
  cancelOrder(request: CancelOrderRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
376
404
 
405
+ /**
406
+ * Archive (soft delete) — встановлює archived_at. Замовлення зникає
407
+ * з дефолтного списку, але доступне через ?archived=true.
408
+ */
409
+
410
+ archiveOrder(request: ArchiveOrderRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
411
+
412
+ unarchiveOrder(request: UnarchiveOrderRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
413
+
377
414
  assignManager(request: AssignManagerRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
378
415
 
379
416
  addNote(request: AddNoteRequest): Promise<OrderResponse> | Observable<OrderResponse> | OrderResponse;
@@ -412,6 +449,8 @@ export function OrderServiceControllerMethods() {
412
449
  "listUserOrders",
413
450
  "updateStatus",
414
451
  "cancelOrder",
452
+ "archiveOrder",
453
+ "unarchiveOrder",
415
454
  "assignManager",
416
455
  "addNote",
417
456
  "addTag",
package/gen/search.ts ADDED
@@ -0,0 +1,266 @@
1
+ // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
2
+ // versions:
3
+ // protoc-gen-ts_proto v2.11.4
4
+ // protoc v3.21.12
5
+ // source: search.proto
6
+
7
+ /* eslint-disable */
8
+ import { GrpcMethod, GrpcStreamMethod } from "@nestjs/microservices";
9
+ import { Observable } from "rxjs";
10
+ import { DeleteResponse, SuccessResponse } from "./common";
11
+
12
+ export const protobufPackage = "catalog.v1";
13
+
14
+ export enum SynonymType {
15
+ SYNONYM_MULTI_WAY = 0,
16
+ SYNONYM_ONE_WAY = 1,
17
+ UNRECOGNIZED = -1,
18
+ }
19
+
20
+ export interface SuggestRequest {
21
+ q: string;
22
+ /** 1..20, default 8 */
23
+ limit: number;
24
+ /** default true */
25
+ onlyInStock: boolean;
26
+ /** 'uk' | 'ru', default 'uk' */
27
+ locale: string;
28
+ }
29
+
30
+ export interface SuggestProduct {
31
+ id: string;
32
+ sku: string;
33
+ slug: string;
34
+ /** already локалізована (uk/ru) */
35
+ name: string;
36
+ mainImage: string;
37
+ price: number;
38
+ oldPrice?: number | undefined;
39
+ rating: number;
40
+ reviewCount: number;
41
+ inStock: boolean;
42
+ }
43
+
44
+ export interface SuggestCategory {
45
+ id: string;
46
+ slug: string;
47
+ name: string;
48
+ productCount: number;
49
+ }
50
+
51
+ export interface SuggestResponse {
52
+ query: string;
53
+ products: SuggestProduct[];
54
+ categories: SuggestCategory[];
55
+ popularQueries: string[];
56
+ /** загальна кількість збігів у продуктах */
57
+ total: number;
58
+ }
59
+
60
+ export interface SynonymResponse {
61
+ id: string;
62
+ type: SynonymType;
63
+ queryTerms: string[];
64
+ synonyms: string[];
65
+ locale?: string | undefined;
66
+ isActive: boolean;
67
+ createdAt: string;
68
+ updatedAt: string;
69
+ }
70
+
71
+ export interface ListSynonymsRequest {
72
+ search?: string | undefined;
73
+ isActive?: boolean | undefined;
74
+ }
75
+
76
+ export interface ListSynonymsResponse {
77
+ items: SynonymResponse[];
78
+ }
79
+
80
+ export interface CreateSynonymRequest {
81
+ type: SynonymType;
82
+ queryTerms: string[];
83
+ synonyms: string[];
84
+ locale?: string | undefined;
85
+ isActive: boolean;
86
+ }
87
+
88
+ export interface UpdateSynonymRequest {
89
+ id: string;
90
+ type?: SynonymType | undefined;
91
+ queryTerms: string[];
92
+ synonyms: string[];
93
+ locale?: string | undefined;
94
+ isActive?: boolean | undefined;
95
+ clearQueryTerms: boolean;
96
+ clearSynonyms: boolean;
97
+ }
98
+
99
+ export interface DeleteSynonymRequest {
100
+ id: string;
101
+ }
102
+
103
+ export interface SyncSynonymsRequest {
104
+ }
105
+
106
+ export interface PopularQueryResponse {
107
+ id: string;
108
+ query: string;
109
+ sortOrder: number;
110
+ isActive: boolean;
111
+ createdAt: string;
112
+ updatedAt: string;
113
+ }
114
+
115
+ export interface ListPopularQueriesRequest {
116
+ isActive?: boolean | undefined;
117
+ }
118
+
119
+ export interface ListPopularQueriesResponse {
120
+ items: PopularQueryResponse[];
121
+ }
122
+
123
+ export interface CreatePopularQueryRequest {
124
+ query: string;
125
+ sortOrder: number;
126
+ isActive: boolean;
127
+ }
128
+
129
+ export interface UpdatePopularQueryRequest {
130
+ id: string;
131
+ query?: string | undefined;
132
+ sortOrder?: number | undefined;
133
+ isActive?: boolean | undefined;
134
+ }
135
+
136
+ export interface DeletePopularQueryRequest {
137
+ id: string;
138
+ }
139
+
140
+ export interface ReorderPopularQueriesRequest {
141
+ items: ReorderPopularQueryItem[];
142
+ }
143
+
144
+ export interface ReorderPopularQueryItem {
145
+ id: string;
146
+ sortOrder: number;
147
+ }
148
+
149
+ export const CATALOG_V1_PACKAGE_NAME = "catalog.v1";
150
+
151
+ /**
152
+ * SearchService — окремий сервіс під autocomplete та керування пошуком
153
+ * (синоніми, популярні запити). Логіка та індекс живуть у catalog-service.
154
+ */
155
+
156
+ export interface SearchServiceClient {
157
+ /** ─── Public (autocomplete) ─────────────────────────────────────────────── */
158
+
159
+ suggest(request: SuggestRequest): Observable<SuggestResponse>;
160
+
161
+ /** ─── Admin: synonyms ───────────────────────────────────────────────────── */
162
+
163
+ listSynonyms(request: ListSynonymsRequest): Observable<ListSynonymsResponse>;
164
+
165
+ createSynonym(request: CreateSynonymRequest): Observable<SynonymResponse>;
166
+
167
+ updateSynonym(request: UpdateSynonymRequest): Observable<SynonymResponse>;
168
+
169
+ deleteSynonym(request: DeleteSynonymRequest): Observable<DeleteResponse>;
170
+
171
+ syncSynonymsToTypesense(request: SyncSynonymsRequest): Observable<SuccessResponse>;
172
+
173
+ /** ─── Admin: popular queries ────────────────────────────────────────────── */
174
+
175
+ listPopularQueries(request: ListPopularQueriesRequest): Observable<ListPopularQueriesResponse>;
176
+
177
+ createPopularQuery(request: CreatePopularQueryRequest): Observable<PopularQueryResponse>;
178
+
179
+ updatePopularQuery(request: UpdatePopularQueryRequest): Observable<PopularQueryResponse>;
180
+
181
+ deletePopularQuery(request: DeletePopularQueryRequest): Observable<DeleteResponse>;
182
+
183
+ reorderPopularQueries(request: ReorderPopularQueriesRequest): Observable<SuccessResponse>;
184
+ }
185
+
186
+ /**
187
+ * SearchService — окремий сервіс під autocomplete та керування пошуком
188
+ * (синоніми, популярні запити). Логіка та індекс живуть у catalog-service.
189
+ */
190
+
191
+ export interface SearchServiceController {
192
+ /** ─── Public (autocomplete) ─────────────────────────────────────────────── */
193
+
194
+ suggest(request: SuggestRequest): Promise<SuggestResponse> | Observable<SuggestResponse> | SuggestResponse;
195
+
196
+ /** ─── Admin: synonyms ───────────────────────────────────────────────────── */
197
+
198
+ listSynonyms(
199
+ request: ListSynonymsRequest,
200
+ ): Promise<ListSynonymsResponse> | Observable<ListSynonymsResponse> | ListSynonymsResponse;
201
+
202
+ createSynonym(
203
+ request: CreateSynonymRequest,
204
+ ): Promise<SynonymResponse> | Observable<SynonymResponse> | SynonymResponse;
205
+
206
+ updateSynonym(
207
+ request: UpdateSynonymRequest,
208
+ ): Promise<SynonymResponse> | Observable<SynonymResponse> | SynonymResponse;
209
+
210
+ deleteSynonym(request: DeleteSynonymRequest): Promise<DeleteResponse> | Observable<DeleteResponse> | DeleteResponse;
211
+
212
+ syncSynonymsToTypesense(
213
+ request: SyncSynonymsRequest,
214
+ ): Promise<SuccessResponse> | Observable<SuccessResponse> | SuccessResponse;
215
+
216
+ /** ─── Admin: popular queries ────────────────────────────────────────────── */
217
+
218
+ listPopularQueries(
219
+ request: ListPopularQueriesRequest,
220
+ ): Promise<ListPopularQueriesResponse> | Observable<ListPopularQueriesResponse> | ListPopularQueriesResponse;
221
+
222
+ createPopularQuery(
223
+ request: CreatePopularQueryRequest,
224
+ ): Promise<PopularQueryResponse> | Observable<PopularQueryResponse> | PopularQueryResponse;
225
+
226
+ updatePopularQuery(
227
+ request: UpdatePopularQueryRequest,
228
+ ): Promise<PopularQueryResponse> | Observable<PopularQueryResponse> | PopularQueryResponse;
229
+
230
+ deletePopularQuery(
231
+ request: DeletePopularQueryRequest,
232
+ ): Promise<DeleteResponse> | Observable<DeleteResponse> | DeleteResponse;
233
+
234
+ reorderPopularQueries(
235
+ request: ReorderPopularQueriesRequest,
236
+ ): Promise<SuccessResponse> | Observable<SuccessResponse> | SuccessResponse;
237
+ }
238
+
239
+ export function SearchServiceControllerMethods() {
240
+ return function (constructor: Function) {
241
+ const grpcMethods: string[] = [
242
+ "suggest",
243
+ "listSynonyms",
244
+ "createSynonym",
245
+ "updateSynonym",
246
+ "deleteSynonym",
247
+ "syncSynonymsToTypesense",
248
+ "listPopularQueries",
249
+ "createPopularQuery",
250
+ "updatePopularQuery",
251
+ "deletePopularQuery",
252
+ "reorderPopularQueries",
253
+ ];
254
+ for (const method of grpcMethods) {
255
+ const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
256
+ GrpcMethod("SearchService", method)(constructor.prototype[method], method, descriptor);
257
+ }
258
+ const grpcStreamMethods: string[] = [];
259
+ for (const method of grpcStreamMethods) {
260
+ const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
261
+ GrpcStreamMethod("SearchService", method)(constructor.prototype[method], method, descriptor);
262
+ }
263
+ };
264
+ }
265
+
266
+ export const SEARCH_SERVICE_NAME = "SearchService";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mamindom/contracts",
3
3
  "description": "proto",
4
- "version": "1.0.135",
4
+ "version": "1.0.137",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
7
7
  "exports": {
package/proto/order.proto CHANGED
@@ -14,6 +14,11 @@ service OrderService {
14
14
  rpc UpdateStatus(UpdateStatusRequest) returns (OrderResponse);
15
15
  rpc CancelOrder(CancelOrderRequest) returns (OrderResponse);
16
16
 
17
+ // Archive (soft delete) — встановлює archived_at. Замовлення зникає
18
+ // з дефолтного списку, але доступне через ?archived=true.
19
+ rpc ArchiveOrder(ArchiveOrderRequest) returns (OrderResponse);
20
+ rpc UnarchiveOrder(UnarchiveOrderRequest) returns (OrderResponse);
21
+
17
22
  rpc AssignManager(AssignManagerRequest) returns (OrderResponse);
18
23
  rpc AddNote(AddNoteRequest) returns (OrderResponse);
19
24
  rpc AddTag(AddTagRequest) returns (OrderResponse);
@@ -185,6 +190,9 @@ message Order {
185
190
  // Внутрішні нотатки менеджерів (видимі тільки в адмінці).
186
191
  // Сортуються від новіших до старіших — server-side.
187
192
  repeated OrderNote notes = 22;
193
+
194
+ // 0 = не в архіві; інакше timestamp коли архівовано.
195
+ int64 archived_at = 23;
188
196
  }
189
197
 
190
198
  // ─── Requests ──────────────────────────────────────────────────
@@ -243,6 +251,9 @@ message ListOrdersRequest {
243
251
  double total_to = 13;
244
252
  string sort_by = 14;
245
253
  string sort_dir = 15;
254
+ // 0 = тільки активні (default), 1 = тільки архівні, 2 = всі.
255
+ // Менеджер бачить тільки свої через manager_id (вище).
256
+ int32 archived_filter = 16;
246
257
  }
247
258
 
248
259
  message ListUserOrdersRequest {
@@ -275,6 +286,18 @@ message CancelOrderRequest {
275
286
  string actor_name = 4;
276
287
  }
277
288
 
289
+ message ArchiveOrderRequest {
290
+ string id = 1;
291
+ string actor_id = 2;
292
+ string actor_name = 3;
293
+ }
294
+
295
+ message UnarchiveOrderRequest {
296
+ string id = 1;
297
+ string actor_id = 2;
298
+ string actor_name = 3;
299
+ }
300
+
278
301
  message AssignManagerRequest {
279
302
  string id = 1;
280
303
  string manager_id = 2;
@@ -0,0 +1,161 @@
1
+ syntax = "proto3";
2
+
3
+ package catalog.v1;
4
+
5
+ import "common.proto";
6
+
7
+ // SearchService — окремий сервіс під autocomplete та керування пошуком
8
+ // (синоніми, популярні запити). Логіка та індекс живуть у catalog-service.
9
+ service SearchService {
10
+ // ─── Public (autocomplete) ───────────────────────────────────────────────
11
+ rpc Suggest (SuggestRequest) returns (SuggestResponse);
12
+
13
+ // ─── Admin: synonyms ─────────────────────────────────────────────────────
14
+ rpc ListSynonyms (ListSynonymsRequest) returns (ListSynonymsResponse);
15
+ rpc CreateSynonym (CreateSynonymRequest) returns (SynonymResponse);
16
+ rpc UpdateSynonym (UpdateSynonymRequest) returns (SynonymResponse);
17
+ rpc DeleteSynonym (DeleteSynonymRequest) returns (DeleteResponse);
18
+ rpc SyncSynonymsToTypesense (SyncSynonymsRequest) returns (SuccessResponse);
19
+
20
+ // ─── Admin: popular queries ──────────────────────────────────────────────
21
+ rpc ListPopularQueries (ListPopularQueriesRequest) returns (ListPopularQueriesResponse);
22
+ rpc CreatePopularQuery (CreatePopularQueryRequest) returns (PopularQueryResponse);
23
+ rpc UpdatePopularQuery (UpdatePopularQueryRequest) returns (PopularQueryResponse);
24
+ rpc DeletePopularQuery (DeletePopularQueryRequest) returns (DeleteResponse);
25
+ rpc ReorderPopularQueries (ReorderPopularQueriesRequest) returns (SuccessResponse);
26
+ }
27
+
28
+ // ─────────────────────────── Suggest (public) ─────────────────────────────
29
+
30
+ message SuggestRequest {
31
+ string q = 1;
32
+ int32 limit = 2; // 1..20, default 8
33
+ bool only_in_stock = 3; // default true
34
+ string locale = 4; // 'uk' | 'ru', default 'uk'
35
+ }
36
+
37
+ message SuggestProduct {
38
+ string id = 1;
39
+ string sku = 2;
40
+ string slug = 3;
41
+ string name = 4; // already локалізована (uk/ru)
42
+ string main_image = 5;
43
+ double price = 6;
44
+ optional double old_price = 7;
45
+ float rating = 8;
46
+ int32 review_count = 9;
47
+ bool in_stock = 10;
48
+ }
49
+
50
+ message SuggestCategory {
51
+ string id = 1;
52
+ string slug = 2;
53
+ string name = 3;
54
+ int32 product_count = 4;
55
+ }
56
+
57
+ message SuggestResponse {
58
+ string query = 1;
59
+ repeated SuggestProduct products = 2;
60
+ repeated SuggestCategory categories = 3;
61
+ repeated string popular_queries = 4;
62
+ int32 total = 5; // загальна кількість збігів у продуктах
63
+ }
64
+
65
+ // ─────────────────────────── Synonyms (admin) ─────────────────────────────
66
+
67
+ enum SynonymType {
68
+ SYNONYM_MULTI_WAY = 0;
69
+ SYNONYM_ONE_WAY = 1;
70
+ }
71
+
72
+ message SynonymResponse {
73
+ string id = 1;
74
+ SynonymType type = 2;
75
+ repeated string query_terms = 3;
76
+ repeated string synonyms = 4;
77
+ optional string locale = 5;
78
+ bool is_active = 6;
79
+ string created_at = 7;
80
+ string updated_at = 8;
81
+ }
82
+
83
+ message ListSynonymsRequest {
84
+ optional string search = 1;
85
+ optional bool is_active = 2;
86
+ }
87
+
88
+ message ListSynonymsResponse {
89
+ repeated SynonymResponse items = 1;
90
+ }
91
+
92
+ message CreateSynonymRequest {
93
+ SynonymType type = 1;
94
+ repeated string query_terms = 2;
95
+ repeated string synonyms = 3;
96
+ optional string locale = 4;
97
+ bool is_active = 5;
98
+ }
99
+
100
+ message UpdateSynonymRequest {
101
+ string id = 1;
102
+ optional SynonymType type = 2;
103
+ repeated string query_terms = 3;
104
+ repeated string synonyms = 4;
105
+ optional string locale = 5;
106
+ optional bool is_active = 6;
107
+ bool clear_query_terms = 7;
108
+ bool clear_synonyms = 8;
109
+ }
110
+
111
+ message DeleteSynonymRequest {
112
+ string id = 1;
113
+ }
114
+
115
+ message SyncSynonymsRequest {
116
+ }
117
+
118
+ // ───────────────────────── Popular queries (admin) ────────────────────────
119
+
120
+ message PopularQueryResponse {
121
+ string id = 1;
122
+ string query = 2;
123
+ int32 sort_order = 3;
124
+ bool is_active = 4;
125
+ string created_at = 5;
126
+ string updated_at = 6;
127
+ }
128
+
129
+ message ListPopularQueriesRequest {
130
+ optional bool is_active = 1;
131
+ }
132
+
133
+ message ListPopularQueriesResponse {
134
+ repeated PopularQueryResponse items = 1;
135
+ }
136
+
137
+ message CreatePopularQueryRequest {
138
+ string query = 1;
139
+ int32 sort_order = 2;
140
+ bool is_active = 3;
141
+ }
142
+
143
+ message UpdatePopularQueryRequest {
144
+ string id = 1;
145
+ optional string query = 2;
146
+ optional int32 sort_order = 3;
147
+ optional bool is_active = 4;
148
+ }
149
+
150
+ message DeletePopularQueryRequest {
151
+ string id = 1;
152
+ }
153
+
154
+ message ReorderPopularQueriesRequest {
155
+ repeated ReorderPopularQueryItem items = 1;
156
+ }
157
+
158
+ message ReorderPopularQueryItem {
159
+ string id = 1;
160
+ int32 sort_order = 2;
161
+ }