organizeOpenApi function

Map<String, dynamic> organizeOpenApi(
  1. Map<String, dynamic> document
)

Implementation

Map<String, dynamic> organizeOpenApi(Map<String, dynamic> document) {
  final schemas = <String, dynamic>{};

  Map<String, dynamic> resolveSchema(Map<String, dynamic> schema) {
    final properties = schema['properties'] as Map<String, dynamic>? ?? const {};
    final items = schema['items'] as Map<String, dynamic>?;
    schema = {
      ...schema,
      if (properties.isNotEmpty)
        'properties': properties.map((key, value) {
          return MapEntry(key, resolveSchema(value as Map<String, dynamic>));
        }),
      if (items != null) 'items': resolveSchema(items),
    };

    final title = schema['title'] as String?;
    if (title != null) {
      schemas[title] = schema;
      return {r'$ref': '#/components/schemas/$title'};
    }
    return schema;
  }

  Map<String, dynamic> resolveMedia(Map<String, dynamic> data) {
    return data.map((key, content) {
      if (key == 'content') {
        content as Map<String, dynamic>?;
        return MapEntry(
          key,
          content?.map((type, media) {
            media as Map<String, dynamic>?;
            return MapEntry(
              type,
              media?.map((key, value) {
                if (key == 'schema') {
                  return MapEntry(key, resolveSchema(value as Map<String, dynamic>));
                }
                return MapEntry(key, value);
              }),
            );
          }),
        );
      }
      return MapEntry(key, content);
    });
  }

  return {
    ...document,
    'paths': (document['paths'] as Map<String, dynamic>).map((path, endPoint) {
      final newEndpoint = (endPoint as Map<String, dynamic>).map((operationId, operation) {
        operation as Map<String, dynamic>;
        final requestBody = operation['requestBody'] as Map<String, dynamic>?;
        final responses = operation['responses'] as Map<String, dynamic>?;

        return MapEntry(operationId, {
          ...operation,
          if (requestBody != null) 'requestBody': resolveMedia(requestBody),
          if (responses != null)
            'responses': responses.map((code, media) {
              return MapEntry(code, resolveMedia(media));
            }),
        });
      });
      return MapEntry(path, newEndpoint);
    }),
    if (schemas.isNotEmpty) 'components': {'schemas': schemas},
  };
}