@huzapi/registry-handlerdeprecated

General registry storage for name, pair, entity and route

Usage no npm install needed!

<script type="module">
  import huzapiRegistryHandler from 'https://cdn.skypack.dev/@huzapi/registry-handler';
</script>

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