@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.
@@ -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 readonly RAW__metadata;
26
- private readonly RAW__showcaseIndex;
27
- private readonly showcasesIndex;
28
- private readonly showcaseSearchEngine;
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,EAEjB,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;IAE3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAG/B;IAEJ,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8B;IAGnE,OAAO;WA6CM,UAAU,CACrB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,gBAAgB,CAAC;IA6B5B,YAAY,IAAI,WAAW,CAAC,gBAAgB,CAAC,EAAE;IAI/C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,SAAS;IAItD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAqEpE"}
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"}
@@ -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
- await Promise.all(config.datasources.map(async (datasource) => {
100
- const content = await fetchShowcasesData(datasource);
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":"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"}
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;AAc/B,eAAO,MAAM,+BAA+B,WAClC,eAAe,UACf,sBAAsB,GAAG;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,KACA,QAAQ,IAAI,CA8Bd,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;AAc/B,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;AACJ,CAAC,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.0",
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.5",
55
- "@finos/legend-shared": "10.0.21",
56
- "fastify": "4.20.0"
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.75",
60
- "@jest/globals": "29.6.1",
59
+ "@finos/legend-dev-utils": "2.0.76",
60
+ "@jest/globals": "29.6.2",
61
61
  "cross-env": "7.0.3",
62
- "eslint": "8.45.0",
63
- "jest": "29.6.1",
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",
@@ -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 readonly RAW__metadata: PlainObject<ShowcaseMetadata>[] = [];
73
- private readonly RAW__showcaseIndex = new Map<
74
- string,
75
- PlainObject<Showcase>
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
- private readonly showcasesIndex = new Map<string, Showcase>();
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 Promise.all(
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
  };