90 lines
3.3 KiB
TypeScript
90 lines
3.3 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
/**
|
|
* This is an example of a Hero-oriented InMemoryDbService with method overrides.
|
|
*/
|
|
import {Injectable} from '@angular/core';
|
|
import {getStatusText, ParsedRequestUrl, RequestInfo, RequestInfoUtilities, ResponseOptions, STATUS} from 'angular-in-memory-web-api';
|
|
import {Observable} from 'rxjs';
|
|
|
|
import {HeroInMemDataService} from './hero-in-mem-data-service';
|
|
|
|
const villains = [
|
|
// deliberately using string ids that look numeric
|
|
{id: 100, name: 'Snidley Wipsnatch'}, {id: 101, name: 'Boris Badenov'},
|
|
{id: 103, name: 'Natasha Fatale'}
|
|
];
|
|
|
|
// Pseudo guid generator
|
|
function guid() {
|
|
const s4 = () => Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
|
|
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
|
|
}
|
|
|
|
@Injectable()
|
|
export class HeroInMemDataOverrideService extends HeroInMemDataService {
|
|
// Overrides id generator and delivers next available `id`, starting with 1001.
|
|
genId<T extends {id: any}>(collection: T[], collectionName: string): any {
|
|
if (collectionName === 'nobodies') {
|
|
return guid();
|
|
} else if (collection) {
|
|
return 1 + collection.reduce((prev, curr) => Math.max(prev, curr.id || 0), 1000);
|
|
}
|
|
}
|
|
|
|
// HTTP GET interceptor
|
|
get(reqInfo: RequestInfo): Observable<any>|undefined {
|
|
const collectionName = reqInfo.collectionName;
|
|
if (collectionName === 'villains') {
|
|
return this.getVillains(reqInfo);
|
|
}
|
|
return undefined; // let the default GET handle all others
|
|
}
|
|
|
|
// HTTP GET interceptor handles requests for villains
|
|
private getVillains(reqInfo: RequestInfo) {
|
|
return reqInfo.utils.createResponse$(() => {
|
|
const collection = villains.slice();
|
|
const dataEncapsulation = reqInfo.utils.getConfig().dataEncapsulation;
|
|
const id = reqInfo.id;
|
|
const data = id == null ? collection : reqInfo.utils.findById(collection, id);
|
|
|
|
const options: ResponseOptions = data ?
|
|
{body: dataEncapsulation ? {data} : data, status: STATUS.OK} :
|
|
{body: {error: `'Villains' with id='${id}' not found`}, status: STATUS.NOT_FOUND};
|
|
return this.finishOptions(options, reqInfo);
|
|
});
|
|
}
|
|
|
|
// parseRequestUrl override
|
|
// Do this to manipulate the request URL or the parsed result
|
|
// into something your data store can handle.
|
|
// This example turns a request for `/foo/heroes` into just `/heroes`.
|
|
// It leaves other URLs untouched and forwards to the default parser.
|
|
// It also logs the result of the default parser.
|
|
parseRequestUrl(url: string, utils: RequestInfoUtilities): ParsedRequestUrl {
|
|
const newUrl = url.replace(/\/foo\/heroes/, '/heroes');
|
|
return utils.parseRequestUrl(newUrl);
|
|
}
|
|
|
|
responseInterceptor(resOptions: ResponseOptions, reqInfo: RequestInfo) {
|
|
if (resOptions.headers) {
|
|
resOptions.headers = resOptions.headers.set('x-test', 'test-header');
|
|
}
|
|
return resOptions;
|
|
}
|
|
|
|
private finishOptions(options: ResponseOptions, {headers, url}: RequestInfo) {
|
|
options.statusText = options.status == null ? undefined : getStatusText(options.status);
|
|
options.headers = headers;
|
|
options.url = url;
|
|
return options;
|
|
}
|
|
}
|