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; | ||
|  |   } | ||
|  | } |