RocketChat/Rocket.Chat

View on GitHub
apps/meteor/server/models/raw/ServerEvents.ts

Summary

Maintainability
C
1 day
Test Coverage
import type { IServerEvent, RocketChatRecordDeleted } from '@rocket.chat/core-typings';
import { ServerEventType } from '@rocket.chat/core-typings';
import type { IServerEventsModel } from '@rocket.chat/model-typings';
import type { Collection, Db, IndexDescription } from 'mongodb';

import { BaseRaw } from './BaseRaw';

export class ServerEventsRaw extends BaseRaw<IServerEvent> implements IServerEventsModel {
    constructor(db: Db, trash?: Collection<RocketChatRecordDeleted<IServerEvent>>) {
        super(db, 'server_events', trash);
    }

    protected modelIndexes(): IndexDescription[] {
        return [{ key: { t: 1, ip: 1, ts: -1 } }, { key: { 't': 1, 'u.username': 1, 'ts': -1 } }];
    }

    async findLastFailedAttemptByIp(ip: string): Promise<IServerEvent | null> {
        return this.findOne<IServerEvent>(
            {
                ip,
                t: ServerEventType.FAILED_LOGIN_ATTEMPT,
            },
            { sort: { ts: -1 } },
        );
    }

    async findLastFailedAttemptByUsername(username: string): Promise<IServerEvent | null> {
        return this.findOne<IServerEvent>(
            {
                'u.username': username,
                't': ServerEventType.FAILED_LOGIN_ATTEMPT,
            },
            { sort: { ts: -1 } },
        );
    }

    async findLastSuccessfulAttemptByIp(ip: string): Promise<IServerEvent | null> {
        return this.findOne<IServerEvent>(
            {
                ip,
                t: ServerEventType.LOGIN,
            },
            { sort: { ts: -1 } },
        );
    }

    async findLastSuccessfulAttemptByUsername(username: string): Promise<IServerEvent | null> {
        return this.findOne<IServerEvent>(
            {
                'u.username': username,
                't': ServerEventType.LOGIN,
            },
            { sort: { ts: -1 } },
        );
    }

    async countFailedAttemptsByUsernameSince(username: string, since: Date): Promise<number> {
        return this.find({
            'u.username': username,
            't': ServerEventType.FAILED_LOGIN_ATTEMPT,
            'ts': {
                $gte: since,
            },
        }).count();
    }

    countFailedAttemptsByIpSince(ip: string, since: Date): Promise<number> {
        return this.find({
            ip,
            t: ServerEventType.FAILED_LOGIN_ATTEMPT,
            ts: {
                $gte: since,
            },
        }).count();
    }

    countFailedAttemptsByIp(ip: string): Promise<number> {
        return this.find({
            ip,
            t: ServerEventType.FAILED_LOGIN_ATTEMPT,
        }).count();
    }

    countFailedAttemptsByUsername(username: string): Promise<number> {
        return this.find({
            'u.username': username,
            't': ServerEventType.FAILED_LOGIN_ATTEMPT,
        }).count();
    }
}