open-learning-exchange/planet

View on GitHub
src/app/shared/dialogs/dialogs-list.service.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { Injectable } from '@angular/core';
import { map } from 'rxjs/operators';
import { findDocuments } from '../mangoQueries';
import { UserService } from '../user.service';
import { StateService } from '../state.service';
import { CouchService } from '../couchdb.service';
import { filterSpecificFields } from '../table-helpers';
import { attachNamesToPlanets } from '../../manager-dashboard/reports/reports.utils';

const listColumns = {
  'resources': [ 'title' ],
  'courses': [ 'courseTitle' ],
  '_users': [ 'Full Name', 'name' ],
  'child_users': [ 'Full Name', 'name' ],
  'communityregistrationrequests': [ 'name', 'code', 'localDomain' ]
};

@Injectable()
export class DialogsListService {

  constructor(
    private stateService: StateService,
    private userService: UserService,
    private couchService: CouchService
  ) {}

  defaultSelectorFunctions() {
    const users = (user) => {
      const { _id, roles, isUserAdmin, requestId } = user;
      return (
        _id !== this.userService.get()._id && _id !== 'org.couchdb.user:satellite' &&
        (roles.indexOf('learner') > -1 || roles.indexOf('leader') > -1 || isUserAdmin === true) &&
        requestId === undefined
      );
    };
    return {
      '_users': users,
      'child_users': users
    };
  }

  filterResults(data, selector) {
    return data.filter(item => {
      if (selector instanceof Function) {
        return selector(item);
      }
      return Object.entries(selector).reduce((match, [ field, value ]) => item[field] === value, false);
    });
  }

  getListAndColumns(db: string, selector?: any, planetField: string = 'local') {
    selector = selector || this.defaultSelectorFunctions()[db];
    if (db === '_users') {
      return this.couchService.findAll('_users', findDocuments({}, this.userService.userProperties))
        .pipe(map((newData) => ({ tableData: this.filterResults(newData, selector), columns: listColumns[db] })));
    }
    return this.stateService.getCouchState(db, planetField).pipe(
      map((newData: any) => {
        if (db === 'communityregistrationrequests') {
          newData = attachNamesToPlanets(newData).map(
            ({ doc, nameDoc }) => ({ doc, nameDoc, ...doc, name: nameDoc ? nameDoc.name : doc.name })
          );
        }
        const tableData = selector ? this.filterResults(newData, selector) : newData;
        return { tableData, columns: listColumns[db] };
      })
    );
  }

  attachDocsData(db: string, field: string, callback: Function, initialSelection?: any[]) {
    return this.getListAndColumns(db).pipe(map((res) => {
      res.tableData = db === 'resources' ? res.tableData.filter((tableValue: any) => tableValue._attachments) : res.tableData;
      return ({ okClick: callback,
        filterPredicate: filterSpecificFields([ field ]),
        itemDescription: db,
        nameProperty: field,
        selectionOptional: true,
        allowMulti: true,
        initialSelection,
        ...res
      });
    }));
  }

}