@finos/legend-server-showcase-deployment 10.3.0 → 10.4.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.
- package/lib/ShowcaseRegistry.d.ts +8 -5
- package/lib/ShowcaseRegistry.d.ts.map +1 -1
- package/lib/ShowcaseRegistry.js +45 -18
- package/lib/ShowcaseRegistry.js.map +1 -1
- package/lib/ShowcaseRegistryServer.d.ts.map +1 -1
- package/lib/ShowcaseRegistryServer.js +5 -0
- package/lib/ShowcaseRegistryServer.js.map +1 -1
- package/package.json +8 -8
- package/src/ShowcaseRegistry.ts +59 -31
- package/src/ShowcaseRegistryServer.ts +6 -0
@@ -14,7 +14,7 @@
|
|
14
14
|
* limitations under the License.
|
15
15
|
*/
|
16
16
|
import { Showcase, type ShowcaseMetadata, type ShowcaseTextSearchResult } from '@finos/legend-server-showcase';
|
17
|
-
import { type PlainObject } from '@finos/legend-shared';
|
17
|
+
import { type PlainObject, ActionState } from '@finos/legend-shared';
|
18
18
|
export type ShowcaseRegistryConfig = {
|
19
19
|
datasources: {
|
20
20
|
url?: string;
|
@@ -22,14 +22,17 @@ export type ShowcaseRegistryConfig = {
|
|
22
22
|
}[];
|
23
23
|
};
|
24
24
|
export declare class ShowcaseRegistry {
|
25
|
-
private
|
26
|
-
private
|
27
|
-
private
|
28
|
-
private
|
25
|
+
private config?;
|
26
|
+
private RAW__metadata;
|
27
|
+
private RAW__showcaseIndex;
|
28
|
+
private showcasesIndex;
|
29
|
+
private showcaseSearchEngine;
|
30
|
+
readonly fetchDataState: ActionState;
|
29
31
|
private constructor();
|
30
32
|
static initialize(config: ShowcaseRegistryConfig): Promise<ShowcaseRegistry>;
|
31
33
|
getShowcases(): PlainObject<ShowcaseMetadata>[];
|
32
34
|
getShowcase(path: string): PlainObject<Showcase> | undefined;
|
35
|
+
fetchData(): Promise<void>;
|
33
36
|
search(searchText: string): Promise<ShowcaseTextSearchResult>;
|
34
37
|
}
|
35
38
|
//# sourceMappingURL=ShowcaseRegistry.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ShowcaseRegistry.d.ts","sourceRoot":"","sources":["../src/ShowcaseRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EACL,QAAQ,EACR,KAAK,gBAAgB,EAErB,KAAK,wBAAwB,EAC9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAIL,KAAK,WAAW,
|
1
|
+
{"version":3,"file":"ShowcaseRegistry.d.ts","sourceRoot":"","sources":["../src/ShowcaseRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EACL,QAAQ,EACR,KAAK,gBAAgB,EAErB,KAAK,wBAAwB,EAC9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAIL,KAAK,WAAW,EAEhB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAgC9B,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE;QACX,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;CACL,CAAC;AAEF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,CAAyB;IAGxC,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,kBAAkB,CAA4C;IAEtE,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,oBAAoB,CAA8B;IAE1D,QAAQ,CAAC,cAAc,cAAwB;IAG/C,OAAO;WA6CM,UAAU,CACrB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,gBAAgB,CAAC;IAO5B,YAAY,IAAI,WAAW,CAAC,gBAAgB,CAAC,EAAE;IAI/C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,SAAS;IAItD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C1B,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAyEpE"}
|
package/lib/ShowcaseRegistry.js
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
import { get } from 'https';
|
17
17
|
import { readFileSync } from 'fs';
|
18
18
|
import { Showcase, } from '@finos/legend-server-showcase';
|
19
|
-
import { ESM__FuzzySearchEngine, FuzzySearchEngine, promisify, getNonNullableEntry, } from '@finos/legend-shared';
|
19
|
+
import { ESM__FuzzySearchEngine, FuzzySearchEngine, promisify, getNonNullableEntry, ActionState, } from '@finos/legend-shared';
|
20
20
|
async function fetchExternalLinkSiteData(url) {
|
21
21
|
return new Promise((resolve, reject) => {
|
22
22
|
get(url, (response) => {
|
@@ -44,11 +44,13 @@ const fetchShowcasesData = async (datasource) => {
|
|
44
44
|
return content && Array.isArray(content) ? content : [];
|
45
45
|
};
|
46
46
|
export class ShowcaseRegistry {
|
47
|
+
config;
|
47
48
|
// NOTE: maintain these to improve performance
|
48
49
|
RAW__metadata = [];
|
49
50
|
RAW__showcaseIndex = new Map();
|
50
51
|
showcasesIndex = new Map();
|
51
52
|
showcaseSearchEngine;
|
53
|
+
fetchDataState = ActionState.create();
|
52
54
|
// private constructor to enforce singleton
|
53
55
|
constructor() {
|
54
56
|
// NOTE: due to the way we export the constructor of `FuzzySearchEngine`, when we run this with ESM
|
@@ -96,23 +98,8 @@ export class ShowcaseRegistry {
|
|
96
98
|
}
|
97
99
|
static async initialize(config) {
|
98
100
|
const registry = new ShowcaseRegistry();
|
99
|
-
|
100
|
-
|
101
|
-
content.forEach((showcaseContent) => {
|
102
|
-
const showcase = Showcase.serialization.fromJson(showcaseContent);
|
103
|
-
// NOTE: do not allow override
|
104
|
-
if (!registry.showcasesIndex.has(showcase.path)) {
|
105
|
-
registry.showcasesIndex.set(showcase.path, showcase);
|
106
|
-
registry.RAW__showcaseIndex.set(showcase.path, showcaseContent);
|
107
|
-
registry.RAW__metadata.push({
|
108
|
-
title: showcase.title,
|
109
|
-
path: showcase.path,
|
110
|
-
description: showcase.description,
|
111
|
-
});
|
112
|
-
}
|
113
|
-
});
|
114
|
-
}));
|
115
|
-
registry.showcaseSearchEngine.setCollection(Array.from(registry.showcasesIndex.values()));
|
101
|
+
registry.config = config;
|
102
|
+
await registry.fetchData();
|
116
103
|
return registry;
|
117
104
|
}
|
118
105
|
getShowcases() {
|
@@ -121,7 +108,47 @@ export class ShowcaseRegistry {
|
|
121
108
|
getShowcase(path) {
|
122
109
|
return this.RAW__showcaseIndex.get(path);
|
123
110
|
}
|
111
|
+
async fetchData() {
|
112
|
+
if (this.fetchDataState.isInProgress) {
|
113
|
+
return;
|
114
|
+
}
|
115
|
+
try {
|
116
|
+
this.fetchDataState.inProgress();
|
117
|
+
const RAW__metadata = [];
|
118
|
+
const RAW__showcaseIndex = new Map();
|
119
|
+
const showcasesIndex = new Map();
|
120
|
+
await Promise.all(this.config?.datasources.map(async (datasource) => {
|
121
|
+
const content = await fetchShowcasesData(datasource);
|
122
|
+
content.forEach((showcaseContent) => {
|
123
|
+
const showcase = Showcase.serialization.fromJson(showcaseContent);
|
124
|
+
// NOTE: do not allow override
|
125
|
+
if (!showcasesIndex.has(showcase.path)) {
|
126
|
+
showcasesIndex.set(showcase.path, showcase);
|
127
|
+
RAW__showcaseIndex.set(showcase.path, showcaseContent);
|
128
|
+
RAW__metadata.push({
|
129
|
+
title: showcase.title,
|
130
|
+
path: showcase.path,
|
131
|
+
description: showcase.description,
|
132
|
+
});
|
133
|
+
}
|
134
|
+
});
|
135
|
+
}) ?? []);
|
136
|
+
// update in one go
|
137
|
+
this.RAW__metadata = RAW__metadata;
|
138
|
+
this.RAW__showcaseIndex = RAW__showcaseIndex;
|
139
|
+
this.showcasesIndex = showcasesIndex;
|
140
|
+
this.showcaseSearchEngine.remove(() => true);
|
141
|
+
this.showcaseSearchEngine.setCollection(Array.from(this.showcasesIndex.values()));
|
142
|
+
}
|
143
|
+
finally {
|
144
|
+
this.fetchDataState.complete();
|
145
|
+
}
|
146
|
+
}
|
124
147
|
async search(searchText) {
|
148
|
+
// short-circuit when the text search length is too short, else we would end up putting strain on the server
|
149
|
+
if (searchText.length <= 2) {
|
150
|
+
return { showcases: [], textMatches: [] };
|
151
|
+
}
|
125
152
|
const matches = [];
|
126
153
|
// NOTE: for text search, we only support case-insensitive search now
|
127
154
|
const lowerCaseSearchText = searchText.toLowerCase();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ShowcaseRegistry.js","sourceRoot":"","sources":["../src/ShowcaseRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EACL,QAAQ,GAIT,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,SAAS,EAET,mBAAmB,
|
1
|
+
{"version":3,"file":"ShowcaseRegistry.js","sourceRoot":"","sources":["../src/ShowcaseRegistry.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ShowcaseRegistryServer.d.ts","sourceRoot":"","sources":["../src/ShowcaseRegistryServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,KAAK,eAAe,EAAgC,MAAM,SAAS,CAAC;AAC7E,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,uBAAuB,CAAC;
|
1
|
+
{"version":3,"file":"ShowcaseRegistryServer.d.ts","sourceRoot":"","sources":["../src/ShowcaseRegistryServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,KAAK,eAAe,EAAgC,MAAM,SAAS,CAAC;AAC7E,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,uBAAuB,CAAC;AAe/B,eAAO,MAAM,+BAA+B,WAClC,eAAe,UACf,sBAAsB,GAAG;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,KACA,QAAQ,IAAI,CAmCd,CAAC"}
|
@@ -15,6 +15,7 @@
|
|
15
15
|
*/
|
16
16
|
import {} from 'fastify';
|
17
17
|
import { ShowcaseRegistry, } from './ShowcaseRegistry.js';
|
18
|
+
import { HttpStatus } from '@finos/legend-shared';
|
18
19
|
export const configureShowcaseRegistryServer = async (server, config) => {
|
19
20
|
const registry = await ShowcaseRegistry.initialize(config);
|
20
21
|
const baseUrl = config.apiBaseUrl ?? '/api';
|
@@ -34,5 +35,9 @@ export const configureShowcaseRegistryServer = async (server, config) => {
|
|
34
35
|
const { searchText } = request.query;
|
35
36
|
await reply.send(await registry.search(searchText));
|
36
37
|
});
|
38
|
+
server.get(`${baseUrl}/showcases/refresh`, async (request, reply) => {
|
39
|
+
await registry.fetchData();
|
40
|
+
await reply.status(HttpStatus.NO_CONTENT).send();
|
41
|
+
});
|
37
42
|
};
|
38
43
|
//# sourceMappingURL=ShowcaseRegistryServer.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ShowcaseRegistryServer.js","sourceRoot":"","sources":["../src/ShowcaseRegistryServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAsD,MAAM,SAAS,CAAC;AAC7E,OAAO,EACL,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;
|
1
|
+
{"version":3,"file":"ShowcaseRegistryServer.js","sourceRoot":"","sources":["../src/ShowcaseRegistryServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAsD,MAAM,SAAS,CAAC;AAC7E,OAAO,EACL,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAclD,MAAM,CAAC,MAAM,+BAA+B,GAAG,KAAK,EAClD,MAAuB,EACvB,MAEC,EACc,EAAE;IACjB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC;IAE5C,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC1D,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CACR,GAAG,OAAO,iBAAiB,EAC3B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE;YACb,KAAK,CAAC,YAAY,EAAE,CAAC;YACrB,OAAO;SACR;QAED,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,GAAG,OAAO,mBAAmB,EAC7B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAErC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAClE,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@finos/legend-server-showcase-deployment",
|
3
|
-
"version": "10.
|
3
|
+
"version": "10.4.0",
|
4
4
|
"description": "Legend Showcase server deployment",
|
5
5
|
"keywords": [
|
6
6
|
"legend",
|
@@ -51,16 +51,16 @@
|
|
51
51
|
},
|
52
52
|
"dependencies": {
|
53
53
|
"@fastify/cors": "8.3.0",
|
54
|
-
"@finos/legend-server-showcase": "0.0.
|
55
|
-
"@finos/legend-shared": "10.0.
|
56
|
-
"fastify": "4.
|
54
|
+
"@finos/legend-server-showcase": "0.0.6",
|
55
|
+
"@finos/legend-shared": "10.0.22",
|
56
|
+
"fastify": "4.21.0"
|
57
57
|
},
|
58
58
|
"devDependencies": {
|
59
|
-
"@finos/legend-dev-utils": "2.0.
|
60
|
-
"@jest/globals": "29.6.
|
59
|
+
"@finos/legend-dev-utils": "2.0.76",
|
60
|
+
"@jest/globals": "29.6.2",
|
61
61
|
"cross-env": "7.0.3",
|
62
|
-
"eslint": "8.
|
63
|
-
"jest": "29.6.
|
62
|
+
"eslint": "8.46.0",
|
63
|
+
"jest": "29.6.2",
|
64
64
|
"nodemon": "3.0.1",
|
65
65
|
"npm-run-all": "4.1.5",
|
66
66
|
"rimraf": "5.0.1",
|
package/src/ShowcaseRegistry.ts
CHANGED
@@ -28,6 +28,7 @@ import {
|
|
28
28
|
promisify,
|
29
29
|
type PlainObject,
|
30
30
|
getNonNullableEntry,
|
31
|
+
ActionState,
|
31
32
|
} from '@finos/legend-shared';
|
32
33
|
|
33
34
|
async function fetchExternalLinkSiteData(url: string): Promise<string> {
|
@@ -68,15 +69,16 @@ export type ShowcaseRegistryConfig = {
|
|
68
69
|
};
|
69
70
|
|
70
71
|
export class ShowcaseRegistry {
|
72
|
+
private config?: ShowcaseRegistryConfig;
|
73
|
+
|
71
74
|
// NOTE: maintain these to improve performance
|
72
|
-
private
|
73
|
-
private
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
private RAW__metadata: PlainObject<ShowcaseMetadata>[] = [];
|
76
|
+
private RAW__showcaseIndex = new Map<string, PlainObject<Showcase>>();
|
77
|
+
|
78
|
+
private showcasesIndex = new Map<string, Showcase>();
|
79
|
+
private showcaseSearchEngine: FuzzySearchEngine<Showcase>;
|
77
80
|
|
78
|
-
|
79
|
-
private readonly showcaseSearchEngine: FuzzySearchEngine<Showcase>;
|
81
|
+
readonly fetchDataState = ActionState.create();
|
80
82
|
|
81
83
|
// private constructor to enforce singleton
|
82
84
|
private constructor() {
|
@@ -128,30 +130,8 @@ export class ShowcaseRegistry {
|
|
128
130
|
config: ShowcaseRegistryConfig,
|
129
131
|
): Promise<ShowcaseRegistry> {
|
130
132
|
const registry = new ShowcaseRegistry();
|
131
|
-
|
132
|
-
await
|
133
|
-
config.datasources.map(async (datasource) => {
|
134
|
-
const content = await fetchShowcasesData(datasource);
|
135
|
-
content.forEach((showcaseContent) => {
|
136
|
-
const showcase = Showcase.serialization.fromJson(showcaseContent);
|
137
|
-
// NOTE: do not allow override
|
138
|
-
if (!registry.showcasesIndex.has(showcase.path)) {
|
139
|
-
registry.showcasesIndex.set(showcase.path, showcase);
|
140
|
-
registry.RAW__showcaseIndex.set(showcase.path, showcaseContent);
|
141
|
-
registry.RAW__metadata.push({
|
142
|
-
title: showcase.title,
|
143
|
-
path: showcase.path,
|
144
|
-
description: showcase.description,
|
145
|
-
});
|
146
|
-
}
|
147
|
-
});
|
148
|
-
}),
|
149
|
-
);
|
150
|
-
|
151
|
-
registry.showcaseSearchEngine.setCollection(
|
152
|
-
Array.from(registry.showcasesIndex.values()),
|
153
|
-
);
|
154
|
-
|
133
|
+
registry.config = config;
|
134
|
+
await registry.fetchData();
|
155
135
|
return registry;
|
156
136
|
}
|
157
137
|
|
@@ -163,7 +143,55 @@ export class ShowcaseRegistry {
|
|
163
143
|
return this.RAW__showcaseIndex.get(path);
|
164
144
|
}
|
165
145
|
|
146
|
+
async fetchData(): Promise<void> {
|
147
|
+
if (this.fetchDataState.isInProgress) {
|
148
|
+
return;
|
149
|
+
}
|
150
|
+
|
151
|
+
try {
|
152
|
+
this.fetchDataState.inProgress();
|
153
|
+
|
154
|
+
const RAW__metadata: PlainObject<ShowcaseMetadata>[] = [];
|
155
|
+
const RAW__showcaseIndex = new Map<string, PlainObject<Showcase>>();
|
156
|
+
const showcasesIndex = new Map<string, Showcase>();
|
157
|
+
|
158
|
+
await Promise.all(
|
159
|
+
this.config?.datasources.map(async (datasource) => {
|
160
|
+
const content = await fetchShowcasesData(datasource);
|
161
|
+
content.forEach((showcaseContent) => {
|
162
|
+
const showcase = Showcase.serialization.fromJson(showcaseContent);
|
163
|
+
// NOTE: do not allow override
|
164
|
+
if (!showcasesIndex.has(showcase.path)) {
|
165
|
+
showcasesIndex.set(showcase.path, showcase);
|
166
|
+
RAW__showcaseIndex.set(showcase.path, showcaseContent);
|
167
|
+
RAW__metadata.push({
|
168
|
+
title: showcase.title,
|
169
|
+
path: showcase.path,
|
170
|
+
description: showcase.description,
|
171
|
+
});
|
172
|
+
}
|
173
|
+
});
|
174
|
+
}) ?? [],
|
175
|
+
);
|
176
|
+
|
177
|
+
// update in one go
|
178
|
+
this.RAW__metadata = RAW__metadata;
|
179
|
+
this.RAW__showcaseIndex = RAW__showcaseIndex;
|
180
|
+
this.showcasesIndex = showcasesIndex;
|
181
|
+
this.showcaseSearchEngine.remove(() => true);
|
182
|
+
this.showcaseSearchEngine.setCollection(
|
183
|
+
Array.from(this.showcasesIndex.values()),
|
184
|
+
);
|
185
|
+
} finally {
|
186
|
+
this.fetchDataState.complete();
|
187
|
+
}
|
188
|
+
}
|
189
|
+
|
166
190
|
async search(searchText: string): Promise<ShowcaseTextSearchResult> {
|
191
|
+
// short-circuit when the text search length is too short, else we would end up putting strain on the server
|
192
|
+
if (searchText.length <= 2) {
|
193
|
+
return { showcases: [], textMatches: [] };
|
194
|
+
}
|
167
195
|
const matches: ShowcaseTextSearchMatch[] = [];
|
168
196
|
// NOTE: for text search, we only support case-insensitive search now
|
169
197
|
const lowerCaseSearchText = searchText.toLowerCase();
|
@@ -19,6 +19,7 @@ import {
|
|
19
19
|
ShowcaseRegistry,
|
20
20
|
type ShowcaseRegistryConfig,
|
21
21
|
} from './ShowcaseRegistry.js';
|
22
|
+
import { HttpStatus } from '@finos/legend-shared';
|
22
23
|
|
23
24
|
interface GetShowcaseRequest extends RequestGenericInterface {
|
24
25
|
Params: {
|
@@ -67,4 +68,9 @@ export const configureShowcaseRegistryServer = async (
|
|
67
68
|
await reply.send(await registry.search(searchText));
|
68
69
|
},
|
69
70
|
);
|
71
|
+
|
72
|
+
server.get(`${baseUrl}/showcases/refresh`, async (request, reply) => {
|
73
|
+
await registry.fetchData();
|
74
|
+
await reply.status(HttpStatus.NO_CONTENT).send();
|
75
|
+
});
|
70
76
|
};
|