Operations on 2 separate collections v3
unknown
typescript
2 years ago
2.1 kB
101
Indexable
// use interface instead class for TS export interface Task { goal_id: string; name: string; description: string; priority: string; taskDate: string; id: string; // key collection } // Base Goal Model export interface Goal { name: string; isMainGoal: boolean; details: string; category: string; lifeArea: string; creationDate: string; priority: string; endDate: Date; id: string; } class MyService { getTasksByCategory(category:string):Observable<any> { const daysFromThisWeek = this.getDaysFromThisWeek(); return forkJoin({ tasks: this.tasksS.tasksCollection(), goals: this.goalsS.goalsCollection(), }) // !!! OPERATIONS ON GOALS !!! .pipe( // filter goals with category from parameter map(({ tasks, goals }) => { return goals.filter((item:any) => item.category === category); }), // get ID's of found goals in the previous step map((goals:any) => { const goalsIDs = goals.map((item:any) => item.id); return goalsIDs; }) ) // !!! OPERATIONS ON TASKS !!! .pipe( // get IDs-matching-tasks map(({ tasks, goalsIDs }) => { let modArr = [] as any; goalsIDs.forEach((goalId:any) => { const forModArr = tasks.filter((task:any) => task.goal_id === goalId); modArr = modArr.concat(forModArr); }) return modArr; }), map(tasksArr => { // get number of IDs-matching-tasks on each week day let finalTasks = [] as any; daysFromThisWeek.forEach((day:any) => { const forFinalTasks = tasksArr.filter((task:any) => task.taskDate === day); finalTasks = finalTasks.concat(forFinalTasks.length); }) return finalTasks; }) ) } getDaysFromThisWeek() { let daysArr = []; for(let i=1; i<=7; i++) { daysArr.push(dayjs().startOf('week').add(i, "day").format('YYYY-MM-DD')); } return daysArr; } }
Editor is loading...