src/bll/commands/showmychanges.ts (93 lines of code) (raw):

import {inject, injectable} from "inversify"; import {TimePeriodEnum, TYPES} from "../utils/constants"; import {SummaryDao} from "../../dal/summarydao"; import {Change} from "../entities/change"; import {Logger} from "../utils/logger"; import {IChangesProvider} from "../../view/dataproviders/interfaces/ichangesprovider"; import {TimePeriod} from "../entities/timeperiod"; import {WindowProxy} from "../moduleproxies/window-proxy"; import {Summary} from "../entities/summary"; @injectable() export class ShowMyChanges implements Command { public constructor(@inject(TYPES.SummaryDao) private readonly summaryDao: SummaryDao, @inject(TYPES.ChangesProvider) private readonly changesProvider: IChangesProvider, @inject(TYPES.WindowProxy) private readonly windowsProxy: WindowProxy) { // } public async exec(args?: any[]): Promise<void> { Logger.logDebug("ShowMyChanges::exec start"); let isSilent: boolean = false; if (args && args.length === 1 && args[0] === true) { isSilent = true; } const summaryPromise: Promise<Summary> = this.summaryDao.get(isSilent); if (!isSilent) { this.windowsProxy.showWithProgress("Receiving data from the server...", summaryPromise); } let summary: Summary; try { summary = await summaryPromise; } catch (err) { if (isSilent) { return; } else { throw err; } } if ((!summary.changes || summary.changes.length === 0) && (!summary.personalChanges || summary.personalChanges.length === 0)) { Logger.logDebug(`ShowMyChanges::exec: personal changes were not found`); return; } const sortedChanges: Change[] = ShowMyChanges.getSortedChanges(summary); const classifiedChanges: Map<TimePeriodEnum, Change[]> = ShowMyChanges.classifyChanges(sortedChanges); const timePeriods = [new TimePeriod(TimePeriodEnum.Today, classifiedChanges.get(TimePeriodEnum.Today)), new TimePeriod(TimePeriodEnum.Yesterday, classifiedChanges.get(TimePeriodEnum.Yesterday)), new TimePeriod(TimePeriodEnum.Older, classifiedChanges.get(TimePeriodEnum.Older))]; this.changesProvider.setContent(timePeriods); Logger.logDebug("ShowMyChanges::exec finished "); } private static getSortedChanges(summary: Summary): Change[] { const sortedChanges: Change[] = summary.changes.concat(summary.personalChanges); sortedChanges.sort((ch1, ch2) => { return (ch1.vcsDate < ch2.vcsDate) ? 1 : ((ch1.vcsDate > ch2.vcsDate) ? -1 : 0); }); return sortedChanges; } private static classifyChanges(changes: Change[]): Map<TimePeriodEnum, Change[]> { const classifiedChanges: Map<TimePeriodEnum, Change[]> = new Map<TimePeriodEnum, Change[]>(); changes.forEach((change) => { const changeTimePeriod = ShowMyChanges.getTimePeriod(change); let changeSet: Change[] = classifiedChanges.get(changeTimePeriod); if (!changeSet) { changeSet = []; classifiedChanges.set(changeTimePeriod, changeSet); } changeSet.push(change); }); return classifiedChanges; } private static getTimePeriod(change: Change): TimePeriodEnum { const changeDate = change.vcsDate; if (ShowMyChanges.isToday(changeDate)) { return TimePeriodEnum.Today; } else if (ShowMyChanges.isYesterday(changeDate)) { return TimePeriodEnum.Yesterday; } else { return TimePeriodEnum.Older; } } private static isToday(date: Date): boolean { const today = new Date(); return ShowMyChanges.isSameDay(date, today); } private static isYesterday(date: Date): boolean { const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); return ShowMyChanges.isSameDay(date, yesterday); } private static isSameDay(d1, d2): boolean { return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth() && d1.getDate() === d2.getDate(); } }