RocketChat/Rocket.Chat

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

Summary

Maintainability
A
0 mins
Test Coverage
import type { IFederationServer, RocketChatRecordDeleted } from '@rocket.chat/core-typings';
import type { IFederationServersModel } from '@rocket.chat/model-typings';
import { Users } from '@rocket.chat/models';
import type { Collection, Db, IndexDescription, UpdateResult } from 'mongodb';

import { BaseRaw } from './BaseRaw';

export class FederationServersRaw extends BaseRaw<IFederationServer> implements IFederationServersModel {
    constructor(db: Db, trash?: Collection<RocketChatRecordDeleted<IFederationServer>>) {
        super(db, 'federation_servers', trash);
    }

    protected modelIndexes(): IndexDescription[] {
        return [{ key: { domain: 1 } }];
    }

    saveDomain(domain: string): Promise<UpdateResult> {
        return this.updateOne(
            { domain },
            {
                $setOnInsert: {
                    domain,
                },
            },
            { upsert: true },
        );
    }

    async refreshServers(): Promise<void> {
        // TODO remove model dependency - this logs should be inside a function/service and not in a model
        const domains = await Users.getDistinctFederationDomains();

        for await (const domain of domains) {
            await this.saveDomain(domain);
        }

        await this.deleteMany({ domain: { $nin: domains } });
    }
}