import { InferSchemaType, Model, Schema, StringSchemaDefinition, Types, } from "mongoose"; import { Payload } from "@mifi/services-common/lib/types/Payload"; import { Action } from "../constants/action"; export interface Log { action: Action; auth: StringSchemaDefinition; payload?: Payload; } export interface LogModel extends Model { add(id: StringSchemaDefinition, action: Action, payload?: Payload): void; historyForUser(id: StringSchemaDefinition, action?: Action): Array; loginsForUser(id: StringSchemaDefinition): Array; } export const LogSchema = new Schema( { action: { type: String, enum: Action, required: true }, auth: { type: Types.ObjectId, index: true, required: true }, payload: { type: Object }, }, { minimize: true, timestamps: true, } ); LogSchema.statics = { add(id, action, payload) { this.create({ action, auth: id, payload }).catch(); }, async historyForUser(id, action) { return this.find({ auth: id, action }); }, async loginsForUser(id) { return this.find({ auth: id, action: Action.AUTHENTICATE }); }, }; export type LogSchema = InferSchemaType;