import { RecordType } from '../data-types/definitions/record.js'; import { QueryResultCardinality, QueryWhere, SchemaQuery } from '../../query/types/index.js'; import { StringKey } from '../../utils/types.js'; /** * The set of collections that define a schema */ export type Models>> = { [K in StringKey]: Collection; }; /** * Information pertaining to a collection */ export interface Collection = Models, CN extends CollectionNameFromModels = CollectionNameFromModels> { schema: Model; relationships?: Relationships; permissions?: ModelRolePermissions; } /** * Collection names in a model */ export type CollectionNameFromModels> = StringKey; /** * An individual model */ export type Model = RecordType; /** * Mapped type of all relationships in a schema */ type ModelsRelationship = Models> = { [CN in CollectionNameFromModels]: Relationship>; }; /** * Union of specified relationships in a schema with CN */ type ModelRelationship = Models, CN extends CollectionNameFromModels = CollectionNameFromModels> = ModelsRelationship[CN]; export type Relationships = Models, CN extends CollectionNameFromModels = CollectionNameFromModels> = { [R in string]: ModelRelationship; }; /** * A relationship between two collections */ export type Relationship = Models, Q extends SchemaQuery = SchemaQuery, Cardinality extends QueryResultCardinality = QueryResultCardinality> = { query: Q; cardinality: Cardinality; }; /** * Mapped type of all permissions in a schema */ type ModelsRolePermissions = Models> = { [CN in CollectionNameFromModels]: RolePermissions; }; /** * Union of specified permissions in a schema with CN */ type ModelRolePermissions = Models, CN extends CollectionNameFromModels = CollectionNameFromModels> = ModelsRolePermissions[CN]; /** * A collection of permissions by role */ export type RolePermissions = Models, CN extends CollectionNameFromModels = CollectionNameFromModels> = { [R in string]: CollectionPermissions; }; /** * Permissions for a collection by known operation */ export type CollectionPermissions = Models, CN extends CollectionNameFromModels = CollectionNameFromModels> = { read?: CollectionPermission; insert?: CollectionPermission; update?: CollectionPermission; postUpdate?: CollectionPermission; delete?: CollectionPermission; }; /** * A permissions definition */ export type CollectionPermission = Models, CN extends CollectionNameFromModels = CollectionNameFromModels> = { filter?: QueryWhere; }; /** * Union of operations for permissions */ export type PermissionOperations = keyof CollectionPermissions; /** * Union of write operations for permissions */ export type PermissionWriteOperations = Exclude; /** * Collection of roles for a database */ export type Roles = Record; /** * Requisite information related to a role */ export type Role = { match: PermissionMatcher; }; /** * An object that will be matched against a JWT payload to determine if a user has a role * A value prefixed with '$' indicates a wildcard that will be replaced with the value from the JWT payload */ export type PermissionMatcher = Record; export interface CollectionRules, CN extends CollectionNameFromModels> { read?: Record>; write?: Record>; } export interface Rule, CN extends CollectionNameFromModels> { filter: QueryWhere; description?: string; } export {};