RocketChat/Rocket.Chat

View on GitHub
ee/apps/account-service/src/Account.ts

Summary

Maintainability
A
50 mins
Test Coverage
import { ServiceClass } from '@rocket.chat/core-services';
import type { IAccount, ILoginResult } from '@rocket.chat/core-services';
import { Settings } from '@rocket.chat/models';
import { getLoginExpirationInDays } from '@rocket.chat/tools';

import { loginViaResume } from './lib/loginViaResume';
import { loginViaUsername } from './lib/loginViaUsername';
import { removeSession } from './lib/removeSession';

export class Account extends ServiceClass implements IAccount {
    protected name = 'accounts';

    private loginExpiration = 90;

    constructor() {
        super();

        this.onEvent('watch.settings', async ({ clientAction, setting }): Promise<void> => {
            if (clientAction === 'removed') {
                return;
            }
            const { _id, value } = setting;
            if (_id !== 'Accounts_LoginExpiration') {
                return;
            }

            this.loginExpiration = getLoginExpirationInDays(value as number);
        });
    }

    async login({ resume, user, password }: { resume: string; user: { username: string }; password: string }): Promise<false | ILoginResult> {
        if (resume) {
            return loginViaResume(resume, this.loginExpiration);
        }

        if (user && password) {
            return loginViaUsername(user, password, this.loginExpiration);
        }

        return false;
    }

    async logout({ userId, token }: { userId: string; token: string }): Promise<void> {
        return removeSession(userId, token);
    }

    async started(): Promise<void> {
        const expiry = await Settings.findOne({ _id: 'Accounts_LoginExpiration' }, { projection: { value: 1 } });

        this.loginExpiration = getLoginExpirationInDays(expiry?.value as number);
    }
}