@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.
- package/dist/gen/order.d.ts +29 -0
- package/dist/gen/order.js +2 -0
- package/dist/gen/search.d.ts +161 -0
- package/dist/gen/search.js +46 -0
- package/dist/proto/order.proto +23 -0
- package/dist/proto/search.proto +161 -0
- package/dist/src/proto/paths.d.ts +1 -0
- package/dist/src/proto/paths.js +1 -0
- package/gen/order.ts +39 -0
- package/gen/search.ts +266 -0
- package/package.json +1 -1
- package/proto/order.proto +23 -0
- package/proto/search.proto +161 -0
package/dist/gen/order.d.ts
CHANGED
|
@@ -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
|
@@ -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";
|
package/dist/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
|
+
}
|
package/dist/src/proto/paths.js
CHANGED
|
@@ -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
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
|
+
}
|