BatchExplorer/docs/models.md

2.3 KiB

Writing a model

This is a documentation to help create models which are DataStructure that maps entities returned by apis.

All models should be immmutable using the record api defined in @batch-flask/core.

Note: Before writting a model double check this is the best option:

  • Models should be for containg data returned from remote APIs.
  • Models are immutable which means it should not be for a structure containing user edit.
  • Don't use models for internal data structure.(For a component or a small set of components)

Step 1: Create file

Create model file my-new-model.ts in app/models add this to app/models/index.ts

export * from "./my-model"

Then you should be able to have

// Good
import { MyNewModel } from "app/models"

// Bad
import { MyNewModel } from "app/models/myNewModel"

Step 2: Write the attribute interface

In this interface define all the attributes of the model This may look like we are creating a lot of duplicate code here but it makes it worth it when using the model later as you'll have typing when creating a new model.

import { Partial } from "app/utils"

export interface MyModelAttributes {
    id: string;
    state: string;
    files: Partial<BarAttributes>[];
    bar: Partial<BarAttributes>
}

Step 3: Write the model class

You need to do the following for the class:

  • Decorate the class with the @Model decorator
  • Extend the class with the Record class
  • Decorate all attributes of the model with @Prop and all list attributes with @ListProp. Note: @Prop will be able to get the type of a nested model automatically. However you need to pass the type of the model in the list decorator.
  • For default values just set the value in the class body @Prop public a: string = "abc"
import { ListProp, Model, Prop, Record } from "@batch-flask/core";
import { Bar, BarAttributes } from "./bar"

@Model()
export class MyModel extends Record<MyModelAttributes> {
    @Prop()
    public id: string = "default-value";
    @Prop()
    public state: string;
    @Prop()
    public bar: Bar;

    @ListProp(Bar)
    public files: List<Bar>;
}

The record api will make all attributes with @Prop immutable. If you have a nested object it will automatically create it. And when using @ListProp it will automatically create a immutable list of items.