Skip to content

Commit

Permalink
Merge pull request #199 from ba-st/json-mapping-defaults
Browse files Browse the repository at this point in the history
Json mapping defaults
  • Loading branch information
ytsejam78 authored Sep 27, 2024
2 parents 7ada0ab + c7a09c8 commit 68cc6f1
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,30 @@ PetOrdersRESTfulControllerTest >> testOverlyComplexOrderCreation [
assert: order date equals: '2018-10-24T18:05:46.418Z'
]

{ #category : 'tests - orders' }
PetOrdersRESTfulControllerTest >> testOverlyComplexOrderCreationWithoutSpecifyingStatusUsesDefaultValue [

| response order |

response := resourceController
createOrderBasedOn: ( self requestToPOSTAsOverlyComplexOrder:
'{"date":"2018-10-24T18:05:46.418Z","pet":{"alternativeName":"Fido","itsType":"Dog"}}' )
within: self newHttpRequestContext.

self
assert: response isSuccess;
assert: response status equals: 201;
assertUrl: response location equals: 'https://petstore.example.com/orders/1';
assert: response hasEntity;
assert: orderRepository count equals: 1.
order := orderRepository findAll first.
self
assert: order pet name equals: 'Fido';
assert: order pet type equals: 'Dog';
assert: order pet status equals: 'UNKNOWN';
assert: order date equals: '2018-10-24T18:05:46.418Z'
]

{ #category : 'tests' }
PetOrdersRESTfulControllerTest >> testRoutes [

Expand Down
3 changes: 2 additions & 1 deletion source/Stargate-Examples/PetOrdersRESTfulController.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ PetOrdersRESTfulController >> configureOverlyComplexOrderDecodingOn: reader [
mapProperty: #theStatus as: #Status.
mapping
mapCreationSending: #named:ofType:withStatus:
withArguments: { #alternativeName. #itsType. #theStatus }
withArguments: { #alternativeName. #itsType. #theStatus };
argumentNamed: #theStatus defaultingTo: 'UNKNOWN'
].
reader for: PetOrder createInstanceUsing: [ :mapping |
mapping
Expand Down
53 changes: 36 additions & 17 deletions source/Stargate-NeoJSON-Extensions/InstanceCreationMapping.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,25 @@ Class {
#superclass : 'NeoJSONObjectMapping',
#instVars : [
'instanceCreationSelector',
'argumentNames'
'argumentNames',
'defaultsByArgumentName'
],
#category : 'Stargate-NeoJSON-Extensions',
#package : 'Stargate-NeoJSON-Extensions'
}

{ #category : 'mapping' }
InstanceCreationMapping >> argumentNamed: anArgumentName defaultingTo: aValue [

defaultsByArgumentName at: anArgumentName put: aValue
]

{ #category : 'private' }
InstanceCreationMapping >> defaultFor: argumentName ifAbsent: aBlock [

^ defaultsByArgumentName at: argumentName ifAbsent: aBlock
]

{ #category : 'private' }
InstanceCreationMapping >> errorDescriptionForMissing: propertyNames [

Expand All @@ -40,8 +53,9 @@ InstanceCreationMapping >> errorDescriptionForMissing: propertyNames [
{ #category : 'mapping' }
InstanceCreationMapping >> mapCreationSending: anInstanceCreationSelector withArguments: anArgumentCollection [

instanceCreationSelector := anInstanceCreationSelector.
argumentNames := anArgumentCollection
instanceCreationSelector := anInstanceCreationSelector.
argumentNames := anArgumentCollection.
defaultsByArgumentName := Dictionary new
]

{ #category : 'mapping' }
Expand All @@ -62,20 +76,25 @@ InstanceCreationMapping >> mapProperty: aKey as: aValueSchema [
{ #category : 'parsing' }
InstanceCreationMapping >> readFrom: jsonReader [

| argumentByName arguments missingArguments |

argumentByName := Dictionary new.
jsonReader parseMapKeysDo: [ :key |
( self propertyNamed: key ifAbsent: [ nil ] )
ifNil: [ "read, skip & ignore value" jsonReader next ]
ifNotNil: [ :mapping | mapping readObject: argumentByName from: jsonReader ]
].
| argumentByName arguments missingArguments |
argumentByName := Dictionary new.
jsonReader parseMapKeysDo: [ :key |
( self propertyNamed: key ifAbsent: [ nil ] )
ifNil: [ "read, skip & ignore value" jsonReader next ]
ifNotNil: [ :mapping | mapping readObject: argumentByName from: jsonReader ]
].

missingArguments := OrderedCollection new.
arguments := argumentNames collect: [ :argumentName |
argumentByName at: argumentName ifAbsent: [ missingArguments add: argumentName ] ].
missingArguments ifNotEmpty: [
jsonReader error: ( self errorDescriptionForMissing: missingArguments ) ].
missingArguments := OrderedCollection new.
arguments := argumentNames collect: [ :argumentName |
argumentByName
at: argumentName
ifAbsent: [
self
defaultFor: argumentName
ifAbsent: [ missingArguments add: argumentName ] ]
].
missingArguments ifNotEmpty: [
jsonReader error: ( self errorDescriptionForMissing: missingArguments ) ].

^ subjectClass perform: instanceCreationSelector withArguments: arguments
^ subjectClass perform: instanceCreationSelector withArguments: arguments
]

0 comments on commit 68cc6f1

Please sign in to comment.