You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
4.8 KiB
TypeScript

import { type Document, resolveBSONOptions } from './bson';
import type { Db } from './db';
import type { CommandOperationOptions } from './operations/command';
import { executeOperation } from './operations/execute_operation';
import {
ListDatabasesOperation,
type ListDatabasesOptions,
type ListDatabasesResult
} from './operations/list_databases';
import { RemoveUserOperation, type RemoveUserOptions } from './operations/remove_user';
import { RunAdminCommandOperation, type RunCommandOptions } from './operations/run_command';
import {
ValidateCollectionOperation,
type ValidateCollectionOptions
} from './operations/validate_collection';
/** @internal */
export interface AdminPrivate {
db: Db;
}
/**
* The **Admin** class is an internal class that allows convenient access to
* the admin functionality and commands for MongoDB.
*
* **ADMIN Cannot directly be instantiated**
* @public
*
* @example
* ```ts
* import { MongoClient } from 'mongodb';
*
* const client = new MongoClient('mongodb://localhost:27017');
* const admin = client.db().admin();
* const dbInfo = await admin.listDatabases();
* for (const db of dbInfo.databases) {
* console.log(db.name);
* }
* ```
*/
export class Admin {
/** @internal */
s: AdminPrivate;
/**
* Create a new Admin instance
* @internal
*/
constructor(db: Db) {
this.s = { db };
}
/**
* Execute a command
*
* The driver will ensure the following fields are attached to the command sent to the server:
* - `lsid` - sourced from an implicit session or options.session
* - `$readPreference` - defaults to primary or can be configured by options.readPreference
* - `$db` - sourced from the name of this database
*
* If the client has a serverApi setting:
* - `apiVersion`
* - `apiStrict`
* - `apiDeprecationErrors`
*
* When in a transaction:
* - `readConcern` - sourced from readConcern set on the TransactionOptions
* - `writeConcern` - sourced from writeConcern set on the TransactionOptions
*
* Attaching any of the above fields to the command will have no effect as the driver will overwrite the value.
*
* @param command - The command to execute
* @param options - Optional settings for the command
*/
async command(command: Document, options?: RunCommandOptions): Promise<Document> {
return executeOperation(
this.s.db.client,
new RunAdminCommandOperation(command, {
...resolveBSONOptions(options),
session: options?.session,
readPreference: options?.readPreference
})
);
}
/**
* Retrieve the server build information
*
* @param options - Optional settings for the command
*/
async buildInfo(options?: CommandOperationOptions): Promise<Document> {
return this.command({ buildinfo: 1 }, options);
}
/**
* Retrieve the server build information
*
* @param options - Optional settings for the command
*/
async serverInfo(options?: CommandOperationOptions): Promise<Document> {
return this.command({ buildinfo: 1 }, options);
}
/**
* Retrieve this db's server status.
*
* @param options - Optional settings for the command
*/
async serverStatus(options?: CommandOperationOptions): Promise<Document> {
return this.command({ serverStatus: 1 }, options);
}
/**
* Ping the MongoDB server and retrieve results
*
* @param options - Optional settings for the command
*/
async ping(options?: CommandOperationOptions): Promise<Document> {
return this.command({ ping: 1 }, options);
}
/**
* Remove a user from a database
*
* @param username - The username to remove
* @param options - Optional settings for the command
*/
async removeUser(username: string, options?: RemoveUserOptions): Promise<boolean> {
return executeOperation(
this.s.db.client,
new RemoveUserOperation(this.s.db, username, { dbName: 'admin', ...options })
);
}
/**
* Validate an existing collection
*
* @param collectionName - The name of the collection to validate.
* @param options - Optional settings for the command
*/
async validateCollection(
collectionName: string,
options: ValidateCollectionOptions = {}
): Promise<Document> {
return executeOperation(
this.s.db.client,
new ValidateCollectionOperation(this, collectionName, options)
);
}
/**
* List the available databases
*
* @param options - Optional settings for the command
*/
async listDatabases(options?: ListDatabasesOptions): Promise<ListDatabasesResult> {
return executeOperation(this.s.db.client, new ListDatabasesOperation(this.s.db, options));
}
/**
* Get ReplicaSet status
*
* @param options - Optional settings for the command
*/
async replSetGetStatus(options?: CommandOperationOptions): Promise<Document> {
return this.command({ replSetGetStatus: 1 }, options);
}
}