///
///
import { Db, ChangeStream } from "mongodb";
import { TokenUser, Base, mapFunc, finalizeFunc, reduceFunc, UpdateOneMessage, UpdateManyMessage, InsertOrUpdateOneMessage, Role, User, QueryOptions, CountOptions } from "@openiap/openflow-api";
import { ObservableUpDownCounter, Histogram } from "@opentelemetry/api-metrics";
import { Span } from "@opentelemetry/api";
import events = require("events");
import { clsstream } from "./WebSocketServerClient";
export type GetDocumentVersionOptions = {
collectionname: string;
id: string;
version: number;
jwt?: string;
decrypt?: boolean;
};
export type GetLatestDocumentVersionOptions = {
collectionname: string;
id: string;
jwt?: string;
decrypt?: boolean;
};
export declare class DatabaseConnection extends events.EventEmitter {
private mongodburl;
private cli;
db: Db;
private _dbname;
static mongodb_query: Histogram;
static mongodb_count: Histogram;
static mongodb_aggregate: Histogram;
static mongodb_insert: Histogram;
static mongodb_insertmany: Histogram;
static mongodb_update: Histogram;
static mongodb_updatemany: Histogram;
static mongodb_replace: Histogram;
static mongodb_delete: Histogram;
static mongodb_deletemany: Histogram;
static mongodb_active_sessions: ObservableUpDownCounter;
registerGlobalWatches: boolean;
queuemonitoringhandle: NodeJS.Timeout;
queuemonitoringlastrun: Date;
constructor(mongodburl: string, dbname: string, registerGlobalWatches: boolean);
static toArray(iterator: any): Promise;
isConnected: boolean;
shutdown(): Promise;
replicat: string;
streams: clsstream[];
/**
* Connect to MongoDB
* @returns Promise
*/
connect(parent?: Span): Promise;
ensureQueueMonitoring(): void;
queuemonitoring(): Promise;
GlobalWatchCallback(collectionname: string, next: any): Promise;
registerGlobalWatch(collectionname: string, span: Span): boolean;
ListCollections(jwt: string): Promise;
DropCollection(collectionname: string, jwt: string, parent: Span): Promise;
WellknownIdsArray: string[];
WellknownNamesArray: string[];
CleanACL(item: T, user: TokenUser, collectionname: string, parent: Span, skipNameLookup?: boolean): Promise;
Cleanmembers(item: T, original: T, span: Span): Promise;
parseResult(item: Base, agent: string, version: string): void;
compare(cur: string, version: string): number;
parseResults(arr: any[], agent: string, version: string): void;
/**
* Send a query to the database.
* @param {any} query MongoDB Query
* @param {Object} projection MongoDB projection
* @param {number} top Limit result to X number of results
* @param {number} skip Skip a number of records (Paging)
* @param {Object|string} orderby MongoDB orderby, or string with name of a single field to orderby
* @param {string} collectionname What collection to query
* @param {string} jwt JWT of user who is making the query, to limit results based on permissions
* @param {boolean} decrypt Decrypt encrypted data, default: true
* @returns Promise Array of results
*/
query(options: QueryOptions, span: Span): Promise;
/**
* Send a query to the database.
* @param {any} query MongoDB Query
* @param {string} collectionname What collection to query
* @param {string} jwt JWT of user who is making the query, to limit results based on permissions
* @returns Promise Array of results
*/
count(options: CountOptions, span: Span): Promise;
GetLatestDocumentVersion(options: GetLatestDocumentVersionOptions, span: Span): Promise;
GetDocumentVersion(options: GetDocumentVersionOptions, span: Span): Promise;
/**
* Get a single item based on id
* @param {string} id Id to search for
* @param {string} collectionname Collection to search
* @param {string} jwt JWT of user who is making the query, to limit results based on permissions
* @returns Promise
*/
GetOne(options: {
query?: object;
collectionname: string;
orderby?: object;
jwt?: string;
decrypt?: boolean;
}, span: Span): Promise;
/**
* Get a single item based on id
* @param {string} id Id to search for
* @param {string} collectionname Collection to search
* @param {string} jwt JWT of user who is making the query, to limit results based on permissions
* @returns Promise
*/
getbyid(id: string, collectionname: string, jwt: string, decrypt: boolean, span: Span): Promise;
/**
* Get a single item based on username
* @param {string} username Username to search for
* @param {string} collectionname Collection to search
* @param {string} jwt JWT of user who is making the query, to limit results based on permissions
* @returns Promise
*/
getbyusername(username: string, issuer: string, jwt: string, decrypt: boolean, span: Span): Promise;
/**
* Do MongoDB aggregation
* @param {any} aggregates
* @param {string} collectionname
* @param {string} jwt
* @returns Promise
*/
aggregate(aggregates: object[], collectionname: string, jwt: string, hint: Object | string, parent: Span): Promise;
/**
* Do MongoDB watch
* @param {any} aggregates
* @param {string} collectionname
* @param {string} jwt
* @returns Promise
*/
watch(aggregates: object[], collectionname: string, jwt: string): Promise;
/**
* Do MongoDB map reduce
* @param {any} aggregates
* @param {string} collectionname
* @param {string} jwt
* @returns Promise
*/
MapReduce(map: mapFunc, reduce: reduceFunc, finalize: finalizeFunc, query: any, out: string | any, collectionname: string, scope: any, jwt: string): Promise;
/**
* Create a new document in the database
* @param {T} item Item to create
* @param {string} collectionname The collection to create item in
* @param {number} w Write Concern ( 0:no acknowledgment, 1:Requests acknowledgment, 2: Requests acknowledgment from 2, 3:Requests acknowledgment from 3)
* @param {boolean} j Ensure is written to the on-disk journal.
* @param {string} jwt JWT of the user, creating the item, to ensure rights and permission
* @returns Promise Returns the new item added
*/
InsertOne(item: T, collectionname: string, w: number, j: boolean, jwt: string, parent: Span): Promise;
InsertMany(items: T[], collectionname: string, w: number, j: boolean, jwt: string, parent: Span): Promise;
/**
* Update entity in database
* @param {T} item Item to update
* @param {string} collectionname Collection containing item
* @param {number} w Write Concern ( 0:no acknowledgment, 1:Requests acknowledgment, 2: Requests acknowledgment from 2, 3:Requests acknowledgment from 3)
* @param {boolean} j Ensure is written to the on-disk journal.
* @param {string} jwt JWT of user who is doing the update, ensuring rights
* @returns Promise
*/
_UpdateOne(query: any, item: T, collectionname: string, w: number, j: boolean, jwt: string, parent: Span): Promise;
UpdateOne(q: UpdateOneMessage, parent: Span): Promise;
/**
* Update multiple documents in database based on update document
* @param {any} query MongoDB Query
* @param {T} item Update document
* @param {string} collectionname Collection containing item
* @param {number} w Write Concern ( 0:no acknowledgment, 1:Requests acknowledgment, 2: Requests acknowledgment from 2, 3:Requests acknowledgment from 3)
* @param {boolean} j Ensure is written to the on-disk journal.
* @param {string} jwt JWT of user who is doing the update, ensuring rights
* @returns Promise
*/
UpdateDocument(q: UpdateManyMessage, parent: Span): Promise;
static Semaphore: (n: any) => {
n: any;
down(): Promise;
up(): void;
wait(): Promise;
};
InsertOrUpdateOne(q: InsertOrUpdateOneMessage, parent: Span): Promise;
private static InsertOrUpdateOneSemaphore;
/**
* Insert or Update depending on document allready exists.
* @param {T} item Item to insert or update
* @param {string} collectionname Collection containing item
* @param {string} uniqeness List of fields to combine for uniqeness
* @param {number} w Write Concern ( 0:no acknowledgment, 1:Requests acknowledgment, 2: Requests acknowledgment from 2, 3:Requests acknowledgment from 3)
* @param {boolean} j Ensure is written to the on-disk journal.
* @param {string} jwt JWT of user who is doing the update, ensuring rights
* @returns Promise
*/
_InsertOrUpdateOne(q: InsertOrUpdateOneMessage, parent: Span): Promise;
InsertOrUpdateMany(items: T[], collectionname: string, uniqeness: string, skipresults: boolean, w: number, j: boolean, jwt: string, parent: Span): Promise;
private _DeleteFile;
/**
* @param {string} id id of object to delete
* @param {string} collectionname collectionname Collection containing item
* @param {string} jwt JWT of user who is doing the delete, ensuring rights
* @returns Promise
*/
DeleteOne(id: string | any, collectionname: string, recursive: boolean, jwt: string, parent: Span): Promise;
/**
* @param {string} id id of object to delete
* @param {string} collectionname collectionname Collection containing item
* @param {string} jwt JWT of user who is doing the delete, ensuring rights
* @returns Promise
*/
DeleteMany(query: string | any, ids: string[], collectionname: string, queryas: string, recursive: boolean, jwt: string, parent: Span): Promise;
/**
* Helper function used to check if field needs to be encrypted
* @param {string[]} keys List of fields that needs to be encrypted
* @param {string} key Current field
* @param {object=null} value value of field, ensuring we can actully encrypt the field
* @returns boolean
*/
private _shouldEncryptValue;
_encryptentity(item: any, newObj: any, key: any): any;
/**
* Enumerate object, encrypting fields that needs to be encrypted
* @param {T} item Item to enumerate
* @returns T Object with encrypted fields
*/
encryptentity(item: Base): Base;
_decryptentity(item: any, newObj: any, key: any): any;
/**
* Enumerate object, decrypting fields that needs to be decrypted
* @param {T} item Item to enumerate
* @returns T Object with decrypted fields
*/
decryptentity(item: T): T;
/**
* Create a MongoDB query filtering result based on permission of current user and requested permission
* @param {string} jwt JWT of the user creating the query
* @param {number[]} bits Permission wanted on objects
* @returns Object MongoDB query
*/
getbasequery(user: TokenUser | User, field: string, bits: number[]): Object;
private getbasequeryuserid;
/**
* Ensure _type and _acs on object
* @param {T} item Object to validate
* @returns T Validated object
*/
ensureResource(item: T, collection: string): T;
CheckEntityRestriction(user: TokenUser, collection: string, item: Base, parent: Span): Promise;
/**
* Validated user has rights to perform the requested action ( create is missing! )
* @param {TokenUser} user User requesting permission
* @param {any} item Item permission is needed on
* @param {Rights} action Permission wanted (create, update, delete)
* @returns boolean Is allowed
*/
static hasAuthorization(user: TokenUser, item: Base, action: number): boolean;
static replaceAll(target: any, search: any, replacement: any): any;
/**
* Helper function to clean item before saving in MongoDB ( normalize ACE rights and remove illegal key $$ )
* @param {object} o Item to clean
* @returns void Clean object
*/
static traversejsonencode(o: any): void;
static traversejsondecode(o: any): void;
SaveUpdateDiff(q: UpdateOneMessage, user: TokenUser, parent: Span): Promise;
visit(obj: any, func: any): void;
SaveDiff(collectionname: string, original: any, item: any, parent: Span): Promise;
createIndex(collectionname: string, name: string, keypath: any, options: any, parent: Span): Promise;
deleteIndex(collectionname: string, name: string, parent: Span): Promise;
ParseTimeseries(span: Span): Promise;
static collections_with_text_index: string[];
static timeseries_collections: string[];
ensureindexes(parent: Span): Promise;
static istimeseries(collectionname: string): boolean;
static usemetadata(collectionname: string): boolean;
static otel_label(collectionname: string, user: TokenUser | User, action: "query" | "count" | "aggregate" | "insert" | "insertmany" | "update" | "updatemany" | "replace" | "delete" | "deletemany"): {
collection: string;
username: string;
} | {
collection: string;
username?: undefined;
};
}
export declare class EntityRestriction extends Base {
collection: string;
copyperm: boolean;
paths: string[];
constructor();
static assign(o: any): EntityRestriction;
IsMatch(object: object): boolean;
IsAuthorized(user: TokenUser | User): boolean;
}