From 6973c66d797563fd722db900ccf43aede7aa3e8b Mon Sep 17 00:00:00 2001
From: Kristof De Langhe <kristof.delanghe@atmire.com>
Date: Wed, 12 Sep 2018 10:49:31 +0200
Subject: [PATCH] 54472: Intermediate commit

---
 src/app/core/data/comcol-data.service.ts       | 16 ----------------
 src/app/core/data/data.service.ts              |  7 +++----
 .../core/data/dspace-object-data.service.ts    |  4 ----
 src/app/core/data/item-data.service.ts         |  5 -----
 src/app/core/data/request.effects.ts           |  2 +-
 .../dspace-rest-v2/dspace-rest-v2.service.ts   | 18 ++++++++++++++++++
 6 files changed, 22 insertions(+), 30 deletions(-)

diff --git a/src/app/core/data/comcol-data.service.ts b/src/app/core/data/comcol-data.service.ts
index 8519bb2b25..0859d075ca 100644
--- a/src/app/core/data/comcol-data.service.ts
+++ b/src/app/core/data/comcol-data.service.ts
@@ -66,20 +66,4 @@ export abstract class ComColDataService<TNormalized extends NormalizedObject, TD
     }
   }
 
-  public buildFormData(comcol, parentUUID): FormData {
-    const form: FormData = new FormData();
-    form.append('name', comcol.name);
-    if (isNotEmpty(parentUUID)) {
-      form.append('parent', parentUUID);
-    }
-    if (comcol.metadata) {
-      for (const i of Object.keys(comcol.metadata)) {
-        if (isNotEmpty(comcol.metadata[i].value)) {
-          form.append(comcol.metadata[i].key, comcol.metadata[i].value);
-        }
-      }
-    }
-    return form;
-  }
-
 }
diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts
index b2946b2164..13550b2358 100644
--- a/src/app/core/data/data.service.ts
+++ b/src/app/core/data/data.service.ts
@@ -121,12 +121,13 @@ export abstract class DataService<TNormalized extends NormalizedObject, TDomain>
     const requestId = this.requestService.generateRequestId();
     const endpoint$ = this.halService.getEndpoint(this.linkPath).pipe(
       isNotEmptyOperator(),
-      distinctUntilChanged()
+      distinctUntilChanged(),
+      map((endpoint: string) => parentUUID ? `${endpoint}?parent=${parentUUID}` : endpoint)
     );
 
     const request$ = endpoint$.pipe(
       take(1),
-      map((endpoint: string) => new CreateRequest(requestId, endpoint, this.buildFormData(dso, parentUUID))),
+      map((endpoint: string) => new CreateRequest(requestId, endpoint, dso)),
       configureRequest(this.requestService)
     );
 
@@ -153,6 +154,4 @@ export abstract class DataService<TNormalized extends NormalizedObject, TDomain>
     return this.rdbService.toRemoteDataObservable(requestEntry$, responseCache$, payload$);
   }
 
-  public abstract buildFormData(dso: TDomain, parentUUID: string): FormData;
-
 }
diff --git a/src/app/core/data/dspace-object-data.service.ts b/src/app/core/data/dspace-object-data.service.ts
index 14540d0782..d14d7f8a0b 100644
--- a/src/app/core/data/dspace-object-data.service.ts
+++ b/src/app/core/data/dspace-object-data.service.ts
@@ -37,10 +37,6 @@ class DataServiceImpl extends DataService<NormalizedDSpaceObject, DSpaceObject>
   getFindByIDHref(endpoint, resourceID): string {
     return endpoint.replace(/\{\?uuid\}/,`?uuid=${resourceID}`);
   }
-
-  buildFormData(dso: DSpaceObject, parentUUID: string): FormData {
-    return undefined;
-  }
 }
 
 @Injectable()
diff --git a/src/app/core/data/item-data.service.ts b/src/app/core/data/item-data.service.ts
index c3c32691ce..6b62fe6688 100644
--- a/src/app/core/data/item-data.service.ts
+++ b/src/app/core/data/item-data.service.ts
@@ -47,9 +47,4 @@ export class ItemDataService extends DataService<NormalizedItem, Item> {
     }
   }
 
-  buildFormData(dso: Item, parentUUID: string): FormData {
-    // TODO: build FormData for creating an Item
-    return undefined;
-  }
-
 }
diff --git a/src/app/core/data/request.effects.ts b/src/app/core/data/request.effects.ts
index 9d27717dc6..5fadd316f4 100644
--- a/src/app/core/data/request.effects.ts
+++ b/src/app/core/data/request.effects.ts
@@ -38,7 +38,7 @@ export class RequestEffects {
     }),
     map((entry: RequestEntry) => entry.request),
     flatMap((request: RestRequest) => {
-      let body = request.body;
+      let body;
       if (isNotEmpty(request.body)) {
         const serializer = new DSpaceRESTv2Serializer(NormalizedObjectFactory.getConstructor(request.body.type));
         body = serializer.serialize(request.body);
diff --git a/src/app/core/dspace-rest-v2/dspace-rest-v2.service.ts b/src/app/core/dspace-rest-v2/dspace-rest-v2.service.ts
index 78c93b8c08..c8cced9e8a 100644
--- a/src/app/core/dspace-rest-v2/dspace-rest-v2.service.ts
+++ b/src/app/core/dspace-rest-v2/dspace-rest-v2.service.ts
@@ -6,6 +6,8 @@ import { RestRequestMethod } from '../data/request.models';
 
 import { DSpaceRESTV2Response } from './dspace-rest-v2-response.model';
 import { HttpObserve } from '@angular/common/http/src/client';
+import { isNotEmpty } from '../../shared/empty.util';
+import { DSpaceObject } from '../shared/dspace-object.model';
 
 export interface HttpOptions {
   body?: any;
@@ -59,6 +61,9 @@ export class DSpaceRESTv2Service {
   request(method: RestRequestMethod, url: string, body?: any, options?: HttpOptions): Observable<DSpaceRESTV2Response> {
     const requestOptions: HttpOptions = {};
     requestOptions.body = body;
+    if (method === RestRequestMethod.Post && isNotEmpty(body)) {
+      requestOptions.body = this.buildFormData(body);
+    }
     requestOptions.observe = 'response';
     if (options && options.headers) {
       requestOptions.headers = Object.assign(new HttpHeaders(),  options.headers);
@@ -74,4 +79,17 @@ export class DSpaceRESTv2Service {
       });
   }
 
+  buildFormData(dso: DSpaceObject): FormData {
+    const form: FormData = new FormData();
+    form.append('name', dso.name);
+    if (dso.metadata) {
+      for (const i of Object.keys(dso.metadata)) {
+        if (isNotEmpty(dso.metadata[i].value)) {
+          form.append(dso.metadata[i].key, dso.metadata[i].value);
+        }
+      }
+    }
+    return form;
+  }
+
 }
-- 
GitLab