mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
85262: Get submission object instead of sending empty patch + revert empty patch code
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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 },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user