mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-17 15:03:07 +00:00
Merge pull request #1533 from atmire/w2p-87624_Issue-1532_Issue-resource-policy-edit-patches
Fix so newly added value on resource policy result in ADD patch, not REPLACE
This commit is contained in:
@@ -3,7 +3,7 @@ import { compare } from 'fast-json-patch';
|
||||
import { Operation } from 'fast-json-patch';
|
||||
import { getClassForType } from '../cache/builders/build-decorators';
|
||||
import { TypedObject } from '../cache/object-cache.reducer';
|
||||
import { DSpaceSerializer } from '../dspace-rest/dspace.serializer';
|
||||
import { DSpaceNotNullSerializer } from '../dspace-rest/dspace-not-null.serializer';
|
||||
import { ChangeAnalyzer } from './change-analyzer';
|
||||
|
||||
/**
|
||||
@@ -22,8 +22,8 @@ export class DefaultChangeAnalyzer<T extends TypedObject> implements ChangeAnaly
|
||||
* The second object to compare
|
||||
*/
|
||||
diff(object1: T, object2: T): Operation[] {
|
||||
const serializer1 = new DSpaceSerializer(getClassForType(object1.type));
|
||||
const serializer2 = new DSpaceSerializer(getClassForType(object2.type));
|
||||
const serializer1 = new DSpaceNotNullSerializer(getClassForType(object1.type));
|
||||
const serializer2 = new DSpaceNotNullSerializer(getClassForType(object2.type));
|
||||
return compare(serializer1.serialize(object1), serializer2.serialize(object2));
|
||||
}
|
||||
}
|
||||
|
76
src/app/core/dspace-rest/dspace-not-null.serializer.ts
Normal file
76
src/app/core/dspace-rest/dspace-not-null.serializer.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import { Deserialize, Serialize } from 'cerialize';
|
||||
|
||||
import { Serializer } from '../serializer';
|
||||
import { GenericConstructor } from '../shared/generic-constructor';
|
||||
|
||||
/**
|
||||
* This Serializer turns responses from DSpace's REST API
|
||||
* to models and vice versa, but with all fields with null value removed for the Serialized objects
|
||||
*/
|
||||
export class DSpaceNotNullSerializer<T> implements Serializer<T> {
|
||||
|
||||
/**
|
||||
* Create a new DSpaceNotNullSerializer instance
|
||||
*
|
||||
* @param modelType a class or interface to indicate
|
||||
* the kind of model this serializer should work with
|
||||
*/
|
||||
constructor(private modelType: GenericConstructor<T>) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a model in to the format expected by the backend, but with all fields with null value removed
|
||||
*
|
||||
* @param model The model to serialize
|
||||
* @returns An object to send to the backend
|
||||
*/
|
||||
serialize(model: T): any {
|
||||
return getSerializedObjectWithoutNullFields(Serialize(model, this.modelType));
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an array of models in to the format expected by the backend, but with all fields with null value removed
|
||||
*
|
||||
* @param models The array of models to serialize
|
||||
* @returns An object to send to the backend
|
||||
*/
|
||||
serializeArray(models: T[]): any {
|
||||
return getSerializedObjectWithoutNullFields(Serialize(models, this.modelType));
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a response from the backend in to a model.
|
||||
*
|
||||
* @param response An object returned by the backend
|
||||
* @returns a model of type T
|
||||
*/
|
||||
deserialize(response: any): T {
|
||||
if (Array.isArray(response)) {
|
||||
throw new Error('Expected a single model, use deserializeArray() instead');
|
||||
}
|
||||
return Deserialize(response, this.modelType) as T;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a response from the backend in to an array of models
|
||||
*
|
||||
* @param response An object returned by the backend
|
||||
* @returns an array of models of type T
|
||||
*/
|
||||
deserializeArray(response: any): T[] {
|
||||
if (!Array.isArray(response)) {
|
||||
throw new Error('Expected an Array, use deserialize() instead');
|
||||
}
|
||||
return Deserialize(response, this.modelType) as T[];
|
||||
}
|
||||
}
|
||||
|
||||
function getSerializedObjectWithoutNullFields(serializedObjectBefore): any {
|
||||
const copySerializedObject = {};
|
||||
for (const [key, value] of Object.entries(serializedObjectBefore)) {
|
||||
if (value !== null) {
|
||||
copySerializedObject[key] = value;
|
||||
}
|
||||
}
|
||||
return copySerializedObject;
|
||||
}
|
Reference in New Issue
Block a user