TransactionalConnection

TransactionalConnection

TransactionalConnection

The TransactionalConnection is a wrapper around the TypeORM Connection object which works in conjunction with the Transaction decorator to implement per-request transactions. All services which access the database should use this class rather than the raw TypeORM connection, to ensure that db changes can be easily wrapped in transactions when required.

The service layer does not need to know about the scope of a transaction, as this is covered at the API by the use of the Transaction decorator.

Signature

class TransactionalConnection {
  constructor(connection: Connection)
  rawConnection: Connection
  getRepository(target: ObjectType<Entity> | EntitySchema<Entity> | string) => Repository<Entity>;
  getRepository(ctx: RequestContext | undefined, target: ObjectType<Entity> | EntitySchema<Entity> | string) => Repository<Entity>;
  getRepository(ctxOrTarget: RequestContext | ObjectType<Entity> | EntitySchema<Entity> | string | undefined, maybeTarget?: ObjectType<Entity> | EntitySchema<Entity> | string) => Repository<Entity>;
  async startTransaction(ctx: RequestContext) => ;
  async commitOpenTransaction(ctx: RequestContext) => ;
  async getEntityOrThrow(ctx: RequestContext, entityType: Type<T>, id: ID, options: FindEntityOptions = {}) => Promise<T>;
  findOneInChannel(ctx: RequestContext, entity: Type<T>, id: ID, channelId: ID, options: FindOneOptions = {}) => ;
  findByIdsInChannel(ctx: RequestContext, entity: Type<T>, ids: ID[], channelId: ID, options: FindOneOptions) => ;
}

Members

constructor

method
type:
(connection: Connection) => TransactionalConnection

rawConnection

property
type:
Connection
The plain TypeORM Connection object. Should be used carefully as any operations performed with this connection will not be performed within any outer transactions.

getRepository

method
type:
(target: ObjectType<Entity> | EntitySchema<Entity> | string) => Repository<Entity>
Returns a TypeORM repository. Note that when no RequestContext is supplied, the repository will not be aware of any existing transaction. Therefore calling this method without supplying a RequestContext is discouraged without a deliberate reason.

getRepository

method
type:
(ctx: RequestContext | undefined, target: ObjectType<Entity> | EntitySchema<Entity> | string) => Repository<Entity>
Returns a TypeORM repository which is bound to any existing transactions. It is recommended to always pass the RequestContext argument when possible, otherwise the queries will be executed outside of any ongoing transactions which have been started by the Transaction decorator.

getRepository

method
type:
(ctxOrTarget: RequestContext | ObjectType<Entity> | EntitySchema<Entity> | string | undefined, maybeTarget?: ObjectType<Entity> | EntitySchema<Entity> | string) => Repository<Entity>

startTransaction

async method
type:
(ctx: RequestContext) =>
Manually start a transaction if one is not already in progress. This method should be used in conjunction with the 'manual' mode of the Transaction decorator.

commitOpenTransaction

async method
type:
(ctx: RequestContext) =>
Manually commits any open transaction. Should be very rarely needed, since the Transaction decorator and the internal TransactionInterceptor take care of this automatically. Use-cases include situations in which the worker thread needs to access changes made in the current transaction, or when using the Transaction decorator in manual mode.

getEntityOrThrow

async method
type:
(ctx: RequestContext, entityType: Type<T>, id: ID, options: FindEntityOptions = {}) => Promise<T>
Finds an entity of the given type by ID, or throws an EntityNotFoundError if none is found.

findOneInChannel

method
type:
(ctx: RequestContext, entity: Type<T>, id: ID, channelId: ID, options: FindOneOptions = {}) =>
Like the TypeOrm Repository.findOne() method, but limits the results to the given Channel.

findByIdsInChannel

method
type:
(ctx: RequestContext, entity: Type<T>, ids: ID[], channelId: ID, options: FindOneOptions) =>
Like the TypeOrm Repository.findByIds() method, but limits the results to the given Channel.