From 5bad6348420e0799dce84f619605cebd895010e5 Mon Sep 17 00:00:00 2001 From: jld3103 Date: Fri, 14 Oct 2022 00:49:28 +0200 Subject: [PATCH] dynamite,nextcloud: Parse oneOf, anyOf and allOf more strictly --- .../dynamite/lib/src/openapi_builder.dart | 34 +++++++++++-- .../nextcloud/lib/src/nextcloud.openapi.dart | 4 +- .../lib/src/nextcloud.openapi.g.dart | 49 +++++++++++++------ 3 files changed, 68 insertions(+), 19 deletions(-) diff --git a/packages/dynamite/lib/src/openapi_builder.dart b/packages/dynamite/lib/src/openapi_builder.dart index 8e7220fb..c90dd500 100644 --- a/packages/dynamite/lib/src/openapi_builder.dart +++ b/packages/dynamite/lib/src/openapi_builder.dart @@ -225,6 +225,7 @@ class OpenAPIBuilder implements Builder { final String identifier, final Schema schema, { final bool ignoreEnum = false, + final Map? extraJsonSerializableValues, }) { TypeResolveResult? result; if (schema.ref != null) { @@ -232,13 +233,26 @@ class OpenAPIBuilder implements Builder { result = resolveType( name, spec.components!.schemas![name]!, + extraJsonSerializableValues: extraJsonSerializableValues, ); } else if (schema.ofs != null) { if (!resolvedTypes.contains(identifier)) { resolvedTypes.add(identifier); - final results = - schema.ofs!.map((final s) => resolveType('$identifier${schema.ofs!.indexOf(s)}', s)).toList(); + final results = schema.ofs! + .map( + (final s) => resolveType( + '$identifier${schema.ofs!.indexOf(s)}', + s, + extraJsonSerializableValues: { + 'disallowUnrecognizedKeys': 'true', + if (extraJsonSerializableValues != null) ...{ + ...extraJsonSerializableValues, + }, + }, + ), + ) + .toList(); output.add( Class( @@ -383,6 +397,7 @@ class OpenAPIBuilder implements Builder { final subResult = resolveType( identifier, schema.items!, + extraJsonSerializableValues: extraJsonSerializableValues, ); result = TypeResolveResult( 'List<${subResult.typeName}>', @@ -425,7 +440,18 @@ class OpenAPIBuilder implements Builder { '/// ${schema.description!}', ], ]) - ..annotations.add(refer('JsonSerializable').call([])) + ..annotations.add( + refer('JsonSerializable').call( + [], + { + if (extraJsonSerializableValues != null) ...{ + for (final key in extraJsonSerializableValues.keys) ...{ + key: refer(extraJsonSerializableValues[key]!), + }, + }, + }, + ), + ) ..constructors.addAll( [ Constructor( @@ -476,6 +502,7 @@ class OpenAPIBuilder implements Builder { uppercaseFirstCharacter: true, ), schema.properties![propertyName]!, + extraJsonSerializableValues: extraJsonSerializableValues, ); final propertySchema = schema.properties![propertyName]!; @@ -554,6 +581,7 @@ class OpenAPIBuilder implements Builder { '$identifier${_toDartName(value.toString(), uppercaseFirstCharacter: true)}', schema, ignoreEnum: true, + extraJsonSerializableValues: extraJsonSerializableValues, ); b ..name = _toDartName(value.toString()) diff --git a/packages/nextcloud/lib/src/nextcloud.openapi.dart b/packages/nextcloud/lib/src/nextcloud.openapi.dart index 39b20a09..b5932631 100644 --- a/packages/nextcloud/lib/src/nextcloud.openapi.dart +++ b/packages/nextcloud/lib/src/nextcloud.openapi.dart @@ -3223,7 +3223,7 @@ class UserStatusClearAtTime { // coverage:ignore-end } -@JsonSerializable() +@JsonSerializable(disallowUnrecognizedKeys: true) class UserStatusClearAt { UserStatusClearAt({ this.type, @@ -3422,7 +3422,7 @@ class UserStatusFindStatus { // coverage:ignore-end } -@JsonSerializable() +@JsonSerializable(disallowUnrecognizedKeys: true) class UserStatus { UserStatus({ this.userId, diff --git a/packages/nextcloud/lib/src/nextcloud.openapi.g.dart b/packages/nextcloud/lib/src/nextcloud.openapi.g.dart index 4f09c96e..4a0dd648 100644 --- a/packages/nextcloud/lib/src/nextcloud.openapi.g.dart +++ b/packages/nextcloud/lib/src/nextcloud.openapi.g.dart @@ -1507,10 +1507,16 @@ Map _$ProvisioningApiUserToJson(ProvisioningApiUser instance) = 'ocs': instance.ocs?.toJson(), }; -UserStatusClearAt _$UserStatusClearAtFromJson(Map json) => UserStatusClearAt( - type: $enumDecodeNullable(_$UserStatusClearAtTypeEnumMap, json['type']), - time: json['time'] == null ? null : UserStatusClearAtTime.fromJson(json['time']), - ); +UserStatusClearAt _$UserStatusClearAtFromJson(Map json) { + $checkKeys( + json, + allowedKeys: const ['type', 'time'], + ); + return UserStatusClearAt( + type: $enumDecodeNullable(_$UserStatusClearAtTypeEnumMap, json['type']), + time: json['time'] == null ? null : UserStatusClearAtTime.fromJson(json['time']), + ); +} Map _$UserStatusClearAtToJson(UserStatusClearAt instance) => { 'type': _$UserStatusClearAtTypeEnumMap[instance.type], @@ -1586,16 +1592,31 @@ Map _$UserStatusFindStatusToJson(UserStatusFindStatus instance) 'ocs': instance.ocs?.toJson(), }; -UserStatus _$UserStatusFromJson(Map json) => UserStatus( - userId: json['userId'] as String?, - message: json['message'] as String?, - messageId: json['messageId'] as String?, - messageIsPredefined: json['messageIsPredefined'] as bool?, - icon: json['icon'] as String?, - clearAt: json['clearAt'] == null ? null : UserStatusClearAtWrap.fromJson(json['clearAt']), - status: $enumDecodeNullable(_$UserStatusTypeEnumMap, json['status']), - statusIsUserDefined: json['statusIsUserDefined'] as bool?, - ); +UserStatus _$UserStatusFromJson(Map json) { + $checkKeys( + json, + allowedKeys: const [ + 'userId', + 'message', + 'messageId', + 'messageIsPredefined', + 'icon', + 'clearAt', + 'status', + 'statusIsUserDefined' + ], + ); + return UserStatus( + userId: json['userId'] as String?, + message: json['message'] as String?, + messageId: json['messageId'] as String?, + messageIsPredefined: json['messageIsPredefined'] as bool?, + icon: json['icon'] as String?, + clearAt: json['clearAt'] == null ? null : UserStatusClearAtWrap.fromJson(json['clearAt']), + status: $enumDecodeNullable(_$UserStatusTypeEnumMap, json['status']), + statusIsUserDefined: json['statusIsUserDefined'] as bool?, + ); +} Map _$UserStatusToJson(UserStatus instance) => { 'userId': instance.userId,