Skip to content

Commit d18cbc4

Browse files
millotpshortcuts
andauthored
feat(javascript): support generic for hits (#854)
Co-authored-by: Clément Vannicatte <[email protected]>
1 parent 80af64c commit d18cbc4

File tree

6 files changed

+57
-12
lines changed

6 files changed

+57
-12
lines changed

generators/src/main/java/com/algolia/codegen/AlgoliaJavaScriptGenerator.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import io.swagger.v3.oas.models.Operation;
55
import io.swagger.v3.oas.models.servers.Server;
66
import java.util.List;
7+
import java.util.Map;
78
import org.openapitools.codegen.CodegenOperation;
89
import org.openapitools.codegen.SupportingFile;
910
import org.openapitools.codegen.languages.TypeScriptNodeClientCodegen;
1011
import org.openapitools.codegen.model.ModelMap;
12+
import org.openapitools.codegen.model.ModelsMap;
1113
import org.openapitools.codegen.model.OperationsMap;
1214

1315
public class AlgoliaJavaScriptGenerator extends TypeScriptNodeClientCodegen {
@@ -132,6 +134,13 @@ private void setDefaultGeneratorOptions() {
132134
}
133135
}
134136

137+
@Override
138+
public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs) {
139+
Map<String, ModelsMap> models = super.postProcessAllModels(objs);
140+
GenericPropagator.propagateGenericsToModels(models);
141+
return models;
142+
}
143+
135144
/** Provides an opportunity to inspect and modify operation data before the code is generated. */
136145
@Override
137146
public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<ModelMap> allModels) {
@@ -176,6 +185,8 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
176185
ope.vendorExtensions.put("x-create-wrapping-object", true);
177186
}
178187

188+
GenericPropagator.propagateGenericsToOperations(results, allModels);
189+
179190
return results;
180191
}
181192

generators/src/main/java/com/algolia/codegen/GenericPropagator.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,27 @@ private static boolean propagateGenericRecursive(Map<String, CodegenModel> model
102102
return false;
103103
}
104104

105+
private static void setGenericToComposedSchema(Map<String, CodegenModel> models, List<CodegenProperty> composedSchemas) {
106+
if (composedSchemas == null) {
107+
return;
108+
}
109+
for (CodegenProperty prop : composedSchemas) {
110+
if (hasGeneric(propertyToModel(models, prop))) {
111+
setHasChildGeneric(prop);
112+
}
113+
}
114+
}
115+
116+
private static void propagateToComposedSchema(Map<String, CodegenModel> models, CodegenModel model) {
117+
CodegenComposedSchemas composedSchemas = model.getComposedSchemas();
118+
if (composedSchemas == null || !hasGeneric(model)) {
119+
return;
120+
}
121+
setGenericToComposedSchema(models, composedSchemas.getOneOf());
122+
setGenericToComposedSchema(models, composedSchemas.getAllOf());
123+
setGenericToComposedSchema(models, composedSchemas.getAnyOf());
124+
}
125+
105126
private static Map<String, CodegenModel> convertToMap(Map<String, ModelsMap> models) {
106127
Map<String, CodegenModel> modelsMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
107128
for (ModelsMap modelMap : models.values()) {
@@ -138,6 +159,10 @@ public static void propagateGenericsToModels(Map<String, ModelsMap> modelsMap) {
138159
for (CodegenModel model : models.values()) {
139160
propagateGenericRecursive(models, model);
140161
}
162+
163+
for (CodegenModel model : models.values()) {
164+
propagateToComposedSchema(models, model);
165+
}
141166
}
142167

143168
/** Mark operations with a generic return type with x-is-generic */

generators/src/main/java/com/algolia/codegen/Utils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,8 @@ public static void setGenerationBanner(Map<String, Object> additionalProperties)
190190
"This file is generated, manual changes will be lost - read more on" + " https://github.com/algolia/api-clients-automation."
191191
);
192192
}
193+
194+
public static void prettyPrint(Object o) {
195+
Json.prettyPrint(o);
196+
}
193197
}

playground/javascript/node/search.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { searchClient } from '@algolia/client-search';
2-
import { ApiError, EchoResponse } from '@algolia/client-common';
2+
import { ApiError } from '@algolia/client-common';
33
import dotenv from 'dotenv';
4-
import { echoRequester } from '@algolia/requester-node-http';
54

65
dotenv.config({ path: '../../.env' });
76

@@ -12,17 +11,15 @@ const searchIndex = process.env.SEARCH_INDEX || 'test_index';
1211
const searchQuery = process.env.SEARCH_QUERY || 'test_query';
1312

1413
// Init client with appId and apiKey
15-
const client = searchClient(appId, apiKey, { requester: echoRequester() });
14+
const client = searchClient(appId, apiKey);
1615

1716
client.addAlgoliaAgent('Node playground', '0.0.1');
1817

1918
async function testSearch() {
2019
try {
21-
const res = (await client.post({
22-
path: '/test/minimal',
23-
})) as unknown as EchoResponse;
20+
const res = await client.search<{ name: string }>({ requests: [{ indexName: searchIndex, query: searchQuery }] });
2421

25-
console.log(`[OK]`, res);
22+
console.log(`[OK]`, res.results[0].hits![0].name);
2623
} catch (e: any) {
2724
// Instance of
2825
if (e instanceof ApiError) {

templates/javascript/clients/api-single.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export function create{{capitalizedApiName}}({
5757
{{/isSearchClient}}
5858
{{#operation}}
5959
{{> client/api/operation/jsdoc}}
60-
{{nickname}}( {{> client/api/operation/parameters}} ) : Promise<{{{returnType}}}> {
60+
{{nickname}}{{#vendorExtensions.x-is-generic}}<T>{{/vendorExtensions.x-is-generic}}( {{> client/api/operation/parameters}} ) : Promise<{{{returnType}}}{{#vendorExtensions.x-is-generic}}<T>{{/vendorExtensions.x-is-generic}}> {
6161
{{#vendorExtensions.x-legacy-signature}}
6262
{{> client/api/operation/legacySearchCompatible/implementation}}
6363
{{/vendorExtensions.x-legacy-signature}}

templates/javascript/clients/model.mustache

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,27 @@ import { {{classname}} } from '{{filename}}';
1111
/**
1212
* {{{description}}}
1313
*/{{/description}}
14-
export type {{classname}} = {{#oneOf}}{{{.}}} {{^-last}}|{{/-last}} {{/oneOf}}{{#allOf}}{{{.}}} {{^-last}}&{{/-last}} {{/allOf}};
14+
export type {{classname}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorExtensions.x-has-child-generic}} = {{#composedSchemas.oneOf}}{{{dataType}}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorExtensions.x-has-child-generic}} {{^-last}}|{{/-last}} {{/composedSchemas.oneOf}}
15+
{{#composedSchemas.allOf}}{{{dataType}}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorExtensions.x-has-child-generic}} {{^-last}}&{{/-last}} {{/composedSchemas.allOf}};
1516
{{/interfaces.size}}{{^interfaces.size}}
1617
{{#description}}
1718
/**
1819
* {{{description}}}
1920
*/{{/description}}{{^isEnum}}
20-
export type {{classname}} = {{#parent}} {{{.}}} & {{/parent}} {
21+
export type {{classname}}{{#vendorExtensions.x-is-generic}}<T>{{/vendorExtensions.x-is-generic}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorExtensions.x-has-child-generic}} = {{^vendorExtensions.x-is-generic}}{{#parent}}{{{.}}} & {{/parent}}{{/vendorExtensions.x-is-generic}}{{#vendorExtensions.x-is-generic}}T & {{/vendorExtensions.x-is-generic}} {
22+
{{#vendorExtensions}}
2123
{{#vars}}{{#description}}
2224
/**
2325
* {{{description}}}
2426
*/{{/description}}
25-
{{name}}{{^required}}?{{/required}}: {{#isEnum}}{{classname}}{{{nameInCamelCase}}}{{#isArray}}[]{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}};{{/vars}}
26-
} {{#vendorExtensions.x-is-SearchForHitsOptions}} & { facet?: never; maxFacetHits?: never; facetQuery?: never }; {{/vendorExtensions.x-is-SearchForHitsOptions}}
27+
{{name}}{{^required}}?{{/required}}: {{#isEnum}}{{classname}}{{{nameInCamelCase}}}{{#isArray}}[]{{/isArray}}{{/isEnum}}
28+
{{^isEnum}}{{#x-propagated-generic}}{{{complexType}}}<T>{{#isArray}}[]{{/isArray}}{{/x-propagated-generic}}
29+
{{^x-propagated-generic}}
30+
{{#x-has-child-generic}}{{{complexType}}}<T>{{#isArray}}[]{{/isArray}}{{/x-has-child-generic}}
31+
{{^x-has-child-generic}}{{{dataType}}}{{/x-has-child-generic}}
32+
{{/x-propagated-generic}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}};{{/vars}}
33+
} {{#x-is-SearchForHitsOptions}} & { facet?: never; maxFacetHits?: never; facetQuery?: never }; {{/x-is-SearchForHitsOptions}}
34+
{{/vendorExtensions}}
2735
{{/isEnum}}
2836
{{#hasEnums}}{{#vars}}{{#isEnum}}export type {{classname}}{{nameInCamelCase}} = {{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}|{{/-last}}{{/enumVars}}{{/allowableValues}}{{/isEnum}}{{/vars}}{{/hasEnums}}
2937
{{#isEnum}}export type {{classname}} = {{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}|{{/-last}}{{/enumVars}}{{/allowableValues}}{{/isEnum}}

0 commit comments

Comments
 (0)