import { FilterParams, PagingParams, DataPage, IdGenerator, IReferenceable, IReferences, Descriptor } from "pip-services3-commons-nodex"; import { IMessageQueue, MessageEnvelope } from "pip-services3-messaging-nodex"; import { CurrentPostStateV1 } from "./CurrentPostStateV1"; import { ICurrentPostStatesClientV1 } from "./ICurrentPostStatesClientV1"; export class CurrentPostStatesMockClientV1 implements ICurrentPostStatesClientV1, IReferenceable { private _areasDataQueue: IMessageQueue; private _maxPageSize: number = 100; private _postStates: CurrentPostStateV1[] = []; private composeFilter(filter: FilterParams ) : any { filter ??= new FilterParams(); let id = filter.getAsNullableString("id"); let patrolId = filter.getAsNullableString("patrol_id"); let notPatrol = filter.getAsNullableString("not_in_patrol"); let updated = filter.getAsNullableDateTime("updated"); let status = filter.getAsNullableString("status"); let lng = filter.getAsNullableDouble("long"); let lat = filter.getAsNullableDouble("lat"); let statuses = filter.getAsNullableString("statuses"); let fromTime = filter.getAsNullableDateTime("from_time"); let toTime = filter.getAsNullableDateTime("to_time"); let statusesList = statuses != null ? statuses.split(",") : null; return (item: CurrentPostStateV1 ) => { if (id != null && item.id != id) return false; if (patrolId != null && item.patrol_id != patrolId) return false; if (updated != null && item.updated != updated) return false; if (notPatrol != null && item.patrol_id != null) return false; if (status != null && item.status != status) return false; if (lng != null && item.long != lng && lat != null && item.lat != lat) return false; if (statuses != null && statuses.includes(item.status)) return false; if (statusesList != null && statusesList.includes(item.status)) return false; if (fromTime != null && item.updated < fromTime) return false; if (toTime != null && item.updated >= toTime) return false; return true; }; } public constructor(items?: CurrentPostStateV1[]) { this._postStates = items ?? []; } public setReferences(references: IReferences): void { this._areasDataQueue = references.getOneOptional(new Descriptor("pip-services", "message-queue", "*", "websock-data", "1.0")); } public async setStates(correlationId: string, states: CurrentPostStateV1[]): Promise { for (let state of states) { let index = this._postStates.map(s => s.id).indexOf(state.id); if (index < 0) { state.id ??= IdGenerator.nextLong(); this._postStates.push(state); } this._postStates[index] = state; if (this._areasDataQueue != null) this._areasDataQueue.send(correlationId, new MessageEnvelope(correlationId, "CurrentPostStateV1", state)); } return states; } public async getStates(correlationId: string, filter: FilterParams, paging: PagingParams): Promise> { let filterStates = this.composeFilter(filter); let states = this._postStates.filter(filterStates); // Extract a page paging = paging != null ? paging : new PagingParams(); let skip = paging.getSkip(-1); let take = paging.getTake(this._maxPageSize); let total = null; if (paging.total) { total = states.length; } if (skip > 0) { states = states.slice(skip); } states = states.slice(0, take); return new DataPage(states, total || states.length); } public async getStateById(correlationId: string, id: string) { let states = this._postStates.filter((x) => { return x.id == id; }); let state = states.length > 0 ? states[0] : null; return state; } public async setState(correlationId: string, state: CurrentPostStateV1): Promise { let index = this._postStates.map(s => s.id).indexOf(state.id); if (index < 0) { state.id ??= IdGenerator.nextLong(); this._postStates.push(state); return state; } this._postStates[index] = state; if (this._areasDataQueue != null) this._areasDataQueue.send(correlationId, new MessageEnvelope(correlationId, "CurrentPostStateV1", state)); return state; } public async deleteStatesByFilter(correlationId: string, filter: FilterParams): Promise { let filterPosts = this.composeFilter(filter); let states = this._postStates.filter(filterPosts); for (let state of states) { let index = this._postStates.map(s => s.id).indexOf(state.id); this._postStates.splice(index, 1); } } public async deleteStatesById(correlationId: string, id: string): Promise { let index = this._postStates.map(x => x.id).indexOf(id); if (index < 0) return null; let post = this._postStates[index]; this._postStates.splice(index, 1); return post; } }