##// END OF EJS Templates
Added tag v1.4.0 for changeset 1a190b3a757d
Added tag v1.4.0 for changeset 1a190b3a757d

File last commit:

r110:1a190b3a757d v1.4.0 default
r111:c8d682bcaff7 default
Show More
MainContext.ts
71 lines | 2.2 KiB | video/mp2t | TypeScriptLexer
import Memory = require("dojo/store/Memory");
import Observable = require("dojo/store/Observable");
import { Appointment, AppointmentRole, Member } from "./Appointment";
import { Contact } from "./Contact";
import { Uuid } from "@implab/core-amd/Uuid";
import { query } from "@implab/djx/observable";
import { IDestroyable } from "@implab/core-amd/interfaces";
import { delay } from "@implab/core-amd/safe";
type AppointmentRecord = Omit<Appointment, "getMembers"> & { id: string };
type ContactRecord = Contact;
type MemberRecord = Member & { appointmentId: string; };
const item = <T, T2>(map: (x: T) => T2) => <U extends { item: T }>({ item, ...props }: U) => ({ item: map(item), ...props });
export class MainContext implements IDestroyable {
private readonly _appointments = new Observable(new Memory<AppointmentRecord>());
private readonly _contacts = new Observable(new Memory<ContactRecord>());
private readonly _members = new Observable(new Memory<MemberRecord>());
async createAppointment(title: string, startAt: Date, duration: number, members: Member[]) {
await delay(1000);
const id = Uuid();
this._appointments.add({
id,
startAt,
duration,
title
});
members.forEach(member =>
this._members.add({
appointmentId: id,
...member
}, { id: Uuid() }) as void
);
}
queryAppointments({ dateFrom, dateTo }: { dateFrom?: Date; dateTo?: Date; } = {}) {
return query(this._appointments)(({ startAt }) =>
(!dateFrom || dateFrom <= startAt) &&
(!dateTo || startAt <= dateTo)
).map(item(this._mapAppointment));
}
async addMember(appointmentId: string, member: Member) {
await delay(1000);
this._members.add({
appointmentId,
...member
});
}
private readonly _mapAppointment = ({ startAt, title, duration, id }: AppointmentRecord) => ({
id,
title,
startAt,
duration,
getMembers: (role?: AppointmentRole) => this._members.query(role ? { appointmentId: id, role } : { appointmentId: id })
});
destroy() {
}
}