mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-17 06:53:03 +00:00
137 lines
4.1 KiB
TypeScript
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;
|
|
}
|
|
|
|
}
|