Skip to content

'multipart/form-data' formatter isn't recursive #462

Open
@Clovel

Description

@Clovel

When using a multipart/form-data content type, the generated API code provides a private function to format certain types : contentFormatters.

Currently on version 12.0.2 the function is :

private contentFormatters: Record<ContentType, (input: any) => any> = {
  [ContentType.Json]: (input: any) =>
    input !== null && (typeof input === "object" || typeof input === "string") ? JSON.stringify(input) : input,
  [ContentType.FormData]: (input: any) =>
    Object.keys(input || {}).reduce((formData, key) => {
      const property = input[key];
      formData.append(
        key,
        property instanceof Blob
          ? property
          : typeof property === "object" && property !== null
          ? JSON.stringify(property)
          : `${property}`,
      );
      return formData;
    }, new FormData()),
  [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input),
};

If we concentrate on the ContentType.FormData section of the formatter, we have

(input: any) =>
    Object.keys(input || {}).reduce((formData, key) => {
      const property = input[key];
      formData.append(
        key,
        property instanceof Blob
          ? property
          : typeof property === "object" && property !== null
          ? JSON.stringify(property)
          : `${property}`,
      );
      return formData;
    }, new FormData()),

This section is no recursive on objects.

For example, if my backend expects the following type for the payload

interface PayloadWithData {
  items: {
    name: string;
    content: Blob;
    appSpecificData: '1234567896',
  }[];
}

The files aren't correctly set in the fetch request because they aren't serializable.

This should be updated to support File in subfields of the payload type.

EDIT 1 : Indentation
EDIT 2 : this looks like it's the continuation of the work done here : #293
EDIT 3 : Typo

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions