Files
IOT_application/fuse-starter-v20.0.0/src/@fuse/lib/mock-api/mock-api.service.ts

202 lines
6.4 KiB
TypeScript

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<string, FuseMockApiHandler> } = {
get: new Map<string, FuseMockApiHandler>(),
post: new Map<string, FuseMockApiHandler>(),
patch: new Map<string, FuseMockApiHandler>(),
delete: new Map<string, FuseMockApiHandler>(),
put: new Map<string, FuseMockApiHandler>(),
head: new Map<string, FuseMockApiHandler>(),
jsonp: new Map<string, FuseMockApiHandler>(),
options: new Map<string, FuseMockApiHandler>(),
};
// -----------------------------------------------------------------------------------------------------
// @ 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;
}
}