import { Injectable } from '@angular/core'; import { FuseMockApiHandler } from '@fuse/lib/mock-api/mock-api.request-handler'; import { FuseMockApiMethods } from '@fuse/lib/mock-api/mock-api.types'; import { compact, fromPairs } from 'lodash-es'; @Injectable({providedIn: 'root'}) export class FuseMockApiService { private _handlers: { [key: string]: Map } = { 'get' : new Map(), 'post' : new Map(), 'patch' : new Map(), 'delete' : new Map(), 'put' : new Map(), 'head' : new Map(), 'jsonp' : new Map(), 'options': new Map(), }; /** * Constructor */ constructor() { } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Find the handler from the service * with the given method and url * * @param method * @param url */ findHandler(method: string, url: string): { handler: FuseMockApiHandler | undefined; urlParams: { [key: string]: string } } { // Prepare the return object const matchingHandler: { handler: FuseMockApiHandler | undefined; urlParams: { [key: string]: string } } = { handler : undefined, urlParams: {}, }; // Split the url const urlParts = url.split('/'); // Get all related request handlers const handlers = this._handlers[method.toLowerCase()]; // Iterate through the handlers handlers.forEach((handler, handlerUrl) => { // Skip if there is already a matching handler if ( matchingHandler.handler ) { return; } // Split the handler url const handlerUrlParts = handlerUrl.split('/'); // Skip if the lengths of the urls we are comparing are not the same if ( urlParts.length !== handlerUrlParts.length ) { return; } // Compare const matches = handlerUrlParts.every((handlerUrlPart, index) => handlerUrlPart === urlParts[index] || handlerUrlPart.startsWith(':')); // If there is a match... if ( matches ) { // Assign the matching handler matchingHandler.handler = handler; // Extract and assign the parameters matchingHandler.urlParams = fromPairs(compact(handlerUrlParts.map((handlerUrlPart, index) => handlerUrlPart.startsWith(':') ? [handlerUrlPart.substring(1), urlParts[index]] : undefined, ))); } }); return matchingHandler; } /** * Register GET request handler * * @param url - URL address of the mocked API endpoint * @param delay - Delay of the response in milliseconds */ onGet(url: string, delay?: number): FuseMockApiHandler { return this._registerHandler('get', url, delay); } /** * Register POST request handler * * @param url - URL address of the mocked API endpoint * @param delay - Delay of the response in milliseconds */ onPost(url: string, delay?: number): FuseMockApiHandler { return this._registerHandler('post', url, delay); } /** * Register PATCH request handler * * @param url - URL address of the mocked API endpoint * @param delay - Delay of the response in milliseconds */ onPatch(url: string, delay?: number): FuseMockApiHandler { return this._registerHandler('patch', url, delay); } /** * Register DELETE request handler * * @param url - URL address of the mocked API endpoint * @param delay - Delay of the response in milliseconds */ onDelete(url: string, delay?: number): FuseMockApiHandler { return this._registerHandler('delete', url, delay); } /** * Register PUT request handler * * @param url - URL address of the mocked API endpoint * @param delay - Delay of the response in milliseconds */ onPut(url: string, delay?: number): FuseMockApiHandler { return this._registerHandler('put', url, delay); } /** * Register HEAD request handler * * @param url - URL address of the mocked API endpoint * @param delay - Delay of the response in milliseconds */ onHead(url: string, delay?: number): FuseMockApiHandler { return this._registerHandler('head', url, delay); } /** * Register JSONP request handler * * @param url - URL address of the mocked API endpoint * @param delay - Delay of the response in milliseconds */ onJsonp(url: string, delay?: number): FuseMockApiHandler { return this._registerHandler('jsonp', url, delay); } /** * Register OPTIONS request handler * * @param url - URL address of the mocked API endpoint * @param delay - Delay of the response in milliseconds */ onOptions(url: string, delay?: number): FuseMockApiHandler { return this._registerHandler('options', url, delay); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- /** * Register and return a new instance of the handler * * @param method * @param url * @param delay * @private */ private _registerHandler(method: FuseMockApiMethods, url: string, delay?: number): FuseMockApiHandler { // Create a new instance of FuseMockApiRequestHandler const fuseMockHttp = new FuseMockApiHandler(url, delay); // Store the handler to access it from the interceptor this._handlers[method].set(url, fuseMockHttp); // Return the instance return fuseMockHttp; } }