@@ -702,7 +702,7 @@ func (res *resource) handleReplaceRelation(c APIContexter, w http.ResponseWriter
702702 editObj = response .Result ()
703703 }
704704
705- err = jsonapi . UnmarshalRelationshipsData ( editObj , relation .Name , data )
705+ err = processRelationshipsData ( data , relation .Name , editObj )
706706 if err != nil {
707707 return err
708708 }
@@ -1101,3 +1101,57 @@ func handleError(err error, w http.ResponseWriter, r *http.Request, marshalers m
11011101
11021102 writeResult (w , []byte (marshaler .MarshalError (err )), http .StatusInternalServerError , contentType )
11031103}
1104+
1105+ func processRelationshipsData (data interface {}, linkName string , target interface {}) error {
1106+ hasOne , ok := data .(map [string ]interface {})
1107+ if ok {
1108+ hasOneID , ok := hasOne ["id" ].(string )
1109+ if ! ok {
1110+ return fmt .Errorf ("data object must have a field id for %s" , linkName )
1111+ }
1112+
1113+ target , ok := target .(jsonapi.UnmarshalToOneRelations )
1114+ if ! ok {
1115+ return errors .New ("target struct must implement interface UnmarshalToOneRelations" )
1116+ }
1117+
1118+ target .SetToOneReferenceID (linkName , hasOneID )
1119+ } else if data == nil {
1120+ // this means that a to-one relationship must be deleted
1121+ target , ok := target .(jsonapi.UnmarshalToOneRelations )
1122+ if ! ok {
1123+ return errors .New ("target struct must implement interface UnmarshalToOneRelations" )
1124+ }
1125+
1126+ target .SetToOneReferenceID (linkName , "" )
1127+ } else {
1128+ hasMany , ok := data .([]interface {})
1129+ if ! ok {
1130+ return fmt .Errorf ("invalid data object or array, must be an object with \" id\" and \" type\" field for %s" , linkName )
1131+ }
1132+
1133+ target , ok := target .(jsonapi.UnmarshalToManyRelations )
1134+ if ! ok {
1135+ return errors .New ("target struct must implement interface UnmarshalToManyRelations" )
1136+ }
1137+
1138+ hasManyIDs := []string {}
1139+
1140+ for _ , entry := range hasMany {
1141+ data , ok := entry .(map [string ]interface {})
1142+ if ! ok {
1143+ return fmt .Errorf ("entry in data array must be an object for %s" , linkName )
1144+ }
1145+ dataID , ok := data ["id" ].(string )
1146+ if ! ok {
1147+ return fmt .Errorf ("all data objects must have a field id for %s" , linkName )
1148+ }
1149+
1150+ hasManyIDs = append (hasManyIDs , dataID )
1151+ }
1152+
1153+ target .SetToManyReferenceIDs (linkName , hasManyIDs )
1154+ }
1155+
1156+ return nil
1157+ }
0 commit comments