From 1429cdece5f0ec3ab297b9f9549b2774828f82c3 Mon Sep 17 00:00:00 2001 From: jld3103 Date: Tue, 24 Oct 2023 19:35:26 +0200 Subject: [PATCH] feat(dynamite): Support content in parameters Signed-off-by: jld3103 --- .../dynamite/lib/src/models/openapi.g.dart | 2 + .../lib/src/models/openapi/parameter.dart | 35 +++++++++++- .../lib/src/models/openapi/parameter.g.dart | 53 ++++++++++++++----- 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/packages/dynamite/dynamite/lib/src/models/openapi.g.dart b/packages/dynamite/dynamite/lib/src/models/openapi.g.dart index 7138f5f5..fa202117 100644 --- a/packages/dynamite/dynamite/lib/src/models/openapi.g.dart +++ b/packages/dynamite/dynamite/lib/src/models/openapi.g.dart @@ -63,6 +63,8 @@ Serializers _$serializers = (Serializers().toBuilder() const FullType(BuiltMap, [FullType(String), FullType(MediaType)]), () => MapBuilder()) ..addBuilderFactory( const FullType(BuiltMap, [FullType(String), FullType(MediaType)]), () => MapBuilder()) + ..addBuilderFactory( + const FullType(BuiltMap, [FullType(String), FullType(MediaType)]), () => MapBuilder()) ..addBuilderFactory( const FullType(BuiltMap, [FullType(String), FullType(Header)]), () => MapBuilder()) ..addBuilderFactory(const FullType(BuiltMap, [FullType(String), FullType(SecurityScheme)]), diff --git a/packages/dynamite/dynamite/lib/src/models/openapi/parameter.dart b/packages/dynamite/dynamite/lib/src/models/openapi/parameter.dart index 755d6443..35ff7490 100644 --- a/packages/dynamite/dynamite/lib/src/models/openapi/parameter.dart +++ b/packages/dynamite/dynamite/lib/src/models/openapi/parameter.dart @@ -4,6 +4,7 @@ import 'package:built_value/serializer.dart'; import 'package:dynamite/src/helpers/dart_helpers.dart'; import 'package:dynamite/src/helpers/docs.dart'; import 'package:dynamite/src/models/exceptions.dart'; +import 'package:dynamite/src/models/openapi/media_type.dart'; import 'package:dynamite/src/models/openapi/schema.dart'; part 'parameter.g.dart'; @@ -25,7 +26,33 @@ abstract class Parameter implements Built { bool get required; - Schema? get schema; + @Deprecated('Use [schema] instead which also automatically handles [content].') + @BuiltValueField(wireName: 'schema') + Schema? get $schema; + + BuiltMap? get content; + + Schema? get schema { + // ignore: deprecated_member_use_from_same_package + if ($schema != null) { + // ignore: deprecated_member_use_from_same_package + return $schema; + } + + if (content != null && content!.isNotEmpty) { + if (content!.length > 1) { + print('Can not work with multiple mime types right now. Using the first supported.'); + } + return Schema( + (final b) => b + ..type = SchemaType.string + ..contentMediaType = content!.entries.first.key + ..contentSchema = content!.entries.first.value.schema!.toBuilder(), + ); + } + + return null; + } @BuiltValueHook(finalizeBuilder: true) static void _defaults(final ParameterBuilder b) { @@ -34,9 +61,13 @@ abstract class Parameter implements Built { throw OpenAPISpecError('Path parameters must be required but ${b.name} is not.'); } - if (b.required! && b.schema.$default != null) { + if (b.required! && b._$schema != null && b.$schema.$default != null) { print('Required parameters should not specify default values.'); } + + if (b._$schema != null && b._content != null) { + throw OpenAPISpecError('Only one of schema or content must be set in parameter ${b.name}.'); + } } String get formattedDescription { diff --git a/packages/dynamite/dynamite/lib/src/models/openapi/parameter.g.dart b/packages/dynamite/dynamite/lib/src/models/openapi/parameter.g.dart index bf432d92..28c1a7b5 100644 --- a/packages/dynamite/dynamite/lib/src/models/openapi/parameter.g.dart +++ b/packages/dynamite/dynamite/lib/src/models/openapi/parameter.g.dart @@ -60,12 +60,19 @@ class _$ParameterSerializer implements StructuredSerializer { ..add('description') ..add(serializers.serialize(value, specifiedType: const FullType(String))); } - value = object.schema; + value = object.$schema; if (value != null) { result ..add('schema') ..add(serializers.serialize(value, specifiedType: const FullType(Schema))); } + value = object.content; + if (value != null) { + result + ..add('content') + ..add(serializers.serialize(value, + specifiedType: const FullType(BuiltMap, [FullType(String), FullType(MediaType)]))); + } return result; } @@ -93,7 +100,11 @@ class _$ParameterSerializer implements StructuredSerializer { result.required = serializers.deserialize(value, specifiedType: const FullType(bool))! as bool; break; case 'schema': - result.schema.replace(serializers.deserialize(value, specifiedType: const FullType(Schema))! as Schema); + result.$schema.replace(serializers.deserialize(value, specifiedType: const FullType(Schema))! as Schema); + break; + case 'content': + result.content.replace(serializers.deserialize(value, + specifiedType: const FullType(BuiltMap, [FullType(String), FullType(MediaType)]))!); break; } } @@ -128,11 +139,14 @@ class _$Parameter extends Parameter { @override final bool required; @override - final Schema? schema; + final Schema? $schema; + @override + final BuiltMap? content; factory _$Parameter([void Function(ParameterBuilder)? updates]) => (ParameterBuilder()..update(updates))._build(); - _$Parameter._({required this.name, required this.$in, this.description, required this.required, this.schema}) + _$Parameter._( + {required this.name, required this.$in, this.description, required this.required, this.$schema, this.content}) : super._() { BuiltValueNullFieldError.checkNotNull(name, r'Parameter', 'name'); BuiltValueNullFieldError.checkNotNull($in, r'Parameter', '\$in'); @@ -152,7 +166,8 @@ class _$Parameter extends Parameter { name == other.name && $in == other.$in && required == other.required && - schema == other.schema; + $schema == other.$schema && + content == other.content; } @override @@ -161,7 +176,8 @@ class _$Parameter extends Parameter { _$hash = $jc(_$hash, name.hashCode); _$hash = $jc(_$hash, $in.hashCode); _$hash = $jc(_$hash, required.hashCode); - _$hash = $jc(_$hash, schema.hashCode); + _$hash = $jc(_$hash, $schema.hashCode); + _$hash = $jc(_$hash, content.hashCode); _$hash = $jf(_$hash); return _$hash; } @@ -173,7 +189,8 @@ class _$Parameter extends Parameter { ..add('\$in', $in) ..add('description', description) ..add('required', required) - ..add('schema', schema)) + ..add('\$schema', $schema) + ..add('content', content)) .toString(); } } @@ -197,9 +214,13 @@ class ParameterBuilder implements Builder { bool? get required => _$this._required; set required(bool? required) => _$this._required = required; - SchemaBuilder? _schema; - SchemaBuilder get schema => _$this._schema ??= SchemaBuilder(); - set schema(SchemaBuilder? schema) => _$this._schema = schema; + SchemaBuilder? _$schema; + SchemaBuilder get $schema => _$this._$schema ??= SchemaBuilder(); + set $schema(SchemaBuilder? $schema) => _$this._$schema = $schema; + + MapBuilder? _content; + MapBuilder get content => _$this._content ??= MapBuilder(); + set content(MapBuilder? content) => _$this._content = content; ParameterBuilder(); @@ -210,7 +231,8 @@ class ParameterBuilder implements Builder { _$in = $v.$in; _description = $v.description; _required = $v.required; - _schema = $v.schema?.toBuilder(); + _$schema = $v.$schema?.toBuilder(); + _content = $v.content?.toBuilder(); _$v = null; } return this; @@ -240,12 +262,15 @@ class ParameterBuilder implements Builder { $in: BuiltValueNullFieldError.checkNotNull($in, r'Parameter', '\$in'), description: description, required: BuiltValueNullFieldError.checkNotNull(required, r'Parameter', 'required'), - schema: _schema?.build()); + $schema: _$schema?.build(), + content: _content?.build()); } catch (_) { late String _$failedField; try { - _$failedField = 'schema'; - _schema?.build(); + _$failedField = '\$schema'; + _$schema?.build(); + _$failedField = 'content'; + _content?.build(); } catch (e) { throw BuiltValueNestedFieldError(r'Parameter', _$failedField, e.toString()); }