added a RestRequest class for each http method

This commit is contained in:
Art Lowel
2018-01-17 15:58:40 +01:00
parent ab570e4ffb
commit 334b07ac26
4 changed files with 92 additions and 30 deletions

View File

@@ -1,22 +1,21 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
import { hasValue, isNotEmpty } from '../../../shared/empty.util';
import { PaginatedList } from '../../data/paginated-list'; import { PaginatedList } from '../../data/paginated-list';
import { RemoteData } from '../../data/remote-data';
import { RemoteDataError } from '../../data/remote-data-error'; import { RemoteDataError } from '../../data/remote-data-error';
import { GetRequest } from '../../data/request.models';
import { RequestEntry } from '../../data/request.reducer';
import { RequestService } from '../../data/request.service';
import { GenericConstructor } from '../../shared/generic-constructor';
import { NormalizedObjectFactory } from '../models/normalized-object-factory';
import { CacheableObject } from '../object-cache.reducer'; import { CacheableObject } from '../object-cache.reducer';
import { ObjectCacheService } from '../object-cache.service'; import { ObjectCacheService } from '../object-cache.service';
import { RequestService } from '../../data/request.service'; import { DSOSuccessResponse, ErrorResponse } from '../response-cache.models';
import { ResponseCacheService } from '../response-cache.service';
import { RequestEntry } from '../../data/request.reducer';
import { hasValue, isNotEmpty } from '../../../shared/empty.util';
import { ResponseCacheEntry } from '../response-cache.reducer'; import { ResponseCacheEntry } from '../response-cache.reducer';
import { ErrorResponse, DSOSuccessResponse } from '../response-cache.models'; import { ResponseCacheService } from '../response-cache.service';
import { RemoteData } from '../../data/remote-data';
import { GenericConstructor } from '../../shared/generic-constructor';
import { getMapsTo, getRelationMetadata, getRelationships } from './build-decorators'; import { getMapsTo, getRelationMetadata, getRelationships } from './build-decorators';
import { NormalizedObjectFactory } from '../models/normalized-object-factory';
import { RestRequest } from '../../data/request.models';
import { PageInfo } from '../../shared/page-info.model';
@Injectable() @Injectable()
export class RemoteDataBuildService { export class RemoteDataBuildService {
@@ -169,7 +168,7 @@ export class RemoteDataBuildService {
const resourceConstructor = NormalizedObjectFactory.getConstructor(resourceType); const resourceConstructor = NormalizedObjectFactory.getConstructor(resourceType);
if (Array.isArray(normalized[relationship])) { if (Array.isArray(normalized[relationship])) {
normalized[relationship].forEach((href: string) => { normalized[relationship].forEach((href: string) => {
this.requestService.configure(new RestRequest(this.requestService.generateRequestId(), href)) this.requestService.configure(new GetRequest(this.requestService.generateRequestId(), href))
}); });
const rdArr = []; const rdArr = [];
@@ -183,7 +182,7 @@ export class RemoteDataBuildService {
links[relationship] = rdArr[0]; links[relationship] = rdArr[0];
} }
} else { } else {
this.requestService.configure(new RestRequest(this.requestService.generateRequestId(), normalized[relationship])); this.requestService.configure(new GetRequest(this.requestService.generateRequestId(), normalized[relationship]));
// The rest API can return a single URL to represent a list of resources (e.g. /items/:id/bitstreams) // The rest API can return a single URL to represent a list of resources (e.g. /items/:id/bitstreams)
// in that case only 1 href will be stored in the normalized obj (so the isArray above fails), // in that case only 1 href will be stored in the normalized obj (so the isArray above fails),

View File

@@ -6,19 +6,12 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv
import { CacheableObject } from '../cache/object-cache.reducer'; import { CacheableObject } from '../cache/object-cache.reducer';
import { ResponseCacheService } from '../cache/response-cache.service'; import { ResponseCacheService } from '../cache/response-cache.service';
import { CoreState } from '../core.reducers'; import { CoreState } from '../core.reducers';
import { DSpaceObject } from '../shared/dspace-object.model';
import { GenericConstructor } from '../shared/generic-constructor'; import { GenericConstructor } from '../shared/generic-constructor';
import { HALEndpointService } from '../shared/hal-endpoint.service'; import { HALEndpointService } from '../shared/hal-endpoint.service';
import { URLCombiner } from '../url-combiner/url-combiner'; import { URLCombiner } from '../url-combiner/url-combiner';
import { PaginatedList } from './paginated-list'; import { PaginatedList } from './paginated-list';
import { RemoteData } from './remote-data'; import { RemoteData } from './remote-data';
import { import { FindAllOptions, FindAllRequest, FindByIDRequest, GetRequest } from './request.models';
FindAllOptions,
FindAllRequest,
FindByIDRequest,
RestRequest,
RestRequestMethod
} from './request.models';
import { RequestService } from './request.service'; import { RequestService } from './request.service';
export abstract class DataService<TNormalized extends CacheableObject, TDomain> extends HALEndpointService { export abstract class DataService<TNormalized extends CacheableObject, TDomain> extends HALEndpointService {
@@ -106,7 +99,7 @@ export abstract class DataService<TNormalized extends CacheableObject, TDomain>
} }
findByHref(href: string): Observable<RemoteData<TDomain>> { findByHref(href: string): Observable<RemoteData<TDomain>> {
this.requestService.configure(new RestRequest(this.requestService.generateRequestId(), href)); this.requestService.configure(new GetRequest(this.requestService.generateRequestId(), href));
return this.rdbService.buildSingle<TNormalized, TDomain>(href, this.normalizedResourceType); return this.rdbService.buildSingle<TNormalized, TDomain>(href, this.normalizedResourceType);
} }

View File

@@ -22,14 +22,14 @@ import { ConfigResponseParsingService } from './config-response-parsing.service'
export enum RestRequestMethod { export enum RestRequestMethod {
Get = 'GET', Get = 'GET',
Post = 'POST', Post = 'POST',
// Put = 'PUT', Put = 'PUT',
// Delete = 'DELETE', Delete = 'DELETE',
// Options = 'OPTIONS', Options = 'OPTIONS',
// Head = 'HEAD', Head = 'HEAD',
// Patch = 'PATCH' Patch = 'PATCH'
} }
export class RestRequest { export abstract class RestRequest {
constructor( constructor(
public uuid: string, public uuid: string,
public href: string, public href: string,
@@ -43,6 +43,76 @@ export class RestRequest {
} }
} }
export class GetRequest extends RestRequest {
constructor(
public uuid: string,
public href: string,
public body?: any
) {
super(uuid, href, RestRequestMethod.Get, body)
}
}
export class PostRequest extends RestRequest {
constructor(
public uuid: string,
public href: string,
public body?: any
) {
super(uuid, href, RestRequestMethod.Post, body)
}
}
export class PutRequest extends RestRequest {
constructor(
public uuid: string,
public href: string,
public body?: any
) {
super(uuid, href, RestRequestMethod.Put, body)
}
}
export class DeleteRequest extends RestRequest {
constructor(
public uuid: string,
public href: string,
public body?: any
) {
super(uuid, href, RestRequestMethod.Delete, body)
}
}
export class OptionsRequest extends RestRequest {
constructor(
public uuid: string,
public href: string,
public body?: any
) {
super(uuid, href, RestRequestMethod.Options, body)
}
}
export class HeadRequest extends RestRequest {
constructor(
public uuid: string,
public href: string,
public body?: any
) {
super(uuid, href, RestRequestMethod.Head, body)
}
}
export class PatchRequest extends RestRequest {
constructor(
public uuid: string,
public href: string,
public body?: any
) {
super(uuid, href, RestRequestMethod.Patch, body)
}
}
export class FindByIDRequest extends RestRequest { export class FindByIDRequest extends RestRequest {
constructor( constructor(
uuid: string, uuid: string,

View File

@@ -4,7 +4,7 @@ import { requestReducer, RequestState } from './request.reducer';
import { import {
RequestCompleteAction, RequestConfigureAction, RequestExecuteAction RequestCompleteAction, RequestConfigureAction, RequestExecuteAction
} from './request.actions'; } from './request.actions';
import { RestRequest } from './request.models'; import { GetRequest, RestRequest } from './request.models';
class NullAction extends RequestCompleteAction { class NullAction extends RequestCompleteAction {
type = null; type = null;
@@ -22,7 +22,7 @@ describe('requestReducer', () => {
const link2 = 'https://dspace7.4science.it/dspace-spring-rest/api/core/items/1911e8a4-6939-490c-b58b-a5d70f8d91fb'; const link2 = 'https://dspace7.4science.it/dspace-spring-rest/api/core/items/1911e8a4-6939-490c-b58b-a5d70f8d91fb';
const testState: RequestState = { const testState: RequestState = {
[id1]: { [id1]: {
request: new RestRequest(id1, link1), request: new GetRequest(id1, link1),
requestPending: false, requestPending: false,
responsePending: false, responsePending: false,
completed: false completed: false
@@ -46,7 +46,7 @@ describe('requestReducer', () => {
it('should add the new RestRequest and set \'requestPending\' to true, \'responsePending\' to false and \'completed\' to false for the given RestRequest in the state, in response to a CONFIGURE action', () => { it('should add the new RestRequest and set \'requestPending\' to true, \'responsePending\' to false and \'completed\' to false for the given RestRequest in the state, in response to a CONFIGURE action', () => {
const state = testState; const state = testState;
const request = new RestRequest(id2, link2); const request = new GetRequest(id2, link2);
const action = new RequestConfigureAction(request); const action = new RequestConfigureAction(request);
const newState = requestReducer(state, action); const newState = requestReducer(state, action);