85262: Get submission object instead of sending empty patch + revert empty patch code

This commit is contained in:
Kristof De Langhe
2021-12-10 14:18:51 +01:00
parent ed2c774d86
commit 549529c889
3 changed files with 28 additions and 17 deletions

View File

@@ -40,15 +40,13 @@ export abstract class JsonPatchOperationsService<ResponseDefinitionDomain, Patch
* The resource type value * The resource type value
* @param resourceId * @param resourceId
* The resource id value * The resource id value
* @param allowEmptyRequest
* Allow an empty list of operations in the request's body
* @return Observable<ResponseDefinitionDomain> * @return Observable<ResponseDefinitionDomain>
* observable of response * observable of response
*/ */
protected submitJsonPatchOperations(hrefObs: Observable<string>, resourceType: string, resourceId?: string, allowEmptyRequest = false): Observable<ResponseDefinitionDomain> { protected submitJsonPatchOperations(hrefObs: Observable<string>, resourceType: string, resourceId?: string): Observable<ResponseDefinitionDomain> {
const requestId = this.requestService.generateRequestId(); const requestId = this.requestService.generateRequestId();
let startTransactionTime = null; let startTransactionTime = null;
const [patchRequest$, emptyRequest$] = partition((request: PatchRequestDefinition) => allowEmptyRequest || isNotEmpty(request.body))(hrefObs.pipe( const [patchRequest$, emptyRequest$] = partition((request: PatchRequestDefinition) => isNotEmpty(request.body))(hrefObs.pipe(
mergeMap((endpointURL: string) => { mergeMap((endpointURL: string) => {
return this.store.select(jsonPatchOperationsByResourceType(resourceType)).pipe( return this.store.select(jsonPatchOperationsByResourceType(resourceType)).pipe(
take(1), take(1),
@@ -81,11 +79,11 @@ export abstract class JsonPatchOperationsService<ResponseDefinitionDomain, Patch
return observableMerge( return observableMerge(
emptyRequest$.pipe( emptyRequest$.pipe(
filter((request: PatchRequestDefinition) => !allowEmptyRequest && isEmpty(request.body)), filter((request: PatchRequestDefinition) => isEmpty(request.body)),
tap(() => startTransactionTime = null), tap(() => startTransactionTime = null),
map(() => null)), map(() => null)),
patchRequest$.pipe( patchRequest$.pipe(
filter((request: PatchRequestDefinition) => allowEmptyRequest || isNotEmpty(request.body)), filter((request: PatchRequestDefinition) => isNotEmpty(request.body)),
tap(() => this.store.dispatch(new StartTransactionPatchOperationsAction(resourceType, resourceId, startTransactionTime))), tap(() => this.store.dispatch(new StartTransactionPatchOperationsAction(resourceType, resourceId, startTransactionTime))),
tap((request: PatchRequestDefinition) => this.requestService.send(request)), tap((request: PatchRequestDefinition) => this.requestService.send(request)),
mergeMap(() => { mergeMap(() => {
@@ -143,18 +141,16 @@ export abstract class JsonPatchOperationsService<ResponseDefinitionDomain, Patch
* The scope id * The scope id
* @param resourceType * @param resourceType
* The resource type value * The resource type value
* @param allowEmptyRequest
* Allow an empty list of operations in the request's body
* @return Observable<ResponseDefinitionDomain> * @return Observable<ResponseDefinitionDomain>
* observable of response * observable of response
*/ */
public jsonPatchByResourceType(linkPath: string, scopeId: string, resourceType: string, allowEmptyRequest = false): Observable<ResponseDefinitionDomain> { public jsonPatchByResourceType(linkPath: string, scopeId: string, resourceType: string): Observable<ResponseDefinitionDomain> {
const href$ = this.halService.getEndpoint(linkPath).pipe( const href$ = this.halService.getEndpoint(linkPath).pipe(
filter((href: string) => isNotEmpty(href)), filter((href: string) => isNotEmpty(href)),
distinctUntilChanged(), distinctUntilChanged(),
map((endpointURL: string) => this.getEndpointByIDHref(endpointURL, scopeId))); map((endpointURL: string) => this.getEndpointByIDHref(endpointURL, scopeId)));
return this.submitJsonPatchOperations(href$, resourceType, undefined, allowEmptyRequest); return this.submitJsonPatchOperations(href$, resourceType);
} }
/** /**

View File

@@ -54,6 +54,8 @@ import { Item } from '../../core/shared/item.model';
import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service'; import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service';
import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service'; import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service';
import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; import { HALEndpointService } from '../../core/shared/hal-endpoint.service';
import { SubmissionObjectDataService } from '../../core/submission/submission-object-data.service';
import { mockSubmissionObjectDataService } from '../../shared/testing/submission-oject-data-service.mock';
describe('SubmissionObjectEffects test suite', () => { describe('SubmissionObjectEffects test suite', () => {
let submissionObjectEffects: SubmissionObjectEffects; let submissionObjectEffects: SubmissionObjectEffects;
@@ -63,6 +65,7 @@ describe('SubmissionObjectEffects test suite', () => {
let notificationsServiceStub; let notificationsServiceStub;
let submissionServiceStub; let submissionServiceStub;
let submissionJsonPatchOperationsServiceStub; let submissionJsonPatchOperationsServiceStub;
let submissionObjectDataServiceStub;
const collectionId: string = mockSubmissionCollectionId; const collectionId: string = mockSubmissionCollectionId;
const submissionId: string = mockSubmissionId; const submissionId: string = mockSubmissionId;
const submissionDefinitionResponse: any = mockSubmissionDefinitionResponse; const submissionDefinitionResponse: any = mockSubmissionDefinitionResponse;
@@ -75,6 +78,9 @@ describe('SubmissionObjectEffects test suite', () => {
notificationsServiceStub = new NotificationsServiceStub(); notificationsServiceStub = new NotificationsServiceStub();
submissionServiceStub = new SubmissionServiceStub(); submissionServiceStub = new SubmissionServiceStub();
submissionJsonPatchOperationsServiceStub = new SubmissionJsonPatchOperationsServiceStub(); submissionJsonPatchOperationsServiceStub = new SubmissionJsonPatchOperationsServiceStub();
submissionObjectDataServiceStub = mockSubmissionObjectDataService;
submissionServiceStub.hasUnsavedModification.and.returnValue(observableOf(true));
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [ imports: [
@@ -99,6 +105,7 @@ describe('SubmissionObjectEffects test suite', () => {
{ provide: WorkflowItemDataService, useValue: {} }, { provide: WorkflowItemDataService, useValue: {} },
{ provide: WorkflowItemDataService, useValue: {} }, { provide: WorkflowItemDataService, useValue: {} },
{ provide: HALEndpointService, useValue: {} }, { provide: HALEndpointService, useValue: {} },
{ provide: SubmissionObjectDataService, useValue: submissionObjectDataServiceStub },
], ],
}); });

View File

@@ -196,13 +196,21 @@ export class SubmissionObjectEffects {
*/ */
@Effect() saveAndDeposit$ = this.actions$.pipe( @Effect() saveAndDeposit$ = this.actions$.pipe(
ofType(SubmissionObjectActionTypes.SAVE_AND_DEPOSIT_SUBMISSION), ofType(SubmissionObjectActionTypes.SAVE_AND_DEPOSIT_SUBMISSION),
withLatestFrom(this.store$), withLatestFrom(this.submissionService.hasUnsavedModification()),
switchMap(([action, currentState]: [SaveAndDepositSubmissionAction, any]) => { switchMap(([action, hasUnsavedModification]: [SaveAndDepositSubmissionAction, boolean]) => {
return this.operationsService.jsonPatchByResourceType( let response$: Observable<SubmissionObject[]>;
this.submissionService.getSubmissionObjectLinkName(), if (hasUnsavedModification) {
action.payload.submissionId, response$ = this.operationsService.jsonPatchByResourceType(
'sections', this.submissionService.getSubmissionObjectLinkName(),
true).pipe( action.payload.submissionId,
'sections') as Observable<SubmissionObject[]>;
} else {
response$ = this.submissionObjectService.findById(action.payload.submissionId).pipe(
getFirstSucceededRemoteDataPayload(),
map((submissionObject: SubmissionObject) => [submissionObject])
);
}
return response$.pipe(
map((response: SubmissionObject[]) => { map((response: SubmissionObject[]) => {
if (this.canDeposit(response)) { if (this.canDeposit(response)) {
return new DepositSubmissionAction(action.payload.submissionId); return new DepositSubmissionAction(action.payload.submissionId);