@codecovevienna/gittt-cli
Version:
Tracking time with CLI into a git repository
161 lines (140 loc) • 4.57 kB
text/typescript
import { v1 as uuid } from "uuid";
import { IRecord } from "../interfaces";
import inquirer from "inquirer";
import moment from "moment";
export class RecordHelper {
/*
* returns {boolean} true if provided record is identical to any record in records
*/
// FIXME could be covered by lodash, e.g. _.uniqWith(records, _.isEqual)
public static isRecordUnique = (record: IRecord, records: IRecord[]): boolean => {
// check if amount, end, message and type is found in records
return records.find((existingRecord: IRecord) => {
return existingRecord.amount === record.amount &&
existingRecord.end === record.end &&
existingRecord.message === record.message &&
existingRecord.type === record.type;
}) === undefined;
}
/*
* returns {boolean} true if provided record is overlapping any record in records
*/
public static isRecordOverlapping = (record: IRecord, records: IRecord[]): boolean => {
// check if any overlapping records are present
return records.find((existingRecord: IRecord) => {
const startExisting: number = existingRecord.end - existingRecord.amount;
const startAdd: number = record.end - record.amount;
const endExisting: number = existingRecord.end;
const endAdd: number = record.end;
if (
(startAdd >= startExisting && startAdd < endExisting) ||
(endAdd > startAdd && endAdd <= endExisting) ||
(startAdd <= startExisting && endAdd >= endExisting)
) {
return true;
}
return false;
}) === undefined;
}
/*
* Sets guid and current timestamps to given record object
*/
public static setRecordDefaults = (record: IRecord): IRecord => {
// Add unique identifier to each record
if (!record.guid) {
record.guid = uuid();
}
if (!record.created) {
const now: number = Date.now();
record.created = now;
record.updated = now;
}
return record;
}
public static async filterRecordsByYear(records: IRecord[]): Promise<IRecord[]> {
const allYears: string[] = [];
for (const rc of records) {
const currentYear: string = moment(rc.end).format("YYYY");
if (allYears.indexOf(currentYear) === -1) {
allYears.push(currentYear);
}
}
// Check if records spanning over more than one year
if (allYears.length > 1) {
const choiceYear = await inquirer.prompt([
{
choices: allYears,
message: "List of years",
name: "year",
type: "list",
},
]) as {
year: string;
};
return records.filter((rc: IRecord) => {
const currentYear: string = moment(rc.end).format("YYYY");
return currentYear === choiceYear.year;
});
} else {
return records;
}
}
public static async filterRecordsByMonth(records: IRecord[]): Promise<IRecord[]> {
// Check for month
const allMonths: string[] = [];
for (const rc of records) {
const currentMonth: string = moment(rc.end).format("MMMM");
if (allMonths.indexOf(currentMonth) === -1) {
allMonths.push(currentMonth);
}
}
// Check if records spanning over more than one month
if (allMonths.length > 1) {
const choiceMonth = await inquirer.prompt([
{
choices: allMonths,
message: "List of Month",
name: "month",
type: "list",
},
]) as {
month: string;
};
return records.filter((rc: IRecord) => {
const currentMonth: string = moment(rc.end).format("MMMM");
return currentMonth === choiceMonth.month;
});
} else {
return records;
}
}
public static async filterRecordsByDay(records: IRecord[]): Promise<IRecord[]> {
// Check for days
const allDays: string[] = [];
for (const rc of records) {
const currentDay: string = moment(rc.end).format("DD");
if (allDays.indexOf(currentDay) === -1) {
allDays.push(currentDay);
}
}
// Check if records spanning over more than one day
if (allDays.length > 1) {
const choiceDay = await inquirer.prompt([
{
choices: allDays,
message: "List of Days",
name: "day",
type: "list",
},
]) as {
day: string;
};
return records.filter((rc: IRecord) => {
const currentDay: string = moment(rc.end).format("DD");
return currentDay === choiceDay.day;
});
} else {
return records;
}
}
}