Asymmetrik/node-rest-starter

View on GitHub
src/app/core/user/user.service.ts

Summary

Maintainability
A
3 hrs
Test Coverage
import { Readable } from 'stream';

import { FilterQuery, PopulateOptions, Types } from 'mongoose';

import { UserDocument, UserModel, User } from './user.model';
import { utilService } from '../../../dependencies';
import { PagingResults } from '../../common/mongoose/paginate.plugin';

class UserService {
    constructor(private model: UserModel) {}

    read(
        id: string | Types.ObjectId,
        populate:
            | string
            | string[]
            | PopulateOptions
            | Array<string | PopulateOptions> = []
    ): Promise<UserDocument> {
        return this.model
            .findById(id)
            .populate(populate as string[])
            .exec();
    }

    update(document: UserDocument, obj = {}): Promise<UserDocument> {
        document.set(obj);
        return document.save();
    }

    async remove(document: UserDocument): Promise<UserDocument> {
        await document.deleteOne();
        return document;
    }

    searchUsers(
        queryParams = {},
        query: FilterQuery<UserDocument> = {},
        search = '',
        searchFields: string[] = [],
        populate:
            | string
            | string[]
            | PopulateOptions
            | Array<string | PopulateOptions> = []
    ): Promise<PagingResults<UserDocument>> {
        query = query || {};
        const page = utilService.getPage(queryParams);
        const limit = utilService.getLimit(queryParams);
        const sort = utilService.getSortObj(queryParams, 'DESC', '_id');

        let mQuery = this.model.find(query);

        if (searchFields.length > 0) {
            mQuery = mQuery.containsSearch(search, searchFields);
        } else {
            mQuery = mQuery.textSearch(search);
        }

        return mQuery
            .sort(sort)
            .populate(populate as string[])
            .paginate(limit, page);
    }

    cursorSearch(
        queryParams = {},
        search = '',
        query: FilterQuery<UserDocument> = {},
        searchFields: string[] = [],
        populate:
            | string
            | string[]
            | PopulateOptions
            | Array<string | PopulateOptions> = []
    ): Readable {
        const sort = utilService.getSortObj(queryParams, 'DESC', '_id');

        let mQuery = this.model.find(query);

        if (searchFields.length > 0) {
            mQuery = mQuery.containsSearch(search, searchFields);
        } else {
            mQuery = mQuery.textSearch(search);
        }

        return mQuery
            .sort(sort)
            .populate(populate as string[])
            .cursor();
    }

    updateLastLogin(document: UserDocument): Promise<UserDocument> {
        document.lastLogin = new Date();
        return document.save();
    }

    updateLastLoginWithAccess(document: UserDocument): Promise<UserDocument> {
        document.lastLoginWithAccess = new Date();
        return document.save();
    }

    updatePreferences(
        user: UserDocument,
        pref: Record<string, unknown>
    ): Promise<UserDocument> {
        user.preferences = { ...user.preferences, ...pref };
        return user.save();
    }

    updateRequiredOrgs(
        user: UserDocument,
        requiredOrgs: Record<string, unknown>
    ): Promise<UserDocument> {
        user.organizationLevels = requiredOrgs;
        return user.save();
    }
}

export = new UserService(User);