README
Huz Api / Registry Handler
- Core component for Huz
- General registry storage for name, pair, entity
- Provides central/easy routing append
- Abstract error
- Fully Qualified Naming support
'FQN'
- TDD (Test driven)
- Fully JsDoc and *.d.ts (Document driven)
- TypeScript
Install
npm i @huzapi/registry-handler
For Context
const {registry} = require('@huzapi/registry-handler');
// default language for your platform, it based on request or constant
registry.addContextFinder('defaultLanguage', (req) => {return 'tr'});
// current profile language for your platform, it based on request or constant
registry.addContextFinder('currentLanguage', (req) => {return 'tr'});
// and .. whatever
For Entity & Enums
const {registry} = require('@huzapi/registry-handler');
class GameService {
constructor () {
// in order to call as callback or function reference
this.findNameAsync = this.findNameAsync.bind(this);
this.findNameListAsync = this.findNameListAsync.bind(this);
this.findPairAsync = this.findPairAsync.bind(this);
this.findRecordAsync = this.findRecordAsync.bind(this);
this.route = this.route.bind(this);
registry.addNameFinder('Game', this.findNameAsync);
registry.addNameListFinder('Game', this.findNameListAsync);
// registry.addReaderFinder('Game', your function)
// registry.addReaderListFinder('Game', your function)
registry.addPairFinder('Game', this.findPairAsync);
// registry.addPairListFinder('Game', your function)
registry.addRecordFinder('Game', this.findRecordAsync);
// registry.addRecordListFinder('Game', your function)
registry.addRouteBuilder('Game', this.route);
}
/**
* @param {string} id
* @param {?Record<string, any>} opt
* @param {?Req} req
* @returns {Promise<string>}
*/
async findNameAsync(id, opt = null, req = null) {
// your own code which returns name of entity
return 'Game-' + id;
}
/**
* @param {Array<string>} ids
* @param {?Record<string, any>} opt
* @param {?Req} req
* @returns {Promise<Array<string>>}
*/
async findNameListAsync(ids, opt = null, req = null) {
// your own code which return name of entities
return ['Game-1', 'Game-2'];
}
/**
* @param {string} id
* @param {?Record<string, any>} opt
* @param {?Req} req
* @returns {Promise<{id: string, name: string}>}
*/
async findPairAsync(id, opt = null, req = null) {
// your own code which returns pair of entity
return {id, name: 'Game-' + id};
}
/**
* @param {string} id
* @param {?Record<string, any>} opt
* @param {?Req} req
* @returns {Promise<{id: string, name: string, description: string}>}
*/
async findRecordAsync(id, opt = null, req = null) {
// your own code which returns record of entity
return {id, name: 'Game-' + id, description: ''};
}
route(router) {
// your custom router
}
}
At Route Initializing
Append all routes to Express route
const {registry} = require('@huzapi/registry-handler');
registry.buildRoutes(router);
At Runtime
Anywhere in your project Supports loosely-coupled architecture, so you don't import Game or Context components
const {registry} = require('@huzapi/registry-handler');
// express's request object
const req = null;
await registry.findNameAsync('Game', 101, null, req); // returns name of game with id 101
await registry.findNameListAsync('Game', [101, 102], null, req); // returns name of games with id 101 and 102
await registry.findPairAsync('Game', 101, null, req); // returns pair of game with id 101
await registry.findRecordAsync('Game', 101, null, req); // returns record of game with id 101
registry.findContext('currentLanguage', req) // returns profile's language
Abstract Error
const {AbstractError} = require('@huzapi/registry-handler');
// express's request object
export class GameNotFoundError extends AbstractError {
status = 404;
constructor(id: string|number) {
super(`Game record could not be found with id: ${id}`, {id});
}
}
// when error raised
throw new GameNotFoundError(345321);
Fully Qualified Naming
Build full qualified name for functions and classes
const {registry} = require('@huzapi/registry-handler');
export namespace huz.notification.firebase {
export class Something {
// ID
public id: number;
public constructor() { }
}
}
registry.patch({ huz });
// when you want to learn which class
console.log(huz.notification.firebase.Something.name);
// huz.notification.firebase.Something, normally it prints Something