2022-12-14 09:41:49 +01:00
|
|
|
import { Knex } from 'knex';
|
2021-09-20 19:15:50 +02:00
|
|
|
import { LifecycleProvider } from './lifecycles';
|
|
|
|
import { MigrationProvider } from './migrations';
|
2022-11-15 20:53:06 +00:00
|
|
|
import { SchemaProvider } from './schema';
|
2021-09-20 19:15:50 +02:00
|
|
|
|
2022-06-07 16:07:39 +02:00
|
|
|
type LogicalOperators<T> = {
|
2021-06-17 16:17:15 +02:00
|
|
|
$and?: WhereParams<T>[];
|
|
|
|
$or?: WhereParams<T>[];
|
|
|
|
$not?: WhereParams<T>;
|
2022-06-07 16:07:39 +02:00
|
|
|
};
|
2022-05-11 12:12:30 -06:00
|
|
|
|
|
|
|
type AttributeOperators<T, K extends keyof T> = {
|
2022-06-07 16:07:39 +02:00
|
|
|
$eq?: T[K] | Array<T[K]>;
|
|
|
|
$ne?: T[K] | Array<T[K]>;
|
2022-05-11 12:12:30 -06:00
|
|
|
$in?: T[K][];
|
|
|
|
$notIn?: T[K][];
|
|
|
|
$lt?: T[K];
|
|
|
|
$lte?: T[K];
|
|
|
|
$gt?: T[K];
|
|
|
|
$gte?: T[K];
|
|
|
|
$between?: [T[K], T[K]];
|
|
|
|
$contains?: T[K];
|
|
|
|
$notContains?: T[K];
|
|
|
|
$containsi?: T[K];
|
|
|
|
$notContainsi?: T[K];
|
|
|
|
$startsWith?: T[K];
|
|
|
|
$endsWith?: T[K];
|
|
|
|
$null?: boolean;
|
|
|
|
$notNull?: boolean;
|
|
|
|
$not?: WhereParams<T> | AttributeOperators<T, K>;
|
2022-06-07 16:07:39 +02:00
|
|
|
};
|
2021-06-17 16:17:15 +02:00
|
|
|
|
2022-05-11 12:12:30 -06:00
|
|
|
export type WhereParams<T> = {
|
|
|
|
[K in keyof T]?: T[K] | T[K][] | AttributeOperators<T, K>;
|
2022-10-27 11:51:44 +02:00
|
|
|
} & LogicalOperators<T>;
|
2021-06-17 16:17:15 +02:00
|
|
|
|
|
|
|
type Sortables<T> = {
|
|
|
|
// check sortable
|
|
|
|
[P in keyof T]: P;
|
|
|
|
}[keyof T];
|
|
|
|
|
|
|
|
type Direction = 'asc' | 'ASC' | 'DESC' | 'desc';
|
|
|
|
|
2021-06-30 20:00:03 +02:00
|
|
|
interface FindParams<T> {
|
2021-06-17 16:17:15 +02:00
|
|
|
select?: (keyof T)[];
|
|
|
|
// TODO: add nested operators & relations
|
|
|
|
where?: WhereParams<T>;
|
|
|
|
limit?: number;
|
|
|
|
offset?: number;
|
|
|
|
orderBy?: // TODO: add relations
|
|
|
|
| Sortables<T>
|
|
|
|
| Sortables<T>[]
|
|
|
|
| { [K in Sortables<T>]?: Direction }
|
|
|
|
| { [K in Sortables<T>]?: Direction }[];
|
2021-06-30 20:00:03 +02:00
|
|
|
// TODO: define nested obj
|
|
|
|
populate?: (keyof T)[];
|
|
|
|
}
|
|
|
|
|
|
|
|
interface CreateParams<T> {
|
|
|
|
select?: (keyof T)[];
|
|
|
|
populate?: (keyof T)[];
|
|
|
|
data: T[keyof T];
|
|
|
|
}
|
|
|
|
|
|
|
|
interface CreateManyParams<T> {
|
|
|
|
select?: (keyof T)[];
|
|
|
|
populate?: (keyof T)[];
|
|
|
|
data: T[keyof T][];
|
|
|
|
}
|
2021-06-17 16:17:15 +02:00
|
|
|
|
2021-07-06 14:18:03 +02:00
|
|
|
interface Pagination {
|
|
|
|
page: number;
|
|
|
|
pageSize: number;
|
|
|
|
pageCount: number;
|
|
|
|
total: number;
|
|
|
|
}
|
|
|
|
|
2021-09-20 19:15:50 +02:00
|
|
|
interface PopulateParams {}
|
|
|
|
interface EntityManager {
|
|
|
|
findOne<K extends keyof AllTypes>(uid: K, params: FindParams<AllTypes[K]>): Promise<any>;
|
|
|
|
findMany<K extends keyof AllTypes>(uid: K, params: FindParams<AllTypes[K]>): Promise<any[]>;
|
|
|
|
|
|
|
|
create<K extends keyof AllTypes>(uid: K, params: CreateParams<AllTypes[K]>): Promise<any>;
|
|
|
|
createMany<K extends keyof AllTypes>(
|
|
|
|
uid: K,
|
|
|
|
params: CreateManyParams<AllTypes[K]>
|
|
|
|
): Promise<{ count: number }>;
|
|
|
|
|
|
|
|
update<K extends keyof AllTypes>(uid: K, params: any): Promise<any>;
|
|
|
|
updateMany<K extends keyof AllTypes>(uid: K, params: any): Promise<{ count: number }>;
|
|
|
|
|
|
|
|
delete<K extends keyof AllTypes>(uid: K, params: any): Promise<any>;
|
|
|
|
deleteMany<K extends keyof AllTypes>(uid: K, params: any): Promise<{ count: number }>;
|
|
|
|
|
|
|
|
count<K extends keyof AllTypes>(uid: K, params: any): Promise<number>;
|
|
|
|
|
|
|
|
attachRelations<K extends keyof AllTypes>(uid: K, id: ID, data: any): Promise<any>;
|
|
|
|
updateRelations<K extends keyof AllTypes>(uid: K, id: ID, data: any): Promise<any>;
|
|
|
|
deleteRelations<K extends keyof AllTypes>(uid: K, id: ID): Promise<any>;
|
|
|
|
|
|
|
|
populate<K extends keyof AllTypes, T extends AllTypes[K]>(
|
|
|
|
uid: K,
|
|
|
|
entity: T,
|
|
|
|
populate: PopulateParams
|
|
|
|
): Promise<T>;
|
|
|
|
|
|
|
|
load<K extends keyof AllTypes, T extends AllTypes[K], SK extends keyof T>(
|
|
|
|
uid: K,
|
|
|
|
entity: T,
|
|
|
|
field: SK,
|
|
|
|
populate: PopulateParams
|
|
|
|
): Promise<T[SK]>;
|
|
|
|
}
|
|
|
|
|
2021-06-17 16:17:15 +02:00
|
|
|
interface QueryFromContentType<T extends keyof AllTypes> {
|
2021-08-27 08:55:18 +02:00
|
|
|
findOne(params: FindParams<AllTypes[T]>): Promise<any>;
|
|
|
|
findMany(params: FindParams<AllTypes[T]>): Promise<any[]>;
|
|
|
|
findWithCount(params: FindParams<AllTypes[T]>): Promise<[any[], number]>;
|
|
|
|
findPage(params: FindParams<AllTypes[T]>): Promise<{ results: any[]; pagination: Pagination }>;
|
2021-07-06 14:18:03 +02:00
|
|
|
|
2021-08-27 08:55:18 +02:00
|
|
|
create(params: CreateParams<AllTypes[T]>): Promise<any>;
|
|
|
|
createMany(params: CreateManyParams<AllTypes[T]>): Promise<{ count: number }>;
|
2021-07-06 14:18:03 +02:00
|
|
|
|
2021-08-27 08:55:18 +02:00
|
|
|
update(params: any): Promise<any>;
|
|
|
|
updateMany(params: any): Promise<{ count: number }>;
|
2021-07-06 14:18:03 +02:00
|
|
|
|
2021-08-27 08:55:18 +02:00
|
|
|
delete(params: any): Promise<any>;
|
|
|
|
deleteMany(params: any): Promise<{ count: number }>;
|
2021-07-06 14:18:03 +02:00
|
|
|
|
2021-08-27 08:55:18 +02:00
|
|
|
count(params: any): Promise<number>;
|
2021-07-06 14:18:03 +02:00
|
|
|
|
2021-08-27 08:55:18 +02:00
|
|
|
attachRelations(id: ID, data: any): Promise<any>;
|
|
|
|
updateRelations(id: ID, data: any): Promise<any>;
|
|
|
|
deleteRelations(id: ID): Promise<any>;
|
2021-09-20 19:15:50 +02:00
|
|
|
|
|
|
|
populate<S extends AllTypes[T]>(entity: S, populate: PopulateParams): Promise<S>;
|
|
|
|
|
|
|
|
load<S extends AllTypes[T], K extends keyof S>(
|
|
|
|
entity: S,
|
|
|
|
field: K,
|
|
|
|
populate: PopulateParams
|
|
|
|
): Promise<S[K]>;
|
2021-06-17 16:17:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
interface ModelConfig {
|
|
|
|
tableName: string;
|
|
|
|
[k: string]: any;
|
|
|
|
}
|
|
|
|
|
2021-06-28 12:34:29 +02:00
|
|
|
interface ConnectionConfig {}
|
|
|
|
|
|
|
|
interface DatabaseConfig {
|
|
|
|
connection: ConnectionConfig;
|
|
|
|
models: ModelConfig[];
|
|
|
|
}
|
2021-06-30 20:00:03 +02:00
|
|
|
export interface Database {
|
2022-11-15 20:53:06 +00:00
|
|
|
schema: SchemaProvider;
|
2021-09-20 19:15:50 +02:00
|
|
|
lifecycles: LifecycleProvider;
|
|
|
|
migrations: MigrationProvider;
|
|
|
|
entityManager: EntityManager;
|
2022-10-27 11:51:44 +02:00
|
|
|
queryBuilder: any;
|
2022-12-14 09:41:49 +01:00
|
|
|
metadata: any;
|
|
|
|
connection: Knex;
|
2021-06-30 20:00:03 +02:00
|
|
|
|
2021-06-17 16:17:15 +02:00
|
|
|
query<T extends keyof AllTypes>(uid: T): QueryFromContentType<T>;
|
2023-01-13 12:23:30 +02:00
|
|
|
transaction(
|
2023-01-23 18:43:14 +02:00
|
|
|
cb?: (params: {
|
|
|
|
trx: Knex.Transaction;
|
|
|
|
rollback: () => Promise<void>;
|
|
|
|
commit: () => Promise<void>;
|
2023-01-24 14:39:24 +02:00
|
|
|
}) => Promise<unknown>
|
2023-01-13 12:23:30 +02:00
|
|
|
):
|
2023-01-23 18:43:14 +02:00
|
|
|
| Promise<unknown>
|
2023-01-13 12:23:30 +02:00
|
|
|
| { get: () => Knex.Transaction; rollback: () => Promise<void>; commit: () => Promise<void> };
|
2021-06-17 16:17:15 +02:00
|
|
|
}
|
2021-06-30 20:00:03 +02:00
|
|
|
export class Database implements Database {
|
|
|
|
static transformContentTypes(contentTypes: any[]): ModelConfig[];
|
|
|
|
static init(config: DatabaseConfig): Promise<Database>;
|
|
|
|
}
|