RocketChat/Rocket.Chat

View on GitHub
packages/model-typings/src/models/ISessionsModel.ts

Summary

Maintainability
B
4 hrs
Test Coverage
import type {
    ISession,
    UserSessionAggregationResult,
    DeviceSessionAggregationResult,
    OSSessionAggregationResult,
    IUser,
    DeviceManagementPopulatedSession,
    DeviceManagementSession,
} from '@rocket.chat/core-typings';
import type { BulkWriteResult, Document, UpdateResult, FindCursor, OptionalId } from 'mongodb';

import type { IBaseModel } from './IBaseModel';

export type DestructuredDate = { year: number; month: number; day: number };
export type DestructuredDateWithType = {
    year: number;
    month: number;
    day: number;
    type?: 'month' | 'week';
};
export type DestructuredRange = { start: DestructuredDate; end: DestructuredDate };
export type DateRange = { start: Date; end: Date };

type CustomSortOp = 'loginAt' | 'device.name' | 'device.os.name';
type CustomSortOpAdmin = CustomSortOp | '_user.username' | '_user.name';

export interface ISessionsModel extends IBaseModel<ISession> {
    aggregateSessionsAndPopulate({
        sort,
        search,
        offset,
        count,
    }: {
        sort?: Record<CustomSortOpAdmin, 1 | -1>;
        search?: string | null;
        offset?: number;
        count?: number;
    }): Promise<{ sessions: Array<DeviceManagementPopulatedSession>; count: number; offset: number; total: number }>;

    aggregateSessionsByUserId({
        uid,
        sort,
        search,
        offset,
        count,
    }: {
        uid: string;
        sort?: Record<CustomSortOp, 1 | -1>;
        search?: string | null;
        offset?: number;
        count?: number;
    }): Promise<{ sessions: Array<DeviceManagementSession>; count: number; offset: number; total: number }>;

    getActiveUsersBetweenDates({ start, end }: DestructuredRange): Promise<ISession[]>;
    findLastLoginByIp(ip: string): Promise<ISession | null>;
    findOneBySessionId(sessionId: string): Promise<ISession | null>;
    findOneBySessionIdAndUserId(sessionId: string, userId: string): Promise<ISession | null>;

    findSessionsNotClosedByDateWithoutLastActivity({ year, month, day }: DestructuredDate): FindCursor<ISession>;
    getActiveUsersOfPeriodByDayBetweenDates({ start, end }: DestructuredRange): Promise<
        {
            day: number;
            month: number;
            year: number;
            usersList: IUser['_id'][];
            users: number;
        }[]
    >;

    getBusiestTimeWithinHoursPeriod({ start, end, groupSize }: DateRange & { groupSize: number }): Promise<
        {
            hour: number;
            users: number;
        }[]
    >;

    getTotalOfSessionsByDayBetweenDates({ start, end }: DestructuredRange): Promise<
        {
            day: number;
            month: number;
            year: number;
            users: number;
        }[]
    >;

    getTotalOfSessionByHourAndDayBetweenDates({ start, end }: DateRange): Promise<
        {
            hour: number;
            day: number;
            month: number;
            year: number;
            users: number;
        }[]
    >;

    getUniqueUsersOfYesterday(): Promise<UserSessionAggregationResult>;

    getUniqueUsersOfLastMonth(): Promise<UserSessionAggregationResult>;

    getUniqueUsersOfLastWeek(): Promise<UserSessionAggregationResult>;

    getUniqueDevicesOfYesterday(): Promise<DeviceSessionAggregationResult>;

    getUniqueDevicesOfLastMonth(): Promise<DeviceSessionAggregationResult>;

    getUniqueDevicesOfLastWeek(): Promise<DeviceSessionAggregationResult>;

    getUniqueOSOfYesterday(): Promise<OSSessionAggregationResult>;

    getUniqueOSOfLastMonth(): Promise<OSSessionAggregationResult>;

    getUniqueOSOfLastWeek(): Promise<OSSessionAggregationResult>;

    createOrUpdate(data: Omit<ISession, '_id' | 'createdAt' | '_updatedAt'>): Promise<UpdateResult | undefined>;

    closeByInstanceIdAndSessionId(instanceId: string, sessionId: string): Promise<UpdateResult>;

    updateActiveSessionsByDateAndInstanceIdAndIds(
        params: Partial<DestructuredDate>,
        instanceId: string,
        sessions: string[],
        data: Record<string, any>,
    ): Promise<UpdateResult | Document>;

    updateActiveSessionsByDate({ year, month, day }: DestructuredDate, data: Record<string, any>): Promise<UpdateResult | Document>;

    logoutByInstanceIdAndSessionIdAndUserId(instanceId: string, sessionId: string, userId: string): Promise<UpdateResult>;

    logoutBySessionIdAndUserId({
        sessionId,
        userId,
    }: {
        sessionId: ISession['sessionId'];
        userId: IUser['_id'];
    }): Promise<UpdateResult | Document>;

    logoutByloginTokenAndUserId({
        loginToken,
        userId,
        logoutBy,
    }: {
        loginToken: ISession['loginToken'];
        userId: IUser['_id'];
        logoutBy?: IUser['_id'];
    }): Promise<UpdateResult | Document>;

    createBatch(sessions: OptionalId<ISession>[]): Promise<BulkWriteResult | undefined>;

    updateDailySessionById(_id: ISession['_id'], record: Partial<ISession>): Promise<UpdateResult>;

    updateAllSessionsByDateToComputed({ start, end }: DestructuredRange): Promise<UpdateResult | Document>;
}