Typescript saga immutablejs enhancements and small fixes (#10444)

* first commit: add cli option for saga and records. Added dummy sagas.mustache test file.

* More progress with default values. First prototype for isEntity and isUniqueId.

* record generation complete

* record generation complete

* progress with saga generation

* progress with saga generation

* first fully working saga generation

* merge with latest master

* removed unneeded "items" properties.

* moved global CodegenModel modifications into subclass ExtendedCodegenModel used exclusively by TypescriptFetchClient. Adding missing samples files.

* moved global CodegenOperation modifications into subclass ExtendedCodegenOperation used exclusively by TypescriptFetchClient.

* moved global CodegenProperty modifications into subclass ExtendedCodegenProperty used exclusively by TypescriptFetchClient.

* moved global CodegenParameter modifications into subclass ExtendedCodegenParameter used exclusively by TypescriptFetchClient.

* added the missing "allSagas" export.

* renamed & reworked "meta data response" flags to a more useful general concept of "operation return passthrough"

* added vendor flag keepAsJSObject as escape hatch to support circular dependencies in models and other special cases. Also fixed issues with default values for some records properties.

* added autodetection for passthrough to simplify standardised specs.

* fix small issue with passthrough void

* fix small issues with passthrough void and missing passthrough imports in some cases. Fix issues with enum default values.

* fix small issues with passthrough void and missing passthrough imports in some cases. Fix issues with enum default values.

* Added "reservedRecordField" feature to support remapping fields names that cannot be used in Records. Added missing export to record: toApi().

* added uniqueId inference. Fix small generation when uniqueId property is an array.

* removed feature "reservedRecordField" and replaced it with existing built-in "reserved words" feature. Fix minor issues with typings in generated files.

* Changed api recType names to make them less likely to cause name conflicts. Added generated ApiEntities (record, reducer & selector) files.

* Moved location of ApiEntities related files and fix issues with exports.

* - merge latest master
- renamed fake test apis to better fit the "pet theme"
- added mode for "SourceOnlyLibrary" (same as used in codegen typescript jquery)

* - missing ganarate sampless

* - Modified way to export apiEntitiesSelectpr to reduce typescript analysis time for consuming project. Removed tab characters in mustache files. Reformat code for TypeScriptFetchClientCodegen to try to remove false positive for tabs vs spaces.

* - added markErrorsAsHandled property to api sagas. Increased typescript version to address some typing errors on library build.

* - fix bug in saga interfaces. Upgraded to typescript "strict" mode to ensure proper typechecking info is generated.

* - added optional id for apiEntity selectors. Added toInlined() support to convert an entity to an inlined model recursively.

* - minor tweak for apiEntitySelector to accept null id

* - minor tweak for apiEntitySelector

* - runned ensure up to date.

* Revert "- runned ensure up to date."

This reverts commit ea9b4aed

* - runned ensure up to date.

* - runned ensure up to date.

* - added more enhancements: New "toInlined" functionality. Support for more complex double array types. apiBaseConfiguration is not sent completely for Api.init().

* - merge master

* - fix generated api bug in some cases for typescript fetch when no request params are present.

* - commented broken tests

* - fix generate samples analysis.

* update surefire to newer version

* - un-commenting test files with issues.

* factored similar utility functions in ExtendedCodegenProperty and ExtendedCodegenParameter.

Co-authored-by: Bruno Flamand <bflamand@stingray.com>
Co-authored-by: William Cheng <wing328hk@gmail.com>
This commit is contained in:
bflamand
2021-10-27 10:35:02 -04:00
committed by GitHub
parent 5e857e749d
commit 27c82e8ed2
24 changed files with 684 additions and 42 deletions

View File

@@ -708,15 +708,22 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege
var.dataTypeAlternate = var.dataType;
if (var.isArray) {
var.isUniqueId = var.isUniqueId || var.itemsAreUniqueId();
var.dataTypeAlternate = var.dataType.replace("Array<", "List<");
String newItemsDataType = var.getItemsDataType();
if (var.items.isModel) {
String itemsDataType = var.items.dataType + "Record";
var.dataTypeAlternate = var.dataTypeAlternate.replace(var.items.dataType, itemsDataType);
newItemsDataType = var.items.dataType + "Record";
var.dataTypeAlternate = var.dataTypeAlternate.replace(var.items.dataType, newItemsDataType);
} else if (var.items.isEnum) {
var.dataTypeAlternate = var.dataTypeAlternate.replace(var.items.dataType, var.items.datatypeWithEnum);
newItemsDataType = var.items.datatypeWithEnum;
var.dataTypeAlternate = var.dataTypeAlternate.replace(var.items.dataType, newItemsDataType);
} else if (var.isUniqueId) {
newItemsDataType = "string";
var.dataTypeAlternate = var.dataTypeAlternate.replace("number", newItemsDataType);
}
if (var.isUniqueId) {
var.dataTypeAlternate = var.dataTypeAlternate.replace("number", "string");
if (var.itemsAreNullable()) {
var.dataTypeAlternate = var.dataTypeAlternate.replace(newItemsDataType, newItemsDataType + " | null");
}
} else if (var.isEnum) {
var.dataTypeAlternate = var.datatypeWithEnum;
@@ -724,6 +731,9 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege
var.dataTypeAlternate = var.dataType + "Record";
} else if (var.isUniqueId) {
var.dataTypeAlternate = "string";
if (var.isNullable) {
var.dataTypeAlternate = var.dataTypeAlternate + " | null";
}
}
if (var.defaultValue == null || var.defaultValue.equals("undefined")) {
this.autoSetDefaultValueForProperty(var);
@@ -732,6 +742,10 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege
return parentIsEntity;
}
private boolean itemsAreNullable(ExtendedCodegenProperty var) {
return var.items.isNullable || (var.items.items != null && var.items.items.isNullable);
}
private void escapeOperationIds(Map<String, Object> operations) {
Map<String, Object> _operations = (Map<String, Object>) operations.get("operations");
List<ExtendedCodegenOperation> operationList = (List<ExtendedCodegenOperation>) _operations.get("operation");
@@ -816,19 +830,25 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege
param.isUniqueId = this.isUniqueIdAccordingToNameSuffix(param.paramName);
}
param.dataTypeAlternate = param.dataType;
if (param.isArray) {
param.isUniqueId = param.isUniqueId || param.itemsAreUniqueId();
param.dataTypeAlternate = param.dataType.replace("Array<", "List<");
String newItemsDataType = param.getItemsDataType();
if (param.items.isModel) {
String itemsDataType = param.items.dataType + "Record";
param.dataTypeAlternate = param.dataType.replace("Array<", "List<");
param.dataTypeAlternate = param.dataTypeAlternate.replace(param.items.dataType, itemsDataType);
newItemsDataType = param.items.dataType + "Record";
param.dataTypeAlternate = param.dataTypeAlternate.replace(param.items.dataType, newItemsDataType);
} else if (param.items.isEnum) {
newItemsDataType = param.datatypeWithEnum.substring(param.datatypeWithEnum.lastIndexOf("<") + 1, param.datatypeWithEnum.indexOf(">"));
param.dataTypeAlternate = param.datatypeWithEnum.replace("Array<", "List<");
} else {
param.dataTypeAlternate = param.dataType.replace("Array<", "List<");
} else if (param.isUniqueId) {
newItemsDataType = "string";
param.dataTypeAlternate = param.dataTypeAlternate.replace("number", newItemsDataType);
}
if (param.isUniqueId) {
param.dataTypeAlternate = param.dataTypeAlternate.replace("number", "string");
if (param.itemsAreNullable()) {
param.dataTypeAlternate = param.dataTypeAlternate.replace(newItemsDataType, newItemsDataType + " | null");
}
} else if (param.isEnum) {
param.dataTypeAlternate = param.datatypeWithEnum;
@@ -836,6 +856,9 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege
param.dataTypeAlternate = param.dataType + "Record";
} else if (param.isUniqueId) {
param.dataTypeAlternate = "string";
if (param.isNullable) {
param.dataTypeAlternate = param.dataTypeAlternate + " | null";
}
}
}
}
@@ -912,10 +935,46 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege
this.prefixParameterInterfaces = prefixParameterInterfaces;
}
private static boolean itemsAreUniqueId(CodegenProperty items) {
if (items.items != null) {
return itemsAreUniqueId(items.items);
};
if (items.vendorExtensions.get(X_IS_UNIQUE_ID) instanceof Boolean) {
return Boolean.TRUE.equals(items.vendorExtensions.get(X_IS_UNIQUE_ID));
}
return false;
}
private static boolean itemsAreNullable(CodegenProperty items) {
if (items.items != null) {
return itemsAreNullable(items.items);
};
return items.isNullable;
}
private static String getItemsDataType(CodegenProperty items) {
if (items.items != null) {
return getItemsDataType(items.items);
};
return items.dataType;
}
class ExtendedCodegenParameter extends CodegenParameter {
public String dataTypeAlternate;
public boolean isUniqueId; // this parameter represents a unique id (x-isUniqueId: true)
public boolean itemsAreUniqueId() {
return TypeScriptFetchClientCodegen.itemsAreUniqueId(this.items);
}
public boolean itemsAreNullable() {
return TypeScriptFetchClientCodegen.itemsAreNullable(this.items);
}
public String getItemsDataType() {
return TypeScriptFetchClientCodegen.getItemsDataType(this.items);
}
public ExtendedCodegenParameter(CodegenParameter cp) {
super();
@@ -1035,6 +1094,18 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege
public boolean keepAsJSObject;
public boolean isReservedRecordField;
public boolean itemsAreUniqueId() {
return TypeScriptFetchClientCodegen.itemsAreUniqueId(this.items);
}
public boolean itemsAreNullable() {
return TypeScriptFetchClientCodegen.itemsAreNullable(this.items);
}
public String getItemsDataType() {
return TypeScriptFetchClientCodegen.getItemsDataType(this.items);
}
public ExtendedCodegenProperty(CodegenProperty cp) {
super();

View File

@@ -337,7 +337,7 @@ export class {{classname}} extends runtime.BaseAPI {
return await response.value();
{{/returnType}}
{{^returnType}}
await this.{{nickname}}Raw({{#allParams.0}}{ {{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}} }{{/allParams.0}}, initOverrides);
await this.{{nickname}}Raw({{#allParams.0}}{ {{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}} }, {{/allParams.0}}initOverrides);
{{/returnType}}
}
{{/useSingleRequestParameter}}

View File

@@ -96,7 +96,17 @@ class {{classname}}RecordUtils extends ApiRecordUtils<{{classname}}, {{classname
(apiObject as any).recType = {{#isEntity}}asEntity ? {{classname}}RecordEntityProps.recType : {{/isEntity}}{{classname}}RecordProps.recType;
{{#vars}}
{{#isUniqueId}}
{{^required}}if (apiObject.{{name}}) { {{/required}}(apiObject as any).{{name}} = apiObject.{{name}}.{{#isArray}}map(item => item.{{/isArray}}toString(){{#isArray}}){{/isArray}};{{^required}} } {{/required}}
{{#isArray}}
{{#items.isArray}}
{{^required}}if (apiObject.{{name}}) { {{/required}}(apiObject as any).{{name}} = apiObject.{{name}}.map(item => item.map(item2 => item2?.toString()));{{^required}} } {{/required}}
{{/items.isArray}}
{{^items.isArray}}
{{^required}}if (apiObject.{{name}}) { {{/required}}(apiObject as any).{{name}} = apiObject.{{name}}.map(item => item?.toString());{{^required}} } {{/required}}
{{/items.isArray}}
{{/isArray}}
{{^isArray}}
{{^required}}if (apiObject.{{name}}) { {{/required}}(apiObject as any).{{name}} = apiObject.{{name}}.toString();{{^required}} } {{/required}}
{{/isArray}}
{{/isUniqueId}}
{{^keepAsJSObject}}
{{#isModel}}
@@ -134,6 +144,7 @@ class {{classname}}RecordUtils extends ApiRecordUtils<{{classname}}, {{classname
public *toInlined(entityId?: string | null) {
if (!entityId) {return undefined; }
// @ts-ignore
const entity = yield select(apiEntity{{classname}}Selector, {id: entityId});
if (!entity) {return undefined; }
@@ -160,12 +171,14 @@ class {{classname}}RecordUtils extends ApiRecordUtils<{{classname}}, {{classname
{{#vars}}
{{#isEntity}}
{{^keepAsJSObject}}
// @ts-ignore
{{name}}: {{^required}}entity.{{name}} ? {{/required}}yield call({{#lambda.camelcase}}{{{dataTypeAlternate}}}{{/lambda.camelcase}}Utils.toInlined, entity.{{name}}){{^required}} : null{{/required}},
{{/keepAsJSObject}}
{{/isEntity}}
{{#isArray}}
{{#items.isEntity}}
{{^keepAsJSObject}}
// @ts-ignore
{{name}}: {{^required}}entity.{{name}} ? {{/required}}yield call({{#lambda.camelcase}}{{items.dataType}}{{/lambda.camelcase}}RecordUtils.toInlinedArray, entity.{{name}}){{^required}} : null{{/required}},
{{/keepAsJSObject}}
{{/items.isEntity}}
@@ -183,6 +196,7 @@ class {{classname}}RecordUtils extends ApiRecordUtils<{{classname}}, {{classname
if (!entityIds) {return null; }
let entities = List<{{classname}}Record>();
for (let entityIndex = 0; entityIndex < entityIds.count(); entityIndex++) {
// @ts-ignore
const entity = yield call(this.toInlined, entityIds.get(entityIndex));
if (entity) {
entities.push(entity);
@@ -196,7 +210,17 @@ class {{classname}}RecordUtils extends ApiRecordUtils<{{classname}}, {{classname
const apiObject = super.toApi(record);
{{#vars}}
{{#isUniqueId}}
{{^required}}if (record.{{name}}) { {{/required}}apiObject.{{name}} = {{#isArray}}record.{{name}}.map(item => parseFloat(item)).toArray(){{/isArray}}{{^isArray}}parseFloat(record.{{name}}){{/isArray}};{{^required}} } {{/required}}
{{#isArray}}
{{#items.isArray}}
{{^required}}if (record.{{name}}) { {{/required}}apiObject.{{name}} = {{#isArray}}record.{{name}}.map(item => item.toArray().map(item2 => (item2 ? parseFloat(item2) : null) as number)).toArray(){{/isArray}};{{^required}} } {{/required}}
{{/items.isArray}}
{{^items.isArray}}
{{^required}}if (record.{{name}}) { {{/required}}apiObject.{{name}} = {{#isArray}}record.{{name}}.map(item => (item ? parseFloat(item) : null) as number).toArray(){{/isArray}};{{^required}} } {{/required}}
{{/items.isArray}}
{{/isArray}}
{{^isArray}}
{{^required}}if (record.{{name}}) { {{/required}}apiObject.{{name}} = {{^isArray}}parseFloat(record.{{name}}){{/isArray}};{{^required}} } {{/required}}
{{/isArray}}
{{/isUniqueId}}
{{^keepAsJSObject}}
{{#isModel}}

View File

@@ -18,15 +18,7 @@ export class Api {
{{/apis}}
{{/apiInfo}}
public static init(apiBasePath: string) {
const apiBaseConfig: ConfigurationParameters = {
basePath: apiBasePath,
credentials: "include",
headers: {
'Cache-Control': 'no-cache, no-store' // this is needed to prevent stalling issues in Chrome. Also it is a good behavior for api calls.
}
};
public static init(apiBaseConfig: ConfigurationParameters) {
{{#apiInfo}}
{{#apis}}
Api.{{#lambda.camelcase}}{{classFilename}}{{/lambda.camelcase}} = new {{classFilename}}(new Configuration(apiBaseConfig));

View File

@@ -105,12 +105,17 @@ export function *{{nickname}}SagaImp(_action_: Action<Payload{{#lambda.titlecase
yield put({{nickname}}Request({{#allParams.0}}{{#returnTypeSupportsEntities}}requestPayload{{/returnTypeSupportsEntities}}{{^returnTypeSupportsEntities}}_action_.payload{{/returnTypeSupportsEntities}}{{/allParams.0}}));
const response{{#returnType}}: Required<{{{.}}}>{{/returnType}} = yield apiCall(Api.{{#lambda.camelcase}}{{classname}}{{/lambda.camelcase}}, Api.{{#lambda.camelcase}}{{classname}}{{/lambda.camelcase}}.{{nickname}},
const response{{#returnType}}: Required<{{{returnType}}}>{{/returnType}} = yield apiCall(Api.{{#lambda.camelcase}}{{classname}}{{/lambda.camelcase}}, Api.{{#lambda.camelcase}}{{classname}}{{/lambda.camelcase}}.{{nickname}},
{{#allParams.0}}
{{#allParams}}
{{#isUniqueId}}
{{#isArray}}
{{^required}}{{paramName}} ? {{/required}}{{paramName}}.map(p => parseFloat(p)).toArray(){{^required}} : undefined{{/required}},
{{#items.isArray}}
{{^required}}{{paramName}} ? {{/required}}{{paramName}}.map(p => p.toArray().map(p2 => (p2 ? parseFloat(p2) : null) as number)).toArray(){{^required}} : undefined{{/required}},
{{/items.isArray}}
{{^items.isArray}}
{{^required}}{{paramName}} ? {{/required}}{{paramName}}.map(p => (p ? parseFloat(p) : null) as number ).toArray(){{^required}} : undefined{{/required}},
{{/items.isArray}}
{{/isArray}}
{{^isArray}}
{{^required}}{{paramName}} ? {{/required}}parseFloat({{paramName}}){{^required}} : undefined{{/required}},

View File

@@ -50,4 +50,4 @@ public class MarkdownSampleGeneratorTest {
}
}
}
}

View File

@@ -295,6 +295,46 @@ paths:
- 'write:pets'
- 'read:pets'
deprecated: true
'/pet/{petId}/regions':
get:
tags:
- pet
summary: Gets regions for a single pet.
operationId: getPetRegions
parameters:
- name: petId
in: path
description: ID of pet
required: true
type: integer
format: int64
responses:
200:
description: OK
schema:
$ref: "#/definitions/PetRegionsResponse"
put:
tags:
- pet
summary: Updates the pet regions.
operationId: updatePetRegions
parameters:
- name: petId
in: path
description: ID of pet
required: true
type: integer
format: int64
- in: body
name: new-regions
required: true
schema:
$ref: "#/definitions/PetRegions"
responses:
200:
description: OK
schema:
$ref: "#/definitions/PetRegionsResponse"
'/pet/{petId}':
get:
tags:
@@ -902,6 +942,8 @@ definitions:
- pending
- sold
default: pending
regions:
$ref: "#/definitions/PetRegions"
xml:
name: Pet
ApiResponse:
@@ -1127,6 +1169,15 @@ definitions:
- Long
description: "Type of pet part"
example: Linear
PetRegionsResponse:
type: object
required:
- meta
properties:
meta:
$ref: "#/definitions/ResponseMeta"
data:
$ref: "#/definitions/PetRegions"
GetMatchingPartsResponse:
type: object
required:
@@ -1173,3 +1224,14 @@ definitions:
StringBooleanMap:
additionalProperties:
type: boolean
PetRegions:
type: array
description: "An array of all 15-minute time slots in 24 hours."
items:
type: array
items:
description: "array of values entity id or null."
x-nullable: true
x-isUniqueId: true
type: integer
format: int64

View File

@@ -278,7 +278,7 @@ export class UserApi extends runtime.BaseAPI {
* Logs out current logged in user session
*/
async logoutUser(initOverrides?: RequestInit): Promise<void> {
await this.logoutUserRaw(, initOverrides);
await this.logoutUserRaw(initOverrides);
}
/**

View File

@@ -57,6 +57,8 @@ src/models/Pet.ts
src/models/PetPartType.ts
src/models/PetPartTypeRecord.ts
src/models/PetRecord.ts
src/models/PetRegionsResponse.ts
src/models/PetRegionsResponseRecord.ts
src/models/ResponseMeta.ts
src/models/ResponseMetaRecord.ts
src/models/Tag.ts

View File

@@ -30,6 +30,9 @@ import {
Pet,
PetFromJSON,
PetToJSON,
PetRegionsResponse,
PetRegionsResponseFromJSON,
PetRegionsResponseToJSON,
} from '../models';
export interface AddPetRequest {
@@ -61,10 +64,19 @@ export interface GetPetByIdRequest {
petId: number;
}
export interface GetPetRegionsRequest {
petId: number;
}
export interface UpdatePetRequest {
body: Pet;
}
export interface UpdatePetRegionsRequest {
petId: number;
newRegions: Array<Array<number>>;
}
export interface UpdatePetWithFormRequest {
petId: number;
name?: string;
@@ -357,6 +369,36 @@ export class PetApi extends runtime.BaseAPI {
return await response.value();
}
/**
* Gets regions for a single pet.
*/
async getPetRegionsRaw(requestParameters: GetPetRegionsRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<PetRegionsResponse>> {
if (requestParameters.petId === null || requestParameters.petId === undefined) {
throw new runtime.RequiredError('petId','Required parameter requestParameters.petId was null or undefined when calling getPetRegions.');
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
const response = await this.request({
path: `/pet/{petId}/regions`.replace(`{${"petId"}}`, encodeURIComponent(String(requestParameters.petId))),
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => PetRegionsResponseFromJSON(jsonValue));
}
/**
* Gets regions for a single pet.
*/
async getPetRegions(petId: number, initOverrides?: RequestInit): Promise<PetRegionsResponse> {
const response = await this.getPetRegionsRaw({ petId: petId }, initOverrides);
return await response.value();
}
/**
* Update an existing pet
*/
@@ -394,6 +436,43 @@ export class PetApi extends runtime.BaseAPI {
await this.updatePetRaw({ body: body }, initOverrides);
}
/**
* Updates the pet regions.
*/
async updatePetRegionsRaw(requestParameters: UpdatePetRegionsRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<PetRegionsResponse>> {
if (requestParameters.petId === null || requestParameters.petId === undefined) {
throw new runtime.RequiredError('petId','Required parameter requestParameters.petId was null or undefined when calling updatePetRegions.');
}
if (requestParameters.newRegions === null || requestParameters.newRegions === undefined) {
throw new runtime.RequiredError('newRegions','Required parameter requestParameters.newRegions was null or undefined when calling updatePetRegions.');
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
headerParameters['Content-Type'] = 'application/json';
const response = await this.request({
path: `/pet/{petId}/regions`.replace(`{${"petId"}}`, encodeURIComponent(String(requestParameters.petId))),
method: 'PUT',
headers: headerParameters,
query: queryParameters,
body: requestParameters.newRegions,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => PetRegionsResponseFromJSON(jsonValue));
}
/**
* Updates the pet regions.
*/
async updatePetRegions(petId: number, newRegions: Array<Array<number>>, initOverrides?: RequestInit): Promise<PetRegionsResponse> {
const response = await this.updatePetRegionsRaw({ petId: petId, newRegions: newRegions }, initOverrides);
return await response.value();
}
/**
* Updates a pet in the store with form data
*/

View File

@@ -35,6 +35,9 @@ import {
Pet,
PetRecord,
petRecordUtils,
PetRegionsResponse,
PetRegionsResponseRecord,
petRegionsResponseRecordUtils,
UserRecord,
} from '../models';
@@ -52,7 +55,9 @@ export const petApiSagaMap = new Map<string, () => Generator<any, any, any>>([
["findPetsByTags", findPetsByTagsSaga],
["findPetsByUserIds", findPetsByUserIdsSaga],
["getPetById", getPetByIdSaga],
["getPetRegions", getPetRegionsSaga],
["updatePet", updatePetSaga],
["updatePetRegions", updatePetRegionsSaga],
["updatePetWithForm", updatePetWithFormSaga],
["uploadFile", uploadFileSaga],
]
@@ -180,7 +185,7 @@ export function *findPetsByIdsSagaImp(_action_: Action<PayloadFindPetsByIds>) {
yield put(findPetsByIdsRequest(requestPayload));
const response: Required<Array<Pet>> = yield apiCall(Api.petApi, Api.petApi.findPetsByIds,
ids.map(p => parseFloat(p)).toArray(),
ids.map(p => (p ? parseFloat(p) : null) as number ).toArray(),
);
let successReturnValue: any = undefined;
@@ -339,7 +344,7 @@ export function *findPetsByUserIdsSagaImp(_action_: Action<PayloadFindPetsByUser
yield put(findPetsByUserIdsRequest(requestPayload));
const response: Required<FindPetsByUserResponse> = yield apiCall(Api.petApi, Api.petApi.findPetsByUserIds,
ids.map(p => parseFloat(p)).toArray(),
ids.map(p => (p ? parseFloat(p) : null) as number ).toArray(),
);
let successReturnValue: any = undefined;
@@ -414,6 +419,50 @@ export function *getPetByIdSagaImp(_action_: Action<PayloadGetPetById>) {
}
}
//endregion
//region getPetRegions
export interface PayloadGetPetRegions extends PayloadGetPetRegionsRequest, BasePayloadApiAction {
}
export interface PayloadGetPetRegionsRequest {
petId: string;
}
export const getPetRegionsRequest = createSagaAction<PayloadGetPetRegionsRequest>("getPetRegionsRequest");
export const getPetRegionsSuccess = createSagaAction<List<List<string | null>>>("getPetRegionsSuccess");
export const getPetRegionsFailure = createSagaAction<{error: any, requestPayload: PayloadGetPetRegions}>("getPetRegionsFailure");
export const getPetRegions = createSagaAction<PayloadGetPetRegions>("getPetRegions");
export function *getPetRegionsSaga() {
yield takeLatest(getPetRegions, getPetRegionsSagaImp);
}
export function *getPetRegionsSagaImp(_action_: Action<PayloadGetPetRegions>) {
const {markErrorsAsHandled, ..._payloadRest_} = _action_.payload;
try {
const {
petId,
} = _payloadRest_;
yield put(getPetRegionsRequest(_action_.payload));
const response: Required<PetRegionsResponse> = yield apiCall(Api.petApi, Api.petApi.getPetRegions,
parseFloat(petId),
);
let successReturnValue: any = undefined;
successReturnValue = petRegionsResponseRecordUtils.fromApiPassthrough(response);
yield put(getPetRegionsSuccess(successReturnValue));
return successReturnValue;
} catch (error) {
if (markErrorsAsHandled) {error.wasHandled = true; }
yield put(getPetRegionsFailure({error, requestPayload: _action_.payload}));
return error;
}
}
//endregion
//region updatePet
export interface PayloadUpdatePet extends PayloadUpdatePetRequest, BasePayloadApiAction {
@@ -456,6 +505,53 @@ export function *updatePetSagaImp(_action_: Action<PayloadUpdatePet>) {
}
}
//endregion
//region updatePetRegions
export interface PayloadUpdatePetRegions extends PayloadUpdatePetRegionsRequest, BasePayloadApiAction {
}
export interface PayloadUpdatePetRegionsRequest {
petId: string;
newRegions: List<List<string | null>>;
}
export const updatePetRegionsRequest = createSagaAction<PayloadUpdatePetRegionsRequest>("updatePetRegionsRequest");
export const updatePetRegionsSuccess = createSagaAction<List<List<string | null>>>("updatePetRegionsSuccess");
export const updatePetRegionsFailure = createSagaAction<{error: any, requestPayload: PayloadUpdatePetRegions}>("updatePetRegionsFailure");
export const updatePetRegions = createSagaAction<PayloadUpdatePetRegions>("updatePetRegions");
export function *updatePetRegionsSaga() {
yield takeLatest(updatePetRegions, updatePetRegionsSagaImp);
}
export function *updatePetRegionsSagaImp(_action_: Action<PayloadUpdatePetRegions>) {
const {markErrorsAsHandled, ..._payloadRest_} = _action_.payload;
try {
const {
petId,
newRegions,
} = _payloadRest_;
yield put(updatePetRegionsRequest(_action_.payload));
const response: Required<PetRegionsResponse> = yield apiCall(Api.petApi, Api.petApi.updatePetRegions,
parseFloat(petId),
newRegions.map(p => p.toArray().map(p2 => (p2 ? parseFloat(p2) : null) as number)).toArray(),
);
let successReturnValue: any = undefined;
successReturnValue = petRegionsResponseRecordUtils.fromApiPassthrough(response);
yield put(updatePetRegionsSuccess(successReturnValue));
return successReturnValue;
} catch (error) {
if (markErrorsAsHandled) {error.wasHandled = true; }
yield put(updatePetRegionsFailure({error, requestPayload: _action_.payload}));
return error;
}
}
//endregion
//region updatePetWithForm
export interface PayloadUpdatePetWithForm extends PayloadUpdatePetWithFormRequest, BasePayloadApiAction {

View File

@@ -18,15 +18,7 @@ export class Api {
public static storeApi: StoreApi;
public static userApi: UserApi;
public static init(apiBasePath: string) {
const apiBaseConfig: ConfigurationParameters = {
basePath: apiBasePath,
credentials: "include",
headers: {
'Cache-Control': 'no-cache, no-store' // this is needed to prevent stalling issues in Chrome. Also it is a good behavior for api calls.
}
};
public static init(apiBaseConfig: ConfigurationParameters) {
Api.behaviorApi = new BehaviorApi(new Configuration(apiBaseConfig));
Api.petApi = new PetApi(new Configuration(apiBaseConfig));
Api.petPartApi = new PetPartApi(new Configuration(apiBaseConfig));

View File

@@ -281,7 +281,7 @@ export class UserApi extends runtime.BaseAPI {
* Logs out current logged in user session
*/
async logoutUser(initOverrides?: RequestInit): Promise<void> {
await this.logoutUserRaw(, initOverrides);
await this.logoutUserRaw(initOverrides);
}
/**

View File

@@ -61,6 +61,7 @@ class CategoryRecordUtils extends ApiRecordUtils<Category, CategoryRecord> {
public *toInlined(entityId?: string | null) {
if (!entityId) {return undefined; }
// @ts-ignore
const entity = yield select(apiEntityCategorySelector, {id: entityId});
if (!entity) {return undefined; }
@@ -82,6 +83,7 @@ class CategoryRecordUtils extends ApiRecordUtils<Category, CategoryRecord> {
if (!entityIds) {return null; }
let entities = List<CategoryRecord>();
for (let entityIndex = 0; entityIndex < entityIds.count(); entityIndex++) {
// @ts-ignore
const entity = yield call(this.toInlined, entityIds.get(entityIndex));
if (entity) {
entities.push(entity);

View File

@@ -0,0 +1,72 @@
/* tslint:disable */
/* eslint-disable */
/**
* OpenAPI Petstore
* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
*
* The version of the OpenAPI document: 1.0.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { exists, mapValues } from '../runtime';
import {
ResponseMeta,
ResponseMetaFromJSON,
ResponseMetaFromJSONTyped,
ResponseMetaToJSON,
} from './';
/**
*
* @export
* @interface GetPetRegionsResponse
*/
export interface GetPetRegionsResponse {
/**
*
* @type {ResponseMeta}
* @memberof GetPetRegionsResponse
*/
meta: ResponseMeta;
/**
* An array of all 15-minute time slots in 24 hours.
* @type {Array<Array<number>>}
* @memberof GetPetRegionsResponse
*/
data?: Array<Array<number>>;
}
export function GetPetRegionsResponseFromJSON(json: any): GetPetRegionsResponse {
return GetPetRegionsResponseFromJSONTyped(json, false);
}
export function GetPetRegionsResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): GetPetRegionsResponse {
if ((json === undefined) || (json === null)) {
return json;
}
return {
'meta': ResponseMetaFromJSON(json['meta']),
'data': !exists(json, 'data') ? undefined : json['data'],
};
}
export function GetPetRegionsResponseToJSON(value?: GetPetRegionsResponse | null): any {
if (value === undefined) {
return undefined;
}
if (value === null) {
return null;
}
return {
'meta': ResponseMetaToJSON(value.meta),
'data': value.data,
};
}

View File

@@ -0,0 +1,74 @@
/* tslint:disable */
/* eslint-disable */
/**
* OpenAPI Petstore
* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
*
* The version of the OpenAPI document: 1.0.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import {ApiRecordUtils, knownRecordFactories, appFromJS, NormalizedRecordEntities} from "../runtimeSagasAndRecords";
import {getApiEntitiesState} from "../ApiEntitiesSelectors"
import {List, Record, RecordOf, Map} from 'immutable';
import {Schema, schema, NormalizedSchema} from "normalizr";
import {select, call} from "redux-saga/effects";
import {
GetPetRegionsResponse,
} from './GetPetRegionsResponse';
import {
ResponseMeta,
} from './ResponseMeta';
import {
ResponseMetaRecord,
responseMetaRecordUtils
} from './ResponseMetaRecord';
export const GetPetRegionsResponseRecordProps = {
recType: "GetPetRegionsResponseApiRecord" as "GetPetRegionsResponseApiRecord",
meta: ResponseMetaRecord(),
data: null as List<List<string | null>> | null,
};
export type GetPetRegionsResponseRecordPropsType = typeof GetPetRegionsResponseRecordProps;
export const GetPetRegionsResponseRecord = Record(GetPetRegionsResponseRecordProps, GetPetRegionsResponseRecordProps.recType);
export type GetPetRegionsResponseRecord = RecordOf<GetPetRegionsResponseRecordPropsType>;
knownRecordFactories.set(GetPetRegionsResponseRecordProps.recType, GetPetRegionsResponseRecord);
class GetPetRegionsResponseRecordUtils extends ApiRecordUtils<GetPetRegionsResponse, GetPetRegionsResponseRecord> {
public normalize(apiObject: GetPetRegionsResponse, asEntity?: boolean): GetPetRegionsResponse {
(apiObject as any).recType = GetPetRegionsResponseRecordProps.recType;
responseMetaRecordUtils.normalize(apiObject.meta);
if (apiObject.data) { (apiObject as any).data = apiObject.data.map(item => item.map(item2 => item2?.toString())); }
return apiObject;
}
public toApi(record: GetPetRegionsResponseRecord): GetPetRegionsResponse {
const apiObject = super.toApi(record);
apiObject.meta = responseMetaRecordUtils.toApi(record.meta);
if (record.data) { apiObject.data = record.data.map(item => item.toArray().map(item2 => (item2 ? parseFloat(item2) : null) as number)).toArray(); }
return apiObject;
}
public fromApiPassthrough(apiObject: GetPetRegionsResponse): List<List<string | null>> {
return appFromJS(apiObject.data);
}
public fromApiPassthroughAsEntities(apiObject: GetPetRegionsResponse): NormalizedRecordEntities {
console.log("entities revival not supported on this response");
return {entities: {}, result: List<string>()};
}
}
export const getPetRegionsResponseRecordUtils = new GetPetRegionsResponseRecordUtils();

View File

@@ -66,6 +66,7 @@ class OrderRecordUtils extends ApiRecordUtils<Order, OrderRecord> {
public *toInlined(entityId?: string | null) {
if (!entityId) {return undefined; }
// @ts-ignore
const entity = yield select(apiEntityOrderSelector, {id: entityId});
if (!entity) {return undefined; }
@@ -87,6 +88,7 @@ class OrderRecordUtils extends ApiRecordUtils<Order, OrderRecord> {
if (!entityIds) {return null; }
let entities = List<OrderRecord>();
for (let entityIndex = 0; entityIndex < entityIds.count(); entityIndex++) {
// @ts-ignore
const entity = yield call(this.toInlined, entityIds.get(entityIndex));
if (entity) {
entities.push(entity);

View File

@@ -158,6 +158,12 @@ export interface Pet {
* @memberof Pet
*/
status: PetStatusEnum;
/**
* An array of all 15-minute time slots in 24 hours.
* @type {Array<Array<number>>}
* @memberof Pet
*/
regions?: Array<Array<number>>;
}
/**
@@ -200,6 +206,7 @@ export function PetFromJSONTyped(json: any, ignoreDiscriminator: boolean): Pet {
'tags': ((json['tags'] as Array<any>).map(TagFromJSON)),
'optionalTags': !exists(json, 'optionalTags') ? undefined : ((json['optionalTags'] as Array<any>).map(TagFromJSON)),
'status': json['status'],
'regions': !exists(json, 'regions') ? undefined : json['regions'],
};
}
@@ -232,6 +239,7 @@ export function PetToJSON(value?: Pet | null): any {
'tags': ((value.tags as Array<any>).map(TagToJSON)),
'optionalTags': value.optionalTags === undefined ? undefined : ((value.optionalTags as Array<any>).map(TagToJSON)),
'status': value.status,
'regions': value.regions,
};
}

View File

@@ -67,6 +67,7 @@ export const PetRecordProps = {
tags: (TagRecord(), List<TagRecord>()),
optionalTags: (TagRecord(), null as List<TagRecord> | null),
status: PetStatusEnum.Pending,
regions: null as List<List<string | null>> | null,
};
export type PetRecordPropsType = typeof PetRecordProps;
@@ -96,12 +97,13 @@ class PetRecordUtils extends ApiRecordUtils<Pet, PetRecord> {
(apiObject as any).recType = asEntity ? PetRecordEntityProps.recType : PetRecordProps.recType;
(apiObject as any).id = apiObject.id.toString();
if (apiObject.friendId) { (apiObject as any).friendId = apiObject.friendId.toString(); }
(apiObject as any).otherFriendIds = apiObject.otherFriendIds.map(item => item.toString());
(apiObject as any).otherFriendIds = apiObject.otherFriendIds.map(item => item?.toString());
categoryRecordUtils.normalize(apiObject.category);
if (apiObject.optionalCategory) { categoryRecordUtils.normalize(apiObject.optionalCategory); }
if (apiObject._entries) { categoryRecordUtils.normalizeArray(apiObject._entries); }
tagRecordUtils.normalizeArray(apiObject.tags);
if (apiObject.optionalTags) { tagRecordUtils.normalizeArray(apiObject.optionalTags); }
if (apiObject.regions) { (apiObject as any).regions = apiObject.regions.map(item => item.map(item2 => item2?.toString())); }
return apiObject;
}
@@ -117,6 +119,7 @@ class PetRecordUtils extends ApiRecordUtils<Pet, PetRecord> {
public *toInlined(entityId?: string | null) {
if (!entityId) {return undefined; }
// @ts-ignore
const entity = yield select(apiEntityPetSelector, {id: entityId});
if (!entity) {return undefined; }
@@ -131,10 +134,15 @@ class PetRecordUtils extends ApiRecordUtils<Pet, PetRecord> {
} = entity;
const entityProperties = {
// @ts-ignore
category: yield call(categoryRecordUtils.toInlined, entity.category),
// @ts-ignore
optionalCategory: entity.optionalCategory ? yield call(categoryRecordUtils.toInlined, entity.optionalCategory) : null,
// @ts-ignore
_entries: entity._entries ? yield call(categoryRecordUtils.toInlinedArray, entity._entries) : null,
// @ts-ignore
tags: yield call(tagRecordUtils.toInlinedArray, entity.tags),
// @ts-ignore
optionalTags: entity.optionalTags ? yield call(tagRecordUtils.toInlinedArray, entity.optionalTags) : null,
}
@@ -148,6 +156,7 @@ class PetRecordUtils extends ApiRecordUtils<Pet, PetRecord> {
if (!entityIds) {return null; }
let entities = List<PetRecord>();
for (let entityIndex = 0; entityIndex < entityIds.count(); entityIndex++) {
// @ts-ignore
const entity = yield call(this.toInlined, entityIds.get(entityIndex));
if (entity) {
entities.push(entity);
@@ -160,12 +169,13 @@ class PetRecordUtils extends ApiRecordUtils<Pet, PetRecord> {
const apiObject = super.toApi(record);
apiObject.id = parseFloat(record.id);
if (record.friendId) { apiObject.friendId = parseFloat(record.friendId); }
apiObject.otherFriendIds = record.otherFriendIds.map(item => parseFloat(item)).toArray();
apiObject.otherFriendIds = record.otherFriendIds.map(item => (item ? parseFloat(item) : null) as number).toArray();
apiObject.category = categoryRecordUtils.toApi(record.category);
if (record.optionalCategory) { apiObject.optionalCategory = categoryRecordUtils.toApi(record.optionalCategory); }
if (record._entries) { apiObject._entries = categoryRecordUtils.toApiArray(record._entries); }
apiObject.tags = tagRecordUtils.toApiArray(record.tags);
if (record.optionalTags) { apiObject.optionalTags = tagRecordUtils.toApiArray(record.optionalTags); }
if (record.regions) { apiObject.regions = record.regions.map(item => item.toArray().map(item2 => (item2 ? parseFloat(item2) : null) as number)).toArray(); }
return apiObject;
}
}

View File

@@ -0,0 +1,71 @@
/* tslint:disable */
/* eslint-disable */
/**
* OpenAPI Petstore
* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
*
* The version of the OpenAPI document: 1.0.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { exists, mapValues } from '../runtime';
import {
ResponseMeta,
ResponseMetaFromJSON,
ResponseMetaFromJSONTyped,
ResponseMetaToJSON,
} from './';
/**
*
* @export
* @interface PetRegionsResponse
*/
export interface PetRegionsResponse {
/**
*
* @type {ResponseMeta}
* @memberof PetRegionsResponse
*/
meta: ResponseMeta;
/**
* An array of all 15-minute time slots in 24 hours.
* @type {Array<Array<number>>}
* @memberof PetRegionsResponse
*/
data?: Array<Array<number>>;
}
export function PetRegionsResponseFromJSON(json: any): PetRegionsResponse {
return PetRegionsResponseFromJSONTyped(json, false);
}
export function PetRegionsResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): PetRegionsResponse {
if ((json === undefined) || (json === null)) {
return json;
}
return {
'meta': ResponseMetaFromJSON(json['meta']),
'data': !exists(json, 'data') ? undefined : json['data'],
};
}
export function PetRegionsResponseToJSON(value?: PetRegionsResponse | null): any {
if (value === undefined) {
return undefined;
}
if (value === null) {
return null;
}
return {
'meta': ResponseMetaToJSON(value.meta),
'data': value.data,
};
}

View File

@@ -0,0 +1,74 @@
/* tslint:disable */
/* eslint-disable */
/**
* OpenAPI Petstore
* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
*
* The version of the OpenAPI document: 1.0.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import {ApiRecordUtils, knownRecordFactories, appFromJS, NormalizedRecordEntities} from "../runtimeSagasAndRecords";
import {getApiEntitiesState} from "../ApiEntitiesSelectors"
import {List, Record, RecordOf, Map} from 'immutable';
import {Schema, schema, NormalizedSchema} from "normalizr";
import {select, call} from "redux-saga/effects";
import {
PetRegionsResponse,
} from './PetRegionsResponse';
import {
ResponseMeta,
} from './ResponseMeta';
import {
ResponseMetaRecord,
responseMetaRecordUtils
} from './ResponseMetaRecord';
export const PetRegionsResponseRecordProps = {
recType: "PetRegionsResponseApiRecord" as "PetRegionsResponseApiRecord",
meta: ResponseMetaRecord(),
data: null as List<List<string | null>> | null,
};
export type PetRegionsResponseRecordPropsType = typeof PetRegionsResponseRecordProps;
export const PetRegionsResponseRecord = Record(PetRegionsResponseRecordProps, PetRegionsResponseRecordProps.recType);
export type PetRegionsResponseRecord = RecordOf<PetRegionsResponseRecordPropsType>;
knownRecordFactories.set(PetRegionsResponseRecordProps.recType, PetRegionsResponseRecord);
class PetRegionsResponseRecordUtils extends ApiRecordUtils<PetRegionsResponse, PetRegionsResponseRecord> {
public normalize(apiObject: PetRegionsResponse, asEntity?: boolean): PetRegionsResponse {
(apiObject as any).recType = PetRegionsResponseRecordProps.recType;
responseMetaRecordUtils.normalize(apiObject.meta);
if (apiObject.data) { (apiObject as any).data = apiObject.data.map(item => item.map(item2 => item2?.toString())); }
return apiObject;
}
public toApi(record: PetRegionsResponseRecord): PetRegionsResponse {
const apiObject = super.toApi(record);
apiObject.meta = responseMetaRecordUtils.toApi(record.meta);
if (record.data) { apiObject.data = record.data.map(item => item.toArray().map(item2 => (item2 ? parseFloat(item2) : null) as number)).toArray(); }
return apiObject;
}
public fromApiPassthrough(apiObject: PetRegionsResponse): List<List<string | null>> {
return appFromJS(apiObject.data);
}
public fromApiPassthroughAsEntities(apiObject: PetRegionsResponse): NormalizedRecordEntities {
console.log("entities revival not supported on this response");
return {entities: {}, result: List<string>()};
}
}
export const petRegionsResponseRecordUtils = new PetRegionsResponseRecordUtils();

View File

@@ -61,6 +61,7 @@ class TagRecordUtils extends ApiRecordUtils<Tag, TagRecord> {
public *toInlined(entityId?: string | null) {
if (!entityId) {return undefined; }
// @ts-ignore
const entity = yield select(apiEntityTagSelector, {id: entityId});
if (!entity) {return undefined; }
@@ -82,6 +83,7 @@ class TagRecordUtils extends ApiRecordUtils<Tag, TagRecord> {
if (!entityIds) {return null; }
let entities = List<TagRecord>();
for (let entityIndex = 0; entityIndex < entityIds.count(); entityIndex++) {
// @ts-ignore
const entity = yield call(this.toInlined, entityIds.get(entityIndex));
if (entity) {
entities.push(entity);

View File

@@ -69,6 +69,7 @@ class UserRecordUtils extends ApiRecordUtils<User, UserRecord> {
public *toInlined(entityId?: string | null) {
if (!entityId) {return undefined; }
// @ts-ignore
const entity = yield select(apiEntityUserSelector, {id: entityId});
if (!entity) {return undefined; }
@@ -90,6 +91,7 @@ class UserRecordUtils extends ApiRecordUtils<User, UserRecord> {
if (!entityIds) {return null; }
let entities = List<UserRecord>();
for (let entityIndex = 0; entityIndex < entityIds.count(); entityIndex++) {
// @ts-ignore
const entity = yield call(this.toInlined, entityIds.get(entityIndex));
if (entity) {
entities.push(entity);

View File

@@ -34,6 +34,8 @@ export * from './PartRecord';
export * from './Pet';
export * from './PetRecord';
export * from './PetPartType';
export * from './PetRegionsResponse';
export * from './PetRegionsResponseRecord';
export * from './ResponseMeta';
export * from './ResponseMetaRecord';
export * from './Tag';