lib/Server.ts (59 lines of code) (raw):
import * as MongoDb from 'mongodb';
import { Database, DatabaseJSON } from './Database';
import { Utils } from './Utils';
export interface ServerJSON {
name: string;
size: number;
databases: DatabaseJSON[]
}
export interface ServerErrorJSON {
name: string;
error: {
code: string | number | undefined;
name: string;
message: string;
};
}
export class Server {
private _client: MongoDb.MongoClient;
private _name: string;
private _size: number;
get name() { return this._name; }
get size() { return this._size; }
constructor(name: string, client: MongoDb.MongoClient) {
this._name = name;
this._client = client;
}
async databases() {
const db = this._client.db("test");
const results = await db.admin().listDatabases();
this._size = results.totalSize ?? 0;
const databases: Database[] = [];
if (Array.isArray(results.databases)) {
for (const d of results.databases) {
const db = this._client.db(d.name);
const database = new Database(d.name, d.sizeOnDisk ?? 0, d.empty ?? true, db);
databases.push(database);
}
}
return databases;
}
async database(name: string): Promise<Database | undefined> {
const databases = await this.databases();
return databases.find(d => d.name === name)
}
async toJson(): Promise<ServerJSON> {
const databases = await this.databases();
const dbsJson: DatabaseJSON[] = [];
for (const database of databases) {
const json = await database.toJson();
dbsJson.push(json);
}
Utils.fieldSort(dbsJson, 'name');
return {
name: this.name,
size: this.size,
databases: dbsJson
}
}
}