Files
dspace-angular/src/app/core/dspace-rest-v2/dspace-rest-v2.service.ts
2019-06-25 13:25:26 +02:00

137 lines
4.1 KiB
TypeScript

import { Observable, throwError as observableThrowError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http'
import { DSpaceRESTV2Response } from './dspace-rest-v2-response.model';
import { HttpObserve } from '@angular/common/http/src/client';
import { RestRequestMethod } from '../data/rest-request-method';
import { hasNoValue, isNotEmpty } from '../../shared/empty.util';
import { DSpaceObject } from '../shared/dspace-object.model';
export const DEFAULT_CONTENT_TYPE = 'application/json; charset=utf-8';
export interface HttpOptions {
body?: any;
headers?: HttpHeaders;
params?: HttpParams;
observe?: HttpObserve;
reportProgress?: boolean;
responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
withCredentials?: boolean;
}
/**
* Service to access DSpace's REST API
*/
@Injectable()
export class DSpaceRESTv2Service {
constructor(protected http: HttpClient) {
}
/**
* Performs a request to the REST API with the `get` http method.
*
* @param absoluteURL
* A URL
* @return {Observable<string>}
* An Observable<string> containing the response from the server
*/
get(absoluteURL: string): Observable<DSpaceRESTV2Response> {
const requestOptions = {
observe: 'response' as any,
headers: new HttpHeaders({'Content-Type': DEFAULT_CONTENT_TYPE})
};
return this.http.get(absoluteURL, requestOptions).pipe(
map((res: HttpResponse<any>) => ({
payload: res.body,
statusCode: res.status,
statusText: res.statusText
})),
catchError((err) => {
console.log('Error: ', err);
return observableThrowError({
statusCode: err.status,
statusText: err.statusText,
message: err.message
});
}));
}
/**
* Performs a request to the REST API.
*
* @param method
* the HTTP method for the request
* @param url
* the URL for the request
* @param body
* an optional body for the request
* @param options
* the HttpOptions object
* @return {Observable<string>}
* An Observable<string> containing the response from the server
*/
request(method: RestRequestMethod, url: string, body?: any, options?: HttpOptions): Observable<DSpaceRESTV2Response> {
const requestOptions: HttpOptions = {};
requestOptions.body = body;
if (method === RestRequestMethod.POST && isNotEmpty(body) && isNotEmpty(body.name)) {
requestOptions.body = this.buildFormData(body);
}
requestOptions.observe = 'response';
if (options && options.responseType) {
requestOptions.responseType = options.responseType;
}
if (hasNoValue(options) || hasNoValue(options.headers)) {
requestOptions.headers = new HttpHeaders();
} else {
requestOptions.headers = options.headers;
}
if (!requestOptions.headers.has('Content-Type')) {
// Because HttpHeaders is immutable, the set method returns a new object instead of updating the existing headers
requestOptions.headers = requestOptions.headers.set('Content-Type', DEFAULT_CONTENT_TYPE);
}
return this.http.request(method, url, requestOptions).pipe(
map((res) => ({
payload: res.body,
headers: res.headers,
statusCode: res.status,
statusText: res.statusText
})),
catchError((err) => {
console.log('Error: ', err);
return observableThrowError({
statusCode: err.status,
statusText: err.statusText,
message: err.message
});
}));
}
/**
* Create a FormData object from a DSpaceObject
*
* @param {DSpaceObject} dso
* the DSpaceObject
* @return {FormData}
* the result
*/
buildFormData(dso: DSpaceObject): FormData {
const form: FormData = new FormData();
form.append('name', dso.name);
if (dso.metadata) {
for (const key of Object.keys(dso.metadata)) {
for (const value of dso.allMetadataValues(key)) {
form.append(key, value);
}
}
}
return form;
}
}