@exogee/graphweaver-mikroorm 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/lib/base-resolver/assign.d.ts +7 -0
- package/lib/base-resolver/index.d.ts +1 -0
- package/lib/base-resolver/provider.d.ts +29 -0
- package/lib/base-resolver/rls/auth-utils.d.ts +17 -0
- package/lib/base-resolver/rls/authorization-context.d.ts +8 -0
- package/lib/base-resolver/rls/database-provider.d.ts +26 -0
- package/lib/base-resolver/rls/index.d.ts +2 -0
- package/lib/config.d.ts +5 -0
- package/lib/database.d.ts +33 -0
- package/lib/entities/audit-change.d.ts +13 -0
- package/lib/entities/audit-related-entity-change.d.ts +9 -0
- package/lib/entities/base-entity.d.ts +5 -0
- package/lib/entities/common.d.ts +1 -0
- package/lib/entities/hobby.d.ts +8 -0
- package/lib/entities/index.d.ts +3 -0
- package/lib/entities/migration.d.ts +5 -0
- package/lib/entities/session.d.ts +6 -0
- package/lib/entities/skill.d.ts +8 -0
- package/lib/entities/user.d.ts +10 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.js +1002 -0
- package/lib/index.js.map +7 -0
- package/lib/types/date-type.d.ts +7 -0
- package/lib/types/decimal-type.d.ts +10 -0
- package/lib/types/index.d.ts +2 -0
- package/lib/types/time-type.d.ts +14 -0
- package/lib/utils/authentication-context.d.ts +8 -0
- package/lib/utils/change-tracker.d.ts +4 -0
- package/lib/utils/errors.d.ts +6 -0
- package/lib/utils/generate-db-schema.d.ts +1 -0
- package/lib/utils/index.d.ts +4 -0
- package/lib/utils/tracked-entity.d.ts +8 -0
- package/lib/utils/untracked-property.d.ts +6 -0
- package/package.json +42 -0
package/lib/index.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/base-resolver/provider.ts", "../src/utils/errors.ts", "../src/base-resolver/assign.ts", "../src/database.ts", "../src/utils/change-tracker.ts", "../src/entities/audit-change.ts", "../src/entities/audit-related-entity-change.ts", "../src/entities/base-entity.ts", "../src/utils/authentication-context.ts", "../src/utils/tracked-entity.ts", "../src/utils/untracked-property.ts", "../src/types/date-type.ts", "../src/types/time-type.ts"],
|
|
4
|
+
"sourcesContent": ["import 'reflect-metadata';\n\nimport * as dotenv from 'dotenv';\ndotenv.config({\n\tpath: `.env.${(process.env.NODE_ENV || 'development').toLowerCase()}`,\n}); // TODO: The path to .env file in pnpm workspaces seems to use the workspace package.json path. Need to ensure it uses the local version (if required)\n\nexport * from './base-resolver';\nexport * from './entities';\nexport * from './database';\nexport * from './types';\nexport * from './utils/authentication-context';\n\n// Re-export from Mikro so things that depend on database entities can access helpers such as\n// Reference.isReference().\nexport type {\n\tAnyEntity,\n\tChangeSet,\n\tEntityData,\n\tEntityName,\n\tEventArgs,\n\tEventSubscriber,\n\tFilterQuery,\n\tFlushEventArgs,\n\tLoaded,\n\tQueryOrderMap,\n} from '@mikro-orm/core';\nexport type { LoadedReference } from '@mikro-orm/core';\nexport {\n\tChangeSetType,\n\tCollection,\n\tDatabaseObjectNotFoundException,\n\tEntityManager,\n\tEntityRepository,\n\tLockMode,\n\tPrimaryKeyType,\n\tQueryFlag,\n\tQueryOrder,\n\tReference,\n\tReferenceType,\n\tSubscriber,\n\tUniqueConstraintViolationException,\n\tUtils,\n\twrap,\n} from '@mikro-orm/core';\nexport { SqlEntityManager, SqlEntityRepository } from '@mikro-orm/postgresql';\n", "import { BackendProvider, PaginationOptions } from '@exogee/graphweaver';\nimport { logger } from '@exogee/logger';\n\nimport {\n\tAnyEntity,\n\tDatabase,\n\tFilterQuery,\n\tLockMode,\n\tQueryFlag,\n\tReferenceType,\n\tSqlEntityRepository,\n\tUtils,\n\twrap,\n} from '..';\nimport { OptimisticLockError } from '../utils/errors';\nimport { assign } from './assign';\n\nconst objectOperations = new Set(['_and', '_or', '_not']);\nconst mikroObjectOperations = new Set(['$and', '$or', '$not']);\nconst nonJoinKeys = new Set([\n\t'$and',\n\t'$gt',\n\t'$gte',\n\t'$in',\n\t'$lt',\n\t'$lte',\n\t'$ne',\n\t'$nin',\n\t'$not',\n\t'$or',\n\t'$like',\n\t'$ilike',\n\t'$null',\n\t'$notnull',\n\t'id', // @todo: remove this? Why is it here?\n]);\n\nconst appendPath = (path: string, newPath: string) =>\n\tpath.length ? `${path}.${newPath}` : newPath;\n\n// Check if we have any keys that are a collection of entities\nexport const visitPathForPopulate = (\n\tentityName: string,\n\tupdateArgBranch: any,\n\tpopulateBranch = ''\n) => {\n\tconst { properties } = Database.em.getMetadata().get(entityName);\n\tconst collectedPaths = populateBranch ? new Set<string>([populateBranch]) : new Set<string>([]);\n\n\tfor (const [key, value] of Object.entries(updateArgBranch ?? {})) {\n\t\tif (\n\t\t\t// If it's a relationship, go ahead and and '.' it in, recurse.\n\t\t\tproperties[key]?.reference === ReferenceType.ONE_TO_ONE ||\n\t\t\tproperties[key]?.reference === ReferenceType.ONE_TO_MANY ||\n\t\t\tproperties[key]?.reference === ReferenceType.MANY_TO_ONE ||\n\t\t\tproperties[key]?.reference === ReferenceType.MANY_TO_MANY\n\t\t) {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\t// In the case where the array is empty we also need to make sure we load the collection.\n\t\t\t\tcollectedPaths.add(appendPath(populateBranch, key));\n\n\t\t\t\tfor (const entry of value) {\n\t\t\t\t\t// Recurse\n\t\t\t\t\tconst newPaths = visitPathForPopulate(\n\t\t\t\t\t\tproperties[key].type,\n\t\t\t\t\t\tentry,\n\t\t\t\t\t\tappendPath(populateBranch, key)\n\t\t\t\t\t);\n\t\t\t\t\tnewPaths.forEach((path) => collectedPaths.add(path));\n\t\t\t\t}\n\t\t\t} else if (typeof value === 'object') {\n\t\t\t\t// Recurse\n\t\t\t\tconst newPaths = visitPathForPopulate(\n\t\t\t\t\tproperties[key].type,\n\t\t\t\t\tvalue,\n\t\t\t\t\tappendPath(populateBranch, key)\n\t\t\t\t);\n\t\t\t\tnewPaths.forEach((path) => collectedPaths.add(path));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collectedPaths;\n};\n\nexport const gqlToMikro: (filter: any) => any = (filter: any) => {\n\tif (Array.isArray(filter)) {\n\t\treturn filter.map((element) => gqlToMikro(element));\n\t} else if (typeof filter === 'object') {\n\t\tfor (const key of Object.keys(filter)) {\n\t\t\t// A null here is a user-specified value and is valid to filter on\n\t\t\tif (filter[key] === null) continue;\n\n\t\t\tif (objectOperations.has(key)) {\n\t\t\t\t// { _not: '1' } => { $not: '1' }\n\t\t\t\tfilter[key.replace('_', '$')] = gqlToMikro(filter[key]);\n\t\t\t\tdelete filter[key];\n\t\t\t} else if (typeof filter[key] === 'object' && !Array.isArray(filter[key])) {\n\t\t\t\t// Recurse over nested filters only (arrays are an argument to a filter, not a nested filter)\n\t\t\t\tfilter[key] = gqlToMikro(filter[key]);\n\t\t\t} else if (key.indexOf('_') >= 0) {\n\t\t\t\t// { firstName_in: ['k', 'b'] } => { firstName: { $in: ['k', 'b'] } }\n\t\t\t\tconst [newKey, operator] = key.split('_');\n\t\t\t\tconst newValue = { [`$${operator}`]: gqlToMikro(filter[key]) };\n\n\t\t\t\t// They can construct multiple filters for the same key. In that case we need\n\t\t\t\t// to append them all into an object.\n\t\t\t\tif (typeof filter[newKey] !== 'undefined') {\n\t\t\t\t\tfilter[newKey] = { ...filter[newKey], ...newValue };\n\t\t\t\t} else {\n\t\t\t\t\tfilter[newKey] = newValue;\n\t\t\t\t}\n\n\t\t\t\tdelete filter[key];\n\t\t\t}\n\t\t}\n\t}\n\treturn filter;\n};\n\nexport const mapAndAssignKeys = <T>(result: T, entityType: new () => T, inputArgs: Partial<T>) => {\n\t// Clean the input and remove any GraphQL classes from the object\n\tconst cleanInput = JSON.parse(JSON.stringify(inputArgs));\n\treturn assign(result, cleanInput);\n};\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport class MikroBackendProvider<T extends {}> implements BackendProvider<T> {\n\tpublic readonly backendId = 'mikro-orm';\n\n\tpublic entityType: new () => T;\n\n\tpublic readonly supportsInFilter = true;\n\n\tprivate getRepository: () => SqlEntityRepository<T> = () => {\n\t\tconst repository = Database.em.getRepository<T>(this.entityType);\n\t\tif (!repository) throw new Error('Could not find repository for ' + this.entityType.name);\n\n\t\treturn repository as SqlEntityRepository<T>;\n\t};\n\n\tpublic constructor(mikroType: new () => T) {\n\t\tthis.entityType = mikroType;\n\t}\n\n\tprivate applyWhereClause(where: any) {\n\t\tconst query = this.getRepository().createQueryBuilder();\n\t\tconst joinKeysUsed = new Map<string, number>();\n\n\t\tif (where) {\n\t\t\tconst visit = (current: any, table = 'e0') => {\n\t\t\t\tif (Array.isArray(current)) {\n\t\t\t\t\tfor (const element of current) {\n\t\t\t\t\t\tvisit(element, table);\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof current === 'object') {\n\t\t\t\t\tfor (const key of Object.keys(current)) {\n\t\t\t\t\t\tconst shouldJoin =\n\t\t\t\t\t\t\tcurrent[key] !== null &&\n\t\t\t\t\t\t\ttypeof current[key] === 'object' &&\n\t\t\t\t\t\t\tObject.keys(current[key]).filter((key) => !nonJoinKeys.has(key)).length > 0;\n\n\t\t\t\t\t\t// Only join if it's not $and, $or, $not, and if it's one of those object operations\n\t\t\t\t\t\t// pass the parent and current table on down without any change.\n\t\t\t\t\t\tif (mikroObjectOperations.has(key)) {\n\t\t\t\t\t\t\tvisit(current[key], table);\n\t\t\t\t\t\t} else if (shouldJoin) {\n\t\t\t\t\t\t\t// Otherwise ensure we've actually got a full on nested object,\n\t\t\t\t\t\t\t// not just a filter property.\n\t\t\t\t\t\t\tconst keyUseCount = joinKeysUsed.has(key) ? (joinKeysUsed.get(key) ?? 0) + 1 : 1;\n\t\t\t\t\t\t\tconst joinKey = joinKeysUsed.has(key) ? `${key}${keyUseCount}` : key;\n\t\t\t\t\t\t\tquery.leftJoin(`${table}.${key}`, joinKey);\n\t\t\t\t\t\t\t// Certain filters can result in the same table being joined\n\t\t\t\t\t\t\t// on different criteria - keep track and avoid using the same alias\n\t\t\t\t\t\t\tjoinKeysUsed.set(joinKey, keyUseCount);\n\t\t\t\t\t\t\tvisit(current[key], key);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Filter out empty objects\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcurrent[key] !== null &&\n\t\t\t\t\t\t\ttypeof current[key] === 'object' &&\n\t\t\t\t\t\t\tObject.keys(current[key]).length === 0\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tdelete current[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvisit(where);\n\n\t\t\tif (Object.keys(where).length > 0) {\n\t\t\t\tquery.andWhere(where);\n\t\t\t}\n\t\t}\n\n\t\treturn query;\n\t}\n\n\tpublic async find(\n\t\tfilter: any, // @todo: Create a type for this\n\t\tpagination?: PaginationOptions,\n\t\tadditionalOptionsForBackend?: any // @todo: Create a type for this\n\t): Promise<T[]> {\n\t\tlogger.trace(`Running find ${this.entityType.name} with filter`, {\n\t\t\tfilter: JSON.stringify(filter),\n\t\t});\n\n\t\t// Strip custom types out of the equation.\n\t\t// This query only works if we JSON.parse(JSON.stringify(filter)):\n\t\t//\n\t\t// query {\n\t\t// drivers (filter: { region: { name: \"North Shore\" }}) {\n\t\t// id\n\t\t// }\n\t\t// }\n\t\tconst where = filter ? gqlToMikro(JSON.parse(JSON.stringify(filter))) : undefined;\n\n\t\t// Regions need some fancy handling with Query Builder. Process the where further\n\t\t// and return a Query Builder instance.\n\t\tconst query = this.applyWhereClause(where);\n\n\t\t// If we have specified a limit, offset or order then update the query\n\t\tpagination?.limit && query.limit(pagination.limit);\n\t\tpagination?.offset && query.offset(pagination.offset);\n\t\tpagination?.orderBy && query.orderBy({ ...pagination.orderBy });\n\n\t\t// Certain query filters can result in duplicate records once all joins are resolved\n\t\t// These duplicates can be discarded as related entities are returned to the\n\t\t// API consumer via field resolvers\n\t\tquery.setFlag(QueryFlag.DISTINCT);\n\n\t\t// 1:1 relations that aren't on the owning side need to get populated so the references get set.\n\t\t// This method is protected, but we need to use it from here, hence the `as any`.\n\t\tconst driver = Database.em.getDriver();\n\t\tconst meta = Database.em.getMetadata().get(this.entityType.name);\n\t\tquery.populate((driver as any).autoJoinOneToOneOwner(meta, []));\n\n\t\tif (additionalOptionsForBackend?.populate) {\n\t\t\tquery.populate(additionalOptionsForBackend.populate);\n\t\t}\n\n\t\tconst result = await query.getResult();\n\t\tlogger.trace(`find ${this.entityType.name} result: ${result.length} rows`);\n\n\t\treturn result;\n\t}\n\n\tpublic async findOne(id: string): Promise<T | null> {\n\t\tlogger.trace(`Running findOne ${this.entityType.name} with ID ${id}`);\n\n\t\tconst result = await Database.em.findOne(this.entityType, id);\n\n\t\tlogger.trace(`findOne ${this.entityType.name} result`, { result });\n\n\t\treturn result;\n\t}\n\n\tpublic async findByRelatedId(\n\t\tentity: any,\n\t\trelatedField: string,\n\t\trelatedFieldIds: string[],\n\t\tfilter?: any\n\t): Promise<T[]> {\n\t\tconst queryFilter = {\n\t\t\t$and: [{ [relatedField]: { $in: relatedFieldIds } }, ...[filter ?? []]],\n\t\t};\n\n\t\tconst populate = [relatedField as `${string}.`];\n\t\tconst result = (await Database.em.find(entity, queryFilter, { populate })) as unknown[];\n\n\t\treturn result as T[];\n\t}\n\n\tpublic async updateOne(id: string, updateArgs: Partial<T & { version?: number }>): Promise<T> {\n\t\tlogger.trace(`Running update ${this.entityType.name} with args`, {\n\t\t\tid,\n\t\t\tupdateArgs: JSON.stringify(updateArgs),\n\t\t});\n\n\t\tconst entity = await Database.em.findOne(this.entityType, id, {\n\t\t\t// This is an optimisation so that assign() doesn't have to go fetch everything one at a time.\n\t\t\tpopulate: [...visitPathForPopulate(this.entityType.name, updateArgs)] as `${string}.`[],\n\t\t});\n\n\t\tif (entity === null) {\n\t\t\tthrow new Error(`Unable to locate ${this.entityType.name} with ID: '${id}' for updating.`);\n\t\t}\n\n\t\t// If a version has been sent, let's check it\n\t\tif (updateArgs?.version) {\n\t\t\ttry {\n\t\t\t\tawait Database.em.lock(entity, LockMode.OPTIMISTIC, updateArgs.version);\n\t\t\t\tdelete updateArgs.version;\n\t\t\t} catch (err) {\n\t\t\t\tthrow new OptimisticLockError((err as Error)?.message, { entity });\n\t\t\t}\n\t\t}\n\n\t\tawait mapAndAssignKeys(entity, this.entityType, updateArgs);\n\t\tawait this.getRepository().persistAndFlush(entity);\n\n\t\tlogger.trace(`update ${this.entityType.name} entity`, entity);\n\n\t\treturn entity;\n\t}\n\n\tpublic async updateMany(updateItems: (Partial<T> & { id: string })[]): Promise<T[]> {\n\t\tlogger.trace(`Running update many ${this.entityType.name} with args`, {\n\t\t\tupdateItems: JSON.stringify(updateItems),\n\t\t});\n\n\t\tconst entities = await Database.transactional<T[]>(async () => {\n\t\t\treturn Promise.all<T>(\n\t\t\t\tupdateItems.map(async (item) => {\n\t\t\t\t\tif (!item?.id) throw new Error('You must pass an ID for this entity to update it.');\n\n\t\t\t\t\t// Find the entity in the database\n\t\t\t\t\tconst entity = await Database.em.findOneOrFail(this.entityType, item.id, {\n\t\t\t\t\t\tpopulate: [...visitPathForPopulate(this.entityType.name, item)] as `${string}.`[],\n\t\t\t\t\t});\n\t\t\t\t\tawait mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\tDatabase.em.persist(entity);\n\t\t\t\t\treturn entity;\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\n\t\tlogger.trace(`updated ${this.entityType.name} items `, entities);\n\n\t\treturn entities;\n\t}\n\n\tpublic async createOrUpdateMany(items: Partial<T>[]): Promise<T[]> {\n\t\tlogger.trace(`Running create or update many for ${this.entityType.name} with args`, {\n\t\t\titems: JSON.stringify(items),\n\t\t});\n\n\t\tconst entities = await Database.transactional<T[]>(async () => {\n\t\t\treturn Promise.all<T>(\n\t\t\t\titems.map(async (item) => {\n\t\t\t\t\tlet entity;\n\t\t\t\t\tconst { id } = item as any;\n\t\t\t\t\tif (id) {\n\t\t\t\t\t\tentity = await Database.em.findOneOrFail(this.entityType, id, {\n\t\t\t\t\t\t\tpopulate: [...visitPathForPopulate(this.entityType.name, item)] as `${string}.`[],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tlogger.trace(`Running update on ${this.entityType.name} with item`, {\n\t\t\t\t\t\t\titem: JSON.stringify(item),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tawait mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tentity = new this.entityType();\n\t\t\t\t\t\tawait mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\t\tlogger.trace(`Running create on ${this.entityType.name} with item`, {\n\t\t\t\t\t\t\titem: JSON.stringify(item),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tDatabase.em.persist(entity);\n\t\t\t\t\treturn entity;\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\n\t\tlogger.trace(`created or updated ${this.entityType.name} items `, entities);\n\n\t\treturn entities;\n\t}\n\n\tpublic async createOne(createArgs: Partial<T>): Promise<T> {\n\t\tlogger.trace(`Running create ${this.entityType.name} with args`, {\n\t\t\tcreateArgs: JSON.stringify(createArgs),\n\t\t});\n\n\t\tconst entity = new this.entityType();\n\t\tawait mapAndAssignKeys(entity, this.entityType, createArgs);\n\t\tawait this.getRepository().persistAndFlush(entity);\n\n\t\tlogger.trace(`create ${this.entityType.name} result`, entity);\n\n\t\treturn entity;\n\t}\n\n\tpublic async createMany(createItems: Partial<T>[]): Promise<T[]> {\n\t\tlogger.trace(`Running create ${this.entityType.name} with args`, {\n\t\t\tcreateArgs: JSON.stringify(createItems),\n\t\t});\n\n\t\tconst entities = await Database.transactional<T[]>(async () => {\n\t\t\treturn Promise.all<T>(\n\t\t\t\tcreateItems.map(async (item) => {\n\t\t\t\t\tconst entity = new this.entityType();\n\t\t\t\t\tawait mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\tDatabase.em.persist(entity);\n\t\t\t\t\treturn entity;\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\n\t\tlogger.trace(`created ${this.entityType.name} items `, entities);\n\n\t\treturn entities;\n\t}\n\n\tpublic async deleteOne(id: string): Promise<boolean> {\n\t\tlogger.trace(`Running delete ${this.entityType.name} with id ${id}`);\n\t\tconst deletedRows = await this.getRepository().nativeDelete(({\n\t\t\tid,\n\t\t} as unknown) as FilterQuery<T>);\n\n\t\tif (deletedRows > 1) {\n\t\t\tthrow new Error('Multiple deleted rows');\n\t\t}\n\n\t\tlogger.trace(`delete ${this.entityType.name} result: deleted ${deletedRows} row(s)`);\n\n\t\treturn deletedRows === 1;\n\t}\n\n\tpublic async deleteMany(ids: string[]): Promise<boolean> {\n\t\tlogger.trace(`Running delete ${this.entityType.name} with ids ${ids}`);\n\n\t\tconst deletedRows = await Database.transactional<number>(async () => {\n\t\t\tconst deletedCount = await this.getRepository().nativeDelete({\n\t\t\t\tid: { $in: ids },\n\t\t\t} as FilterQuery<T>);\n\n\t\t\tif (deletedCount !== ids.length) {\n\t\t\t\tthrow new Error('We did not delete all the rows, rolling back');\n\t\t\t}\n\n\t\t\treturn deletedCount;\n\t\t});\n\n\t\tlogger.trace(`delete ${this.entityType.name} result: deleted ${deletedRows} row(s)`);\n\n\t\treturn deletedRows === ids.length;\n\t}\n\n\tpublic getRelatedEntityId(entity: any, relatedIdField: string) {\n\t\tif (typeof entity.unwrap !== 'function') {\n\t\t\tthrow new Error('Could not unwrap related entity');\n\t\t}\n\n\t\treturn entity.unwrap().id;\n\t}\n\n\tpublic isCollection(entity: any) {\n\t\treturn Utils.isCollection(entity);\n\t}\n}\n", "import { ApolloError } from 'apollo-server-core';\n\nexport class OptimisticLockError<T> extends ApolloError {\n\tconstructor(message: string, extensions: { entity: T }) {\n\t\tsuper(message, 'OPTIMISTIC_LOCK_ERROR', extensions);\n\t}\n}\n", "import {\n\tAnyEntity,\n\tCollection,\n\tEntityData,\n\tEntityProperty,\n\tReference,\n\tReferenceType,\n\twrap,\n} from '@mikro-orm/core';\nimport { logger } from '@exogee/logger';\n\nimport { Database } from '../database';\n\n// This is how Mikro ORM does it within their own code, so in this file we're ok with non-null assertions.\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\ninterface AssignOptions {\n\t// Whether this assign should be allowed to create new entities.\n\t// If false and a create is attempted, assign will throw.\n\t// Defaults to true if not specified.\n\tcreate?: boolean;\n\n\t// Whether this assign should be allowed update existing entities.\n\t// If false and an update is attempted, assign will throw.\n\t// Defaults to true if not specified.\n\tupdate?: boolean;\n}\n\nexport const assign = async <T extends AnyEntity<T>>(\n\tentity: T,\n\tdata: EntityData<T>,\n\toptions?: AssignOptions,\n\tvisited = new Set<AnyEntity<any>>()\n) => {\n\tif (visited.has(entity)) return entity;\n\tvisited.add(entity);\n\n\t// We'll need the metadata for this entity to be able to traverse the properties later.\n\tconst metadata = wrap(entity, true).__meta!;\n\n\tfor (const [property, value] of Object.entries(data)) {\n\t\tconst entityPropertyValue = (entity as any)[property];\n\n\t\t// We're going to need the metadata for this property so we can ensure it exists and so that we can\n\t\t// navigate to related entities.\n\t\tconst propertyMetadata = (metadata.properties as any)[property] as\n\t\t\t| EntityProperty<T>\n\t\t\t| undefined;\n\n\t\tif (\n\t\t\tpropertyMetadata?.reference === ReferenceType.MANY_TO_MANY ||\n\t\t\tpropertyMetadata?.reference === ReferenceType.ONE_TO_MANY\n\t\t) {\n\t\t\tif (!Array.isArray(value))\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Value is not an array while trying to assign to collection property ${property} on entity ${metadata.name}`\n\t\t\t\t);\n\n\t\t\t// Ensure the entity has a loaded collection at the same place.\n\t\t\tif (!(entityPropertyValue instanceof Collection)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Tried to merge array into non-collection property ${property} on entity ${metadata.name}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst visitedEntities = new Set<T>();\n\n\t\t\tfor (const subvalue of value) {\n\t\t\t\tlet entity: T | undefined;\n\n\t\t\t\tif (subvalue.id) {\n\t\t\t\t\t// Get the current entity from the ORM if there's an ID.\n\t\t\t\t\tentity = Database.em.getUnitOfWork().getById(propertyMetadata.type, subvalue.id);\n\n\t\t\t\t\tif (!entity) {\n\t\t\t\t\t\t// There are two cases here: either the user is trying to assign properties to the entity as well as changing members of a collection,\n\t\t\t\t\t\t// or they're just changing members of a collection.\n\t\t\t\t\t\t// For the former we actually need the entity from the DB, while for the latter we can let it slide and just pass an ID entity on down.\n\t\t\t\t\t\tif (Object.keys(subvalue).length === 1) {\n\t\t\t\t\t\t\t// It's just the ID.\n\t\t\t\t\t\t\tentity = Database.em.getReference(propertyMetadata.type, subvalue.id) as T;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\t\t`Doing a full database fetch for ${propertyMetadata.type} with id ${subvalue.id}, this should ideally be prefetched into the Unit of Work before calling assign() for performance`\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// We should be prefetching for performance in most cases here but if we don't have it we can load it now.\n\t\t\t\t\t\t\t// From base resolver a reason this would be needed is when you're switching collection values from one entity to another, e.g.\n\t\t\t\t\t\t\t// Business unit 1 -> Business unit 2. In this scenario we prefetch the one that's currently on the entity, but the one we're changing\n\t\t\t\t\t\t\t// to is not in the unit of work.\n\t\t\t\t\t\t\tentity =\n\t\t\t\t\t\t\t\t((await Database.em.findOne(propertyMetadata.type, {\n\t\t\t\t\t\t\t\t\tid: subvalue.id,\n\t\t\t\t\t\t\t\t})) as T | null) ?? undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!entity) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Attempted to assign as an update to '${propertyMetadata.name}' property of ${metadata.name} Entity, but even after a full fetch to the database ${propertyMetadata.type} with ID of ${subvalue.id} could not be found.`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst newEntity = await createOrAssignEntity<T>({\n\t\t\t\t\tentity,\n\t\t\t\t\tentityType: propertyMetadata.type,\n\t\t\t\t\tdata: subvalue,\n\t\t\t\t\toptions,\n\t\t\t\t\tvisited,\n\t\t\t\t});\n\n\t\t\t\t// Ok, now we've got the created or updated entity, ensure it's in the collection\n\t\t\t\t// so its foreign keys are set correctly. If it's already in the collection this is a noop.\n\t\t\t\tentityPropertyValue.add(newEntity);\n\n\t\t\t\t// We need to keep track of the fact that this entity belongs here so it doesn't get removed in the cleanup step down below.\n\t\t\t\tvisitedEntities.add(newEntity);\n\t\t\t}\n\n\t\t\t// Ok, at this point we know what IDs we visited. If anything is left in the collection that has an ID and has not been visited\n\t\t\t// it needs to be removed from the collection, because this is the canonical list of everything that's in the collection now.\n\t\t\t// ------------\n\t\t\t// \u2757\uD83D\uDC3B WARNING BEAR TRAP \uD83D\uDC3B\u2757: If you're looking at this going, \"But I just want to pass in the items I want to update and for it not to\n\t\t\t// mess with the rest of the collection\", this is here because without this behaviour, there's no way to remove items from\n\t\t\t// Many to many properties. Consider the case of tags on an entity, when we pass ['a', 'b', 'c'] as the list of tags, that\n\t\t\t// means we need to remove anything that isn't 'a', 'b', or 'c' because it's not in the array.\n\t\t\tentityPropertyValue.remove(\n\t\t\t\t...entityPropertyValue.getItems().filter((entity) => !visitedEntities.has(entity))\n\t\t\t);\n\t\t} else if (\n\t\t\tpropertyMetadata?.reference == ReferenceType.MANY_TO_ONE ||\n\t\t\tpropertyMetadata?.reference === ReferenceType.ONE_TO_ONE\n\t\t) {\n\t\t\tif (value === null) {\n\t\t\t\t// If the value is null, unset the reference\n\t\t\t\t(entity as any)[property] = null;\n\t\t\t} else {\n\t\t\t\tconst valueKeys = Object.keys(value as any);\n\t\t\t\tif (valueKeys.length === 1 && valueKeys[0] === 'id') {\n\t\t\t\t\t// Ok, this is just the ID, set the reference and move on.\n\t\t\t\t\t(entity as any)[property] = Database.em.getReference(\n\t\t\t\t\t\tpropertyMetadata.type,\n\t\t\t\t\t\t(value as any).id\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tif (entityPropertyValue && !Reference.isReference(entityPropertyValue)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Trying to merge to related property ${property} on entity ${metadata.name} which is not a reference.`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (entityPropertyValue && !entityPropertyValue.isInitialized()) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Trying to merge to related property ${property} on entity ${metadata.name} which is not initialised.`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst newEntity = await createOrAssignEntity<T>({\n\t\t\t\t\t\tentity: entityPropertyValue?.unwrap() as T,\n\t\t\t\t\t\tentityType: propertyMetadata.type,\n\t\t\t\t\t\tdata: value as EntityData<T>,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tvisited,\n\t\t\t\t\t});\n\n\t\t\t\t\t(entity as any)[property] = Reference.create(newEntity);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Ok, we're a simple scalar.\n\t\t\t(entity as any)[property] = value;\n\t\t}\n\t}\n\n\treturn entity;\n};\n\nconst createOrAssignEntity = <T extends AnyEntity<T>>({\n\tentity,\n\tentityType,\n\tdata,\n\toptions,\n\tvisited,\n}: {\n\tentity?: T;\n\tentityType: string;\n\tdata: EntityData<T>;\n\toptions?: AssignOptions;\n\tvisited: Set<AnyEntity<any>>;\n}) => {\n\tconst create = options?.create ?? true;\n\tconst update = options?.update ?? true;\n\n\tif ((data as any).id) {\n\t\tif (!update) {\n\t\t\tthrow new Error(\n\t\t\t\t`Updates are disabled, but update value ${JSON.stringify(\n\t\t\t\t\tdata\n\t\t\t\t)} was passed which has an ID property.`\n\t\t\t);\n\t\t}\n\n\t\tif (!entity) {\n\t\t\tthrow new Error(\n\t\t\t\t`Tried to update with data ${JSON.stringify(\n\t\t\t\t\tdata\n\t\t\t\t)} but entity could not be located to update.`\n\t\t\t);\n\t\t}\n\n\t\t// Ok, we need to recurse here.\n\t\treturn assign(entity, data, options, visited);\n\t} else {\n\t\tif (!create) {\n\t\t\tthrow new Error(\n\t\t\t\t`Creates are disabled, but update value ${JSON.stringify(\n\t\t\t\t\tdata\n\t\t\t\t)} was passed which does not have an ID property.`\n\t\t\t);\n\t\t}\n\n\t\t// We don't want Mikro to manage the data merging here, we'll do it in the next line.\n\t\tconst entity = Database.em.create<T>(entityType, {} as any);\n\t\treturn assign(entity, data, options, visited);\n\t}\n};\n", "import 'reflect-metadata';\nimport './utils/change-tracker';\n\nimport {\n\tAnyEntity,\n\tConnection,\n\tEntity,\n\tEntityName,\n\tIDatabaseDriver,\n\tMikroORM,\n\tOptions,\n\tReflectMetadataProvider,\n} from '@mikro-orm/core';\nimport { EntityManager, PostgreSqlDriver } from '@mikro-orm/postgresql';\nimport { logger } from '@exogee/logger';\n//import AWS from 'aws-sdk';\n\n@Entity()\nclass FakeEntity {}\n\nexport interface ConnectionOptions {\n\toverrides?: Options;\n\tsecretArn?: string;\n}\n\nexport enum IsolationLevel {\n\tSERIALIZABLE = 'SERIALIZABLE',\n\tREPEATABLE_READ = 'REPEATABLE READ',\n\tREAD_COMMITTED = 'READ COMMITTED',\n\tREAD_UNCOMMITTED = 'READ UNCOMMITTED',\n}\n\nconst NumericIsolationLevels = {\n\t[IsolationLevel.SERIALIZABLE]: 4,\n\t[IsolationLevel.REPEATABLE_READ]: 3,\n\t[IsolationLevel.READ_COMMITTED]: 2,\n\t[IsolationLevel.READ_UNCOMMITTED]: 1,\n};\n\nclass DatabaseImplementation {\n\tprivate cachedOrm?: MikroORM<IDatabaseDriver<Connection>>;\n\tprivate transactionalEm?: EntityManager;\n\tprivate transactionInProgressIsolationLevel?: IsolationLevel;\n\n\tpublic get orm() {\n\t\tif (!this.cachedOrm) {\n\t\t\tconst error = new Error('Tried to get the ORM before it was connected.');\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn this.cachedOrm;\n\t}\n\n\tpublic get em() {\n\t\treturn (this.transactionalEm || this.orm.em) as EntityManager<PostgreSqlDriver>;\n\t}\n\n\tpublic async transactional<T>(\n\t\tcallback: () => Promise<T>,\n\t\tisolationLevel: IsolationLevel = IsolationLevel.READ_COMMITTED\n\t) {\n\t\tlogger.trace('Database::transactional() enter');\n\n\t\tif (\n\t\t\tthis.transactionInProgressIsolationLevel &&\n\t\t\tNumericIsolationLevels[this.transactionInProgressIsolationLevel] <\n\t\t\t\tNumericIsolationLevels[isolationLevel]\n\t\t) {\n\t\t\tconst error = new Error(\n\t\t\t\t`Transaction in progress is ${this.transactionInProgressIsolationLevel} isolation level, but ${isolationLevel} was requested, which is more restrictive. Since we can't upgrade, this is an error.`\n\t\t\t);\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this.transactionalEm) {\n\t\t\t// Transaction is already in progress that is isolated enough. Run the callback without starting a new one.\n\t\t\tlogger.trace(\n\t\t\t\t'Transaction already in progress with sufficient isolation, proceeding without new transaction.'\n\t\t\t);\n\n\t\t\treturn callback();\n\t\t} else {\n\t\t\t// Ok, start a new one.\n\t\t\tlogger.trace('Starting transaction');\n\n\t\t\treturn this.em.transactional(async (em) => {\n\t\t\t\tthis.transactionalEm = em;\n\t\t\t\tthis.transactionInProgressIsolationLevel = isolationLevel;\n\t\t\t\tawait em.execute(`SET TRANSACTION ISOLATION LEVEL ${isolationLevel}`);\n\t\t\t\tlet result: T;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await callback();\n\t\t\t\t} finally {\n\t\t\t\t\tdelete this.transactionalEm;\n\t\t\t\t\tdelete this.transactionInProgressIsolationLevel;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic isolatedTest(test: () => any) {\n\t\treturn async () => {\n\t\t\ttry {\n\t\t\t\tawait this.transactional(async () => {\n\t\t\t\t\tawait test();\n\t\t\t\t\tthrow new Error('Rollback transaction for test');\n\t\t\t\t}, IsolationLevel.SERIALIZABLE);\n\t\t\t} catch (error) {\n\t\t\t\t// Only need to care if this isn't our rollback from above.\n\t\t\t\t// Otherwise just gobble it.\n\t\t\t\tif ((error as Error).message !== 'Rollback transaction for test') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic get rawConnection() {\n\t\treturn this.em.getDriver().getConnection();\n\t}\n\n\tprivate getConnectionInfo = async (connectionOptions?: ConnectionOptions): Promise<Options> => {\n\t\tlogger.trace('Database::getConnectionInfo() - Enter');\n\n\t\t// We have some defaults\n\t\tconst defaults: Options = {\n\t\t\thost: 'localhost',\n\t\t\tport: 5432,\n\t\t\tdbName: 'graphweaver',\n\t\t};\n\n\t\t// If we've been passed a secret then we need to get all this\n\t\t// info from Secrets Manager.\n\t\t/* let secret = {};\n\t\tconst secretArn = connectionOptions?.secretArn || process.env.DATABASE_SECRET_ARN;\n\n\t\tif (secretArn) {\n\t\t\tconst SecretsManager = new AWS.SecretsManager();\n\t\t\tlogger.trace('Fetching database connection info from Secrets Manager');\n\n\t\t\tconst result = await SecretsManager.getSecretValue({\n\t\t\t\tSecretId: secretArn,\n\t\t\t}).promise();\n\n\t\t\tlogger.trace('Got result from Secrets Manager');\n\n\t\t\tif (result.SecretString) {\n\t\t\t\tlogger.trace('Parsing result');\n\n\t\t\t\t// We only want certain properties from this secret.\n\t\t\t\tconst { host, port, username: user, password, dbname: dbName } = JSON.parse(\n\t\t\t\t\tresult.SecretString\n\t\t\t\t) as {\n\t\t\t\t\thost: string;\n\t\t\t\t\tport: number;\n\t\t\t\t\tusername: string;\n\t\t\t\t\tpassword: string;\n\t\t\t\t\tdbname: string;\n\t\t\t\t};\n\n\t\t\t\tsecret = { host, port, user, password, dbName };\n\t\t\t}\n\t\t} */\n\n\t\t// And finally we can override all of this with environment variables if needed.\n\t\tconst environmentOverrides: Options = {\n\t\t\thost: process.env.DATABASE_HOST,\n\t\t\tport: process.env.DATABASE_PORT ? parseInt(process.env.DATABASE_PORT) : undefined,\n\t\t\tuser: process.env.DATABASE_USERNAME,\n\t\t\tpassword: process.env.DATABASE_PASSWORD,\n\t\t\tdbName: process.env.DATABASE_NAME,\n\t\t};\n\n\t\t// Create a function we can use to filter out undefined values in the object.\n\t\tconst filterUndefined = (obj?: Options) => {\n\t\t\tif (!obj) return {};\n\n\t\t\tfor (const key of Object.keys(obj) as Array<keyof Options>) {\n\t\t\t\tif (obj[key] === undefined) delete obj[key];\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t};\n\n\t\t// Apply each in order so the correct value wins.\n\t\treturn {\n\t\t\t...defaults,\n\t\t\t//...filterUndefined(secret),\n\t\t\t...filterUndefined(environmentOverrides),\n\t\t\t...filterUndefined(connectionOptions?.overrides),\n\t\t};\n\t};\n\n\tpublic getRepository = <T extends AnyEntity<T>>(entityName: EntityName<T>) =>\n\t\tthis.em.getRepository(entityName);\n\n\tpublic connect = async (connectionOptions?: ConnectionOptions) => {\n\t\tlogger.trace('Database::connect() - Enter');\n\n\t\tif (this.cachedOrm) {\n\t\t\tlogger.trace('Returning cached ORM');\n\t\t\treturn this.cachedOrm;\n\t\t}\n\n\t\tlogger.trace('Creating new ORM');\n\t\tlogger.trace('Getting connection info');\n\t\tconst params = await this.getConnectionInfo(connectionOptions);\n\n\t\tlogger.trace('Initialising ORM');\n\n\t\tlogger.trace(`${params.entities?.length}x entities`);\n\n\t\tconst orm = await MikroORM.init({\n\t\t\tdriver: PostgreSqlDriver,\n\t\t\t...params,\n\n\t\t\timplicitTransactions: false,\n\t\t\tmetadataProvider: ReflectMetadataProvider,\n\t\t\tdiscovery: { disableDynamicFileAccess: true },\n\t\t\tallowGlobalContext: true,\n\n\t\t\t// Ensure we only ever create one connection to the database.\n\t\t\tpool: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 1,\n\t\t\t},\n\t\t});\n\n\t\tlogger.trace('Creating connection to %s on %s', params.dbName, params.host);\n\t\tawait orm.connect();\n\n\t\tlogger.trace('Caching connection');\n\t\tthis.cachedOrm = orm;\n\t\treturn orm;\n\t};\n\n\tpublic close = async () => {\n\t\tlogger.trace('Closing database connection');\n\n\t\tawait this.orm.close();\n\t\tdelete this.cachedOrm;\n\t};\n}\n\nexport const Database = new DatabaseImplementation();\n\nexport const checkDatabase = async () => {\n\tawait Database.connect();\n\tconst rows = await Database.rawConnection.execute('select 1 = 1 as \"ok\";');\n\treturn rows[0].ok;\n};\n\nexport const getDbSchema = async () => {\n\tawait Database.connect();\n\tconst result = (await Database.orm.getSchemaGenerator().generate())\n\t\t.replace(\"set names 'utf8';\\n\", '')\n\t\t.replace(\"set session_replication_role = 'replica';\\n\", '')\n\t\t.replace(\"set session_replication_role = 'origin';\\n\", '');\n\tawait Database.close();\n\treturn result;\n};\n\nexport const clearDatabaseContext = async (\n\treq?: any,\n\tres?: any,\n\tnext?: any,\n\tconnectionOptions?: ConnectionOptions\n) => {\n\tawait Database.connect(connectionOptions);\n\tDatabase.em.clear();\n\treturn next ? next() : undefined;\n};\n", "import {\n\tAnyEntity,\n\tChangeSet,\n\tChangeSetType,\n\tEventSubscriber,\n\tFlushEventArgs,\n\tReference,\n\tSubscriber,\n} from '@mikro-orm/core';\n\nimport { AuditChange, AuditRelatedEntityChange } from '../entities';\nimport { AuthenticationContext } from './authentication-context';\nimport { TrackedEntity } from './tracked-entity';\nimport { isUntrackedProperty } from './untracked-property';\n\n@Subscriber()\nexport class ChangeTracker implements EventSubscriber {\n\tasync afterFlush({ uow, em }: FlushEventArgs): Promise<void> {\n\t\tconst changesets = (uow\n\t\t\t.getChangeSets()\n\t\t\t.filter((cs) => cs.entity instanceof TrackedEntity) as unknown) as ChangeSet<\n\t\t\tTrackedEntity<any>\n\t\t>[];\n\t\tconst trx = em.getTransactionContext();\n\n\t\tfor (const cs of changesets) {\n\t\t\tlet change;\n\n\t\t\tconst data = dataForChangeSet(cs);\n\t\t\tif (data || cs.type === ChangeSetType.DELETE) {\n\t\t\t\tconst changeData = {\n\t\t\t\t\ttype: cs.type,\n\t\t\t\t\tentityId: cs.entity.id,\n\t\t\t\t\tentityType: cs.name,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tcreatedBy: AuthenticationContext.currentUser,\n\t\t\t\t\tdata,\n\t\t\t\t};\n\t\t\t\tchange = await em.getDriver().nativeInsert(AuditChange.name, changeData, trx);\n\t\t\t}\n\n\t\t\tconst entity = cs.entity;\n\t\t\tconst relatedEntities = entity.relatedTrackedEntities;\n\t\t\tif (relatedEntities) {\n\t\t\t\tfor (const re of relatedEntities) {\n\t\t\t\t\tconst relatedEntityData = {\n\t\t\t\t\t\tchange: change?.insertId,\n\t\t\t\t\t\trelatedEntityId: re.id,\n\t\t\t\t\t\trelatedEntityType: re.entityType,\n\t\t\t\t\t};\n\t\t\t\t\tawait em.getDriver().nativeInsert(AuditRelatedEntityChange.name, relatedEntityData, trx);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst dataForChangeSet = <T extends TrackedEntity<T>>(cs: ChangeSet<TrackedEntity<T>>) => {\n\tif (cs.payload && cs.type !== ChangeSetType.DELETE) {\n\t\tconst entries = Object.entries(cs.payload)\n\t\t\t.filter(([k]) => !isUntrackedProperty(cs.entity, k))\n\t\t\t.map(([k]) => processPayloadEntry(k, cs.type, cs.entity, cs.originalEntity));\n\t\tconst id = cs.type === ChangeSetType.CREATE ? { to: cs.entity.id } : undefined;\n\t\tif (entries.length || id) return { ...Object.fromEntries(entries), id };\n\t}\n\n\treturn undefined;\n};\n\nconst processPayloadEntry = (\n\tkey: string,\n\tchangeSetType: ChangeSetType,\n\tupdatedEntity: AnyEntity,\n\toriginalEntity?: AnyEntity\n) => {\n\tlet from = originalEntity ? originalEntity[key] : null;\n\tif (!from && changeSetType === ChangeSetType.CREATE) from = undefined;\n\tlet to = updatedEntity[key] ?? null;\n\n\tif (Reference.isReference(to)) {\n\t\tconst relatedToEntity = to as Reference<AnyEntity>;\n\t\tif (from) {\n\t\t\tconst id = Reference.isReference(from)\n\t\t\t\t? (from as Reference<AnyEntity>).getProperty('id')\n\t\t\t\t: from;\n\t\t\tfrom = {\n\t\t\t\treference: {\n\t\t\t\t\ttype: relatedToEntity.constructor.name,\n\t\t\t\t\tid,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tto = {\n\t\t\treference: {\n\t\t\t\ttype: relatedToEntity.constructor.name,\n\t\t\t\tid: relatedToEntity.unwrap().id,\n\t\t\t},\n\t\t};\n\t}\n\treturn [key, { from, to }];\n};\n", "import {\n\tBigIntType,\n\tChangeSetType,\n\tCollection,\n\tEntity,\n\tEnum,\n\tIndex,\n\tOneToMany,\n\tPrimaryKey,\n\tProperty,\n} from '@mikro-orm/core';\n\nimport { AuditRelatedEntityChange } from './audit-related-entity-change';\nimport { BaseEntity } from './base-entity';\n\n@Entity()\n@Index({ properties: ['entityType', 'entityId'] })\nexport class AuditChange extends BaseEntity {\n\t@PrimaryKey({ type: BigIntType })\n\tid!: string;\n\n\t@Enum({ items: () => ChangeSetType, type: 'string' })\n\ttype!: ChangeSetType;\n\n\t@Property({ type: 'string' })\n\tentityId!: string;\n\n\t@Property({ type: 'string' })\n\tentityType!: string;\n\n\t@Property({ type: 'string' })\n\tcreatedBy!: string;\n\n\t@Property({ type: 'date' })\n\tcreatedAt: Date = new Date();\n\n\t@Property({ type: 'json', nullable: true })\n\tdata?: Record<string, unknown>;\n\n\t@OneToMany(() => AuditRelatedEntityChange, 'change')\n\trelatedEntityChanges?: Collection<AuditRelatedEntityChange>;\n}\n", "import {\n\tBigIntType,\n\tEntity,\n\tIdentifiedReference,\n\tIndex,\n\tManyToOne,\n\tPrimaryKey,\n\tProperty,\n} from '@mikro-orm/core';\n\nimport { AuditChange } from './audit-change';\nimport { BaseEntity } from './base-entity';\n@Entity()\n@Index({ properties: ['relatedEntityType', 'relatedEntityId'] })\nexport class AuditRelatedEntityChange extends BaseEntity {\n\t@PrimaryKey({ type: BigIntType })\n\tid!: string;\n\n\t@ManyToOne(() => AuditChange, { onDelete: 'cascade', wrappedReference: true })\n\tchange!: IdentifiedReference<AuditChange>;\n\n\t@Property({ type: 'string' })\n\trelatedEntityType!: string;\n\n\t@Property({ type: 'string' })\n\trelatedEntityId!: string;\n}\n", "import { BaseDataEntity } from '@exogee/graphweaver';\nimport { Reference, Utils } from '@mikro-orm/core';\n\nexport class BaseEntity implements BaseDataEntity {\n\tpublic isReference(_: string, dataField: any) {\n\t\treturn Reference.isReference<any>(dataField);\n\t}\n\n\tpublic isCollection(fieldName: string, dataField: any) {\n\t\treturn Utils.isCollection<any>(dataField);\n\t}\n}\n", "import { logger } from '@exogee/logger';\n\nclass AuthenticationContextImplementation {\n\tprivate currentUserLogin?: string;\n\n\tpublic clear() {\n\t\tthis.currentUserLogin = undefined;\n\t}\n\n\tpublic set(user: string) {\n\t\tlogger.trace(`Setting AuthenticationContext.currentUser to ${user}`);\n\t\tthis.currentUserLogin = user;\n\t}\n\n\tpublic get currentUser() {\n\t\tif (!this.currentUserLogin)\n\t\t\tthrow new Error('Attempted to access AuthenticationContext before it has been set');\n\t\treturn this.currentUserLogin;\n\t}\n}\nexport const AuthenticationContext = new AuthenticationContextImplementation();\n", "import { BigIntType, PrimaryKey } from '@mikro-orm/core';\n\nimport { BaseEntity } from '../entities';\n\nexport abstract class TrackedEntity<T extends TrackedEntity<T>> extends BaseEntity {\n\t@PrimaryKey({ type: BigIntType })\n\tid!: string;\n\n\tget relatedTrackedEntities():\n\t\t| {\n\t\t\t\tid: string;\n\t\t\t\tentityType: string;\n\t\t }[]\n\t\t| undefined {\n\t\treturn undefined;\n\t}\n}\n", "import 'reflect-metadata';\n\nconst untrackedPropertyMetadataKey = Symbol('UntrackedProperty');\n\nexport function UntrackedProperty() {\n\treturn Reflect.metadata(untrackedPropertyMetadataKey, true);\n}\n\nexport function isUntrackedProperty(target: any, propertyKey: string) {\n\treturn Reflect.getMetadata(untrackedPropertyMetadataKey, target, propertyKey);\n}\n", "import { EntityProperty, Platform, Type, ValidationError } from '@mikro-orm/core';\n\nconst DatePattern = /^\\d{4}-\\d{1,2}-\\d{1,2}$/;\n\nexport class DateType extends Type {\n\tconvertToDatabaseValue(value: any, platform: Platform) {\n\t\tif (!value) return value;\n\n\t\tif (typeof value === 'string') {\n\t\t\tconst [date] = value.split('T');\n\t\t\tconst [year, month, day] = date.split('-');\n\t\t\treturn new Date(`${year}-${month}-${day}T00:00:00Z`);\n\t\t}\n\n\t\tthrow ValidationError.invalidType(DateType, value, 'JS');\n\t}\n\n\tconvertToJSValue(value: any, platform: Platform) {\n\t\tif (!value) return value;\n\n\t\tif (typeof value === 'string' && DatePattern.test(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\tthrow ValidationError.invalidType(DateType, value, 'database');\n\t}\n\n\tgetColumnType(prop: EntityProperty, platform: Platform) {\n\t\treturn 'date';\n\t}\n\n\ttoJSON(value: any, platform: Platform) {\n\t\tif (!value) return value;\n\t\tif (value instanceof Date) {\n\t\t\treturn `${value.getFullYear()}-${value.getMonth() + 1}-${value.getDate()}`;\n\t\t} else if (typeof value === 'string') {\n\t\t\treturn value;\n\t\t}\n\t\tthrow ValidationError.invalidType(DateType, value, 'JS');\n\t}\n}\n", "import { EntityProperty, Platform, Type, ValidationError } from '@mikro-orm/core';\n\nconst TimePattern = /^\\d{2}:\\d{2}:\\d{2}$/;\n\nexport class Time {\n\tconstructor(public readonly hour = 0, public readonly minute = 0, public readonly second = 0) {\n\t\tif (hour > 23 || hour < 0) throw new Error(`Invalid time '${hour}:${minute}:${second}`);\n\t\tif (minute > 59 || minute < 0) throw new Error(`Invalid time '${hour}:${minute}:${second}`);\n\t\tif (second > 59 || second < 0) throw new Error(`Invalid time '${hour}:${minute}:${second}`);\n\t}\n\n\tpublic toString() {\n\t\treturn `${this.hour.toString().padStart(2, '0')}:${this.minute\n\t\t\t.toString()\n\t\t\t.padStart(2, '0')}:${this.second.toString().padStart(2, '0')}`;\n\t}\n}\n\nexport class TimeType extends Type {\n\tconvertToDatabaseValue(value: any, platform: Platform) {\n\t\tif (!value) return value;\n\t\tif (value instanceof Time) return value;\n\n\t\tthrow ValidationError.invalidType(TimeType, value, 'JS');\n\t}\n\n\tconvertToJSValue(value: any, platform: Platform) {\n\t\tif (!value) return value;\n\n\t\tif (typeof value === 'string' && TimePattern.test(value)) {\n\t\t\tconst [hour, minute, second] = value.split(':');\n\t\t\treturn new Time(+hour, +minute, +second);\n\t\t}\n\n\t\tthrow ValidationError.invalidType(TimeType, value, 'database');\n\t}\n\n\tgetColumnType(prop: EntityProperty, platform: Platform) {\n\t\treturn 'time';\n\t}\n\n\ttoJSON(value: any, platform: Platform) {\n\t\tif (!value) return value;\n\t\tif (value instanceof Time) return Time.toString();\n\t\tthrow ValidationError.invalidType(TimeType, value, 'JS');\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_reflect_metadata", "import_logger", "import_core", "import_logger", "import_reflect_metadata", "import_core", "import_core", "import_core", "import_core", "import_core", "import_logger", "IsolationLevel", "entity", "key", "import_core", "import_core", "import_core", "import_postgresql"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { EntityProperty, Platform, Type } from '@mikro-orm/core';
|
|
2
|
+
export declare class DateType extends Type {
|
|
3
|
+
convertToDatabaseValue(value: any, platform: Platform): any;
|
|
4
|
+
convertToJSValue(value: any, platform: Platform): any;
|
|
5
|
+
getColumnType(prop: EntityProperty, platform: Platform): string;
|
|
6
|
+
toJSON(value: any, platform: Platform): any;
|
|
7
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EntityProperty, Platform, Type } from '@mikro-orm/core';
|
|
2
|
+
export declare class DecimalType extends Type {
|
|
3
|
+
private readonly precision;
|
|
4
|
+
private readonly scale;
|
|
5
|
+
constructor(precision?: number, scale?: number);
|
|
6
|
+
convertToDatabaseValue(value: any, platform: Platform): any;
|
|
7
|
+
convertToJSValue(value: any, platform: Platform): any;
|
|
8
|
+
getColumnType(prop: EntityProperty, platform: Platform): string;
|
|
9
|
+
toJSON(value: any, platform: Platform): any;
|
|
10
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EntityProperty, Platform, Type } from '@mikro-orm/core';
|
|
2
|
+
export declare class Time {
|
|
3
|
+
readonly hour: number;
|
|
4
|
+
readonly minute: number;
|
|
5
|
+
readonly second: number;
|
|
6
|
+
constructor(hour?: number, minute?: number, second?: number);
|
|
7
|
+
toString(): string;
|
|
8
|
+
}
|
|
9
|
+
export declare class TimeType extends Type {
|
|
10
|
+
convertToDatabaseValue(value: any, platform: Platform): any;
|
|
11
|
+
convertToJSValue(value: any, platform: Platform): any;
|
|
12
|
+
getColumnType(prop: EntityProperty, platform: Platform): string;
|
|
13
|
+
toJSON(value: any, platform: Platform): any;
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@exogee/graphweaver-mikroorm",
|
|
3
|
+
"version": "0.1.0-alpha.0",
|
|
4
|
+
"description": "MikroORM backend for @exogee/graphweaver",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"source": "src/index.ts",
|
|
8
|
+
"directories": {
|
|
9
|
+
"lib": "lib"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"lib"
|
|
13
|
+
],
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@exogee/graphweaver": "0.1.0-alpha.0",
|
|
16
|
+
"apollo-server-core": "3.10.3",
|
|
17
|
+
"@exogee/logger": "0.1.0",
|
|
18
|
+
"dataloader": "2.0.0",
|
|
19
|
+
"decimal.js": "10.3.1",
|
|
20
|
+
"dotenv": "16.0.0",
|
|
21
|
+
"lodash": "4.17.21",
|
|
22
|
+
"reflect-metadata": "0.1.13"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"ts-node": "10.4.0",
|
|
26
|
+
"typescript": "4.5.5",
|
|
27
|
+
"@mikro-orm/core": "5.4.2",
|
|
28
|
+
"@mikro-orm/postgresql": "5.4.2"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@mikro-orm/core": "5.4.2",
|
|
32
|
+
"@mikro-orm/postgresql": "5.4.2"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build:legacy": "tsc --build --verbose",
|
|
36
|
+
"build:types": "tsc --emitDeclarationOnly",
|
|
37
|
+
"prettier": "prettier --write src/**/*.ts",
|
|
38
|
+
"generate:schema": "ts-node ./src/utils/generate-db-schema.ts",
|
|
39
|
+
"test": "jest --forceExit"
|
|
40
|
+
},
|
|
41
|
+
"readme": "# `@exogee/graphweaver-mikroorm`\n\nMikroORM adapter package for Graphweaver\n"
|
|
42
|
+
}
|