NASA Proceeds to Mars

    @codeperate/foalts-apischema-builder
    TypeScript icon, indicating that this package has built-in type declarations

    1.0.8 • Public • Published

    foalts-apischema-builder

    A small library that helps you to build ApiSchema for foalTS with builder pattern.

    Getting Started

    1. This library use class validator metadata storage to convert your database entity to json schema, therefore you need validation decorators in your entity. Although this lib is agnostic between orms, the examples below are using foalts with Mikro-orm.
    import { IsDate, IsString } from "class-validator";
    
    export class SomeEntity {
      @PrimaryKey()
      @IsString()
      id: string = v4();
    
      @Property()
      @IsDate()
      createdAt: Date = new Date();
    
      @Property({ onUpdate: () => new Date() })
      @IsDate()
      updatedAt: Date = new Date();
    }
    1. Setup your the schema service before bootstrap your app in index.ts
    import { SchemaService } from '@codeperate/foalts-apischema-builder';
    ...
    async function main() {
      const schemaService = new SchemaService()
      serviceManager.set("schema", schemaService, { boot: true })
      await serviceManager.boot("schema");
      const app = await createApp(AppController, { serviceManager });
      ...
    }
    1. Use it in your controller example.controller.ts
    export class SomeController{
      @depdency('schema')
      ss:SchemaService
      @Get('/:id')
      @ValidatePathParam("id", { type: "string" })
      @JSONResponse(200, (c: SomeController) => (c.ss.get(SomeEntity)))
      async findById(ctx: Context): Promise<HttpResponse> {
          ...
      }
    }

    json-response.hook.ts:

    import {
      ApiResponse,
      HookDecorator,
      IApiReference,
      IApiResponse,
      IApiSchema,
    } from "@foal/core";
    export function JSONResponse(
      key: number | "default" | "1XX" | "2XX" | "3XX" | "4XX" | "5XX",
      schema:
        | IApiSchema
        | IApiReference
        | ((controller: any) => IApiSchema | IApiReference),
      description: string = ""
    ): HookDecorator {
      return (target, propertyKey?) => {
        function makeResponse(schema: IApiSchema | IApiReference): IApiResponse {
          return {
            description: description,
            content: {
              "application/json": {
                schema: schema,
              },
            },
          };
        }
        const responseBody =
          typeof schema == "function"
            ? (c: any) => makeResponse(schema(c))
            : makeResponse(schema);
        return ApiResponse(key, responseBody)(target, propertyKey);
      };
    }
    1. Modify your APISchema Object easily with builder pattern:
      @JSONResponse(200, (c: SomeController) => c.ss.get(SomeEntity).pick(["prop1","prop2"]))

    More

    You can add more predefined schema as you like, for example:

    schemaService.transform((key, value) => {
      if (orm.getMetadata().has(key)) {
        const primaryKeys = orm.getMetadata().get(key).primaryKeys;
        return value.omit(primaryKeys);
      }
      return value;
    }, "post");

    A schema for post body without primary key will be created and you can access it with:

    schemaService.get(SomeEntity, "post");

    Install

    npm i @codeperate/foalts-apischema-builder

    DownloadsWeekly Downloads

    138

    Version

    1.0.8

    License

    MIT

    Unpacked Size

    17.1 kB

    Total Files

    11

    Last publish

    Collaborators

    • sceaduwe
    • kingdun3284