Models

Models are the data structure that holds the current state of your application, the framework doesn’t make many assumptions on it and only requires have a deserialize method that should initialize it based on an object of attributes and a serialize method that should return a JSON.stringify able structure to then store in the session attributes.

/*
 * Copyright (c) 2018 Rain Agency <contact@rain.agency>
 * Author: Rain Agency <contact@rain.agency>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

import * as _ from "lodash";
import { IBag, IVoxaEvent } from "./VoxaEvent";

export class Model {
  [key: string]: any;

  public static deserialize(
    data: IBag,
    voxaEvent: IVoxaEvent,
  ): Promise<Model> | Model {
    return new this(data);
  }

  public state?: string;

  constructor(data: any = {}) {
    _.assign(this, data);
  }

  public async serialize(): Promise<any> {
    return this;
  }
}

export interface IModel {
  new (data?: any): Model;
  deserialize(data: IBag, event: IVoxaEvent): Model | Promise<Model>;
  serialize(): Promise<any>;
}