@elsikora/nestjs-crud-automator 1.15.0 → 1.16.0-dev.1

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.
Files changed (90) hide show
  1. package/README.md +41 -16
  2. package/dist/cjs/interface/class/api/subscriber/function-error-execution-context.interface.d.ts +2 -0
  3. package/dist/cjs/interface/class/api/subscriber/function-execution-context-data.interface.d.ts +38 -0
  4. package/dist/cjs/interface/class/api/subscriber/function-execution-context.interface.d.ts +19 -0
  5. package/dist/cjs/interface/class/api/subscriber/index.d.ts +2 -0
  6. package/dist/cjs/interface/class/api/subscriber/route-error-execution-context.interface.d.ts +2 -0
  7. package/dist/cjs/interface/class/api/subscriber/route-execution-context-data.interface.d.ts +62 -0
  8. package/dist/cjs/interface/class/api/subscriber/route-execution-context.interface.d.ts +19 -0
  9. package/dist/cjs/type/class/api/index.d.ts +1 -0
  10. package/dist/cjs/type/class/api/subscriber/function/after/create-context.type.d.ts +4 -0
  11. package/dist/cjs/type/class/api/subscriber/function/after/delete-context.type.d.ts +4 -0
  12. package/dist/cjs/type/class/api/subscriber/function/after/get/context.type.d.ts +4 -0
  13. package/dist/cjs/type/class/api/subscriber/function/after/get/index.d.ts +3 -0
  14. package/dist/cjs/type/class/api/subscriber/function/after/get/list-context.type.d.ts +4 -0
  15. package/dist/cjs/type/class/api/subscriber/function/after/get/many-context.type.d.ts +4 -0
  16. package/dist/cjs/type/class/api/subscriber/function/after/index.d.ts +4 -0
  17. package/dist/cjs/type/class/api/subscriber/function/after/update-context.type.d.ts +4 -0
  18. package/dist/cjs/type/class/api/subscriber/function/before/create-context.type.d.ts +5 -0
  19. package/dist/cjs/type/class/api/subscriber/function/before/delete-context.type.d.ts +5 -0
  20. package/dist/cjs/type/class/api/subscriber/function/before/get/context.type.d.ts +5 -0
  21. package/dist/cjs/type/class/api/subscriber/function/before/get/index.d.ts +3 -0
  22. package/dist/cjs/type/class/api/subscriber/function/before/get/list-context.type.d.ts +5 -0
  23. package/dist/cjs/type/class/api/subscriber/function/before/get/many-context.type.d.ts +5 -0
  24. package/dist/cjs/type/class/api/subscriber/function/before/index.d.ts +4 -0
  25. package/dist/cjs/type/class/api/subscriber/function/before/update-context.type.d.ts +5 -0
  26. package/dist/cjs/type/class/api/subscriber/function/index.d.ts +2 -0
  27. package/dist/cjs/type/class/api/subscriber/index.d.ts +2 -0
  28. package/dist/cjs/type/class/api/subscriber/route/after/create-context.type.d.ts +4 -0
  29. package/dist/cjs/type/class/api/subscriber/route/after/delete-context.type.d.ts +4 -0
  30. package/dist/cjs/type/class/api/subscriber/route/after/get/context.type.d.ts +4 -0
  31. package/dist/cjs/type/class/api/subscriber/route/after/get/index.d.ts +3 -0
  32. package/dist/cjs/type/class/api/subscriber/route/after/get/list-context.type.d.ts +4 -0
  33. package/dist/cjs/type/class/api/subscriber/route/after/get/many-context.type.d.ts +4 -0
  34. package/dist/cjs/type/class/api/subscriber/route/after/index.d.ts +4 -0
  35. package/dist/cjs/type/class/api/subscriber/route/after/update-context.type.d.ts +4 -0
  36. package/dist/cjs/type/class/api/subscriber/route/before/create-context.type.d.ts +7 -0
  37. package/dist/cjs/type/class/api/subscriber/route/before/delete-context.type.d.ts +4 -0
  38. package/dist/cjs/type/class/api/subscriber/route/before/get/context.type.d.ts +4 -0
  39. package/dist/cjs/type/class/api/subscriber/route/before/get/index.d.ts +3 -0
  40. package/dist/cjs/type/class/api/subscriber/route/before/get/list-context.type.d.ts +4 -0
  41. package/dist/cjs/type/class/api/subscriber/route/before/get/many-context.type.d.ts +4 -0
  42. package/dist/cjs/type/class/api/subscriber/route/before/index.d.ts +4 -0
  43. package/dist/cjs/type/class/api/subscriber/route/before/update-context.type.d.ts +7 -0
  44. package/dist/cjs/type/class/api/subscriber/route/index.d.ts +2 -0
  45. package/dist/cjs/type/class/index.d.ts +1 -0
  46. package/dist/esm/interface/class/api/subscriber/function-error-execution-context.interface.d.ts +2 -0
  47. package/dist/esm/interface/class/api/subscriber/function-execution-context-data.interface.d.ts +38 -0
  48. package/dist/esm/interface/class/api/subscriber/function-execution-context.interface.d.ts +19 -0
  49. package/dist/esm/interface/class/api/subscriber/index.d.ts +2 -0
  50. package/dist/esm/interface/class/api/subscriber/route-error-execution-context.interface.d.ts +2 -0
  51. package/dist/esm/interface/class/api/subscriber/route-execution-context-data.interface.d.ts +62 -0
  52. package/dist/esm/interface/class/api/subscriber/route-execution-context.interface.d.ts +19 -0
  53. package/dist/esm/type/class/api/index.d.ts +1 -0
  54. package/dist/esm/type/class/api/subscriber/function/after/create-context.type.d.ts +4 -0
  55. package/dist/esm/type/class/api/subscriber/function/after/delete-context.type.d.ts +4 -0
  56. package/dist/esm/type/class/api/subscriber/function/after/get/context.type.d.ts +4 -0
  57. package/dist/esm/type/class/api/subscriber/function/after/get/index.d.ts +3 -0
  58. package/dist/esm/type/class/api/subscriber/function/after/get/list-context.type.d.ts +4 -0
  59. package/dist/esm/type/class/api/subscriber/function/after/get/many-context.type.d.ts +4 -0
  60. package/dist/esm/type/class/api/subscriber/function/after/index.d.ts +4 -0
  61. package/dist/esm/type/class/api/subscriber/function/after/update-context.type.d.ts +4 -0
  62. package/dist/esm/type/class/api/subscriber/function/before/create-context.type.d.ts +5 -0
  63. package/dist/esm/type/class/api/subscriber/function/before/delete-context.type.d.ts +5 -0
  64. package/dist/esm/type/class/api/subscriber/function/before/get/context.type.d.ts +5 -0
  65. package/dist/esm/type/class/api/subscriber/function/before/get/index.d.ts +3 -0
  66. package/dist/esm/type/class/api/subscriber/function/before/get/list-context.type.d.ts +5 -0
  67. package/dist/esm/type/class/api/subscriber/function/before/get/many-context.type.d.ts +5 -0
  68. package/dist/esm/type/class/api/subscriber/function/before/index.d.ts +4 -0
  69. package/dist/esm/type/class/api/subscriber/function/before/update-context.type.d.ts +5 -0
  70. package/dist/esm/type/class/api/subscriber/function/index.d.ts +2 -0
  71. package/dist/esm/type/class/api/subscriber/index.d.ts +2 -0
  72. package/dist/esm/type/class/api/subscriber/route/after/create-context.type.d.ts +4 -0
  73. package/dist/esm/type/class/api/subscriber/route/after/delete-context.type.d.ts +4 -0
  74. package/dist/esm/type/class/api/subscriber/route/after/get/context.type.d.ts +4 -0
  75. package/dist/esm/type/class/api/subscriber/route/after/get/index.d.ts +3 -0
  76. package/dist/esm/type/class/api/subscriber/route/after/get/list-context.type.d.ts +4 -0
  77. package/dist/esm/type/class/api/subscriber/route/after/get/many-context.type.d.ts +4 -0
  78. package/dist/esm/type/class/api/subscriber/route/after/index.d.ts +4 -0
  79. package/dist/esm/type/class/api/subscriber/route/after/update-context.type.d.ts +4 -0
  80. package/dist/esm/type/class/api/subscriber/route/before/create-context.type.d.ts +7 -0
  81. package/dist/esm/type/class/api/subscriber/route/before/delete-context.type.d.ts +4 -0
  82. package/dist/esm/type/class/api/subscriber/route/before/get/context.type.d.ts +4 -0
  83. package/dist/esm/type/class/api/subscriber/route/before/get/index.d.ts +3 -0
  84. package/dist/esm/type/class/api/subscriber/route/before/get/list-context.type.d.ts +4 -0
  85. package/dist/esm/type/class/api/subscriber/route/before/get/many-context.type.d.ts +4 -0
  86. package/dist/esm/type/class/api/subscriber/route/before/index.d.ts +4 -0
  87. package/dist/esm/type/class/api/subscriber/route/before/update-context.type.d.ts +7 -0
  88. package/dist/esm/type/class/api/subscriber/route/index.d.ts +2 -0
  89. package/dist/esm/type/class/index.d.ts +1 -0
  90. package/package.json +1 -1
package/README.md CHANGED
@@ -470,23 +470,24 @@ In case of an error at any stage, execution is interrupted, and the correspondin
470
470
 
471
471
  ```typescript
472
472
  import { Injectable } from "@nestjs/common";
473
- import { ApiRouteSubscriber, ApiRouteSubscriberBase, IApiSubscriberRouteExecutionContext } from "@elsikora/nestjs-crud-automator";
473
+ import { ApiRouteSubscriber, ApiRouteSubscriberBase, TApiSubscriberRouteAfterCreateContext } from "@elsikora/nestjs-crud-automator";
474
474
  import { Post } from "./post.entity";
475
- import { User } from "../user/user.entity"; // Assuming User is in request.user
476
475
 
477
476
  @Injectable()
478
- @ApiRouteSubscriber({ entity: Post, priority: 10 }) // Specify entity and priority
477
+ @ApiRouteSubscriber({ entity: Post, priority: 10 })
479
478
  export class PostAuditSubscriber extends ApiRouteSubscriberBase<Post> {
480
479
  // Hook is called AFTER a post is successfully created in the controller
481
- async onAfterCreate(context: IApiSubscriberRouteExecutionContext<Post, Post, { user: User }>): Promise<Post> {
482
- const createdPost = context.result; // Result of the controller's operation
483
- const currentUser = context.data.user; // Immutable input data, including request.user
480
+ async onAfterCreate(context: TApiSubscriberRouteAfterCreateContext<Post>): Promise<Post> {
481
+ const createdPost = context.result;
482
+
483
+ // Fully typed access to authentication and request data
484
+ const currentUser = context.DATA.authenticationRequest?.user;
485
+ const clientIp = context.DATA.ip;
484
486
 
485
487
  if (createdPost && currentUser) {
486
- console.log(`AUDIT: User ${currentUser.id} created Post ${createdPost.id} with title "${createdPost.title}"`);
488
+ console.log(`AUDIT: User ${currentUser.id} created Post ${createdPost.id} ` + `with title "${createdPost.title}" from IP ${clientIp}`);
487
489
  }
488
490
 
489
- // We don't want to change the result, so we just return it
490
491
  return createdPost;
491
492
  }
492
493
  }
@@ -502,25 +503,30 @@ In case of an error at any stage, execution is interrupted, and the correspondin
502
503
 
503
504
  ```typescript
504
505
  import { Injectable } from "@nestjs/common";
505
- import { ApiFunctionSubscriber, ApiFunctionSubscriberBase, IApiSubscriberFunctionExecutionContext, TApiFunctionCreateProperties } from "@elsikora/nestjs-crud-automator";
506
+ import { ApiFunctionSubscriber, ApiFunctionSubscriberBase, TApiSubscriberFunctionBeforeCreateContext, TApiFunctionCreateProperties } from "@elsikora/nestjs-crud-automator";
506
507
  import { Post } from "./post.entity";
507
- import slugify from "slugify"; // third-party library
508
+ import slugify from "slugify";
508
509
 
509
510
  @Injectable()
510
511
  @ApiFunctionSubscriber({ entity: Post })
511
512
  export class PostSlugSubscriber extends ApiFunctionSubscriberBase<Post> {
512
513
  // Hook is called BEFORE repository.save() is called
513
- async onBeforeCreate(context: IApiSubscriberFunctionExecutionContext<Post, TApiFunctionCreateProperties<Post>>): Promise<TApiFunctionCreateProperties<Post>> {
514
- const postData = context.result; // This is the object that will go into repository.save()
514
+ async onBeforeCreate(context: TApiSubscriberFunctionBeforeCreateContext<Post>): Promise<TApiFunctionCreateProperties<Post>> {
515
+ // Fully typed access to transaction manager and repository
516
+ const manager = context.DATA.eventManager;
517
+ const repository = context.DATA.repository;
515
518
 
516
- if (postData.body.title) {
519
+ if (context.result.title) {
517
520
  // Modify the object, adding the slug
518
- postData.body.slug = slugify(postData.body.title, { lower: true, strict: true });
519
- console.log(`ENRICHMENT: Generated slug: ${postData.body.slug}`);
521
+ context.result.slug = slugify(context.result.title, {
522
+ lower: true,
523
+ strict: true,
524
+ });
525
+ console.log(`ENRICHMENT: Generated slug: ${context.result.slug}`);
520
526
  }
521
527
 
522
528
  // Return the modified object, which will be saved
523
- return postData;
529
+ return context.result;
524
530
  }
525
531
  }
526
532
  ```
@@ -536,6 +542,25 @@ In case of an error at any stage, execution is interrupted, and the correspondin
536
542
  // ...
537
543
  ```
538
544
 
545
+ #### Helper Types for Simplified Usage
546
+
547
+ The library provides helper types that require only the Entity generic parameter, making subscriber implementation cleaner:
548
+
549
+ ```typescript
550
+ // Instead of this:
551
+ IApiSubscriberFunctionExecutionContext<User, TApiFunctionCreateProperties<User>, IApiSubscriberFunctionExecutionContextData<User>>;
552
+
553
+ // Use this:
554
+ TApiSubscriberFunctionBeforeCreateContext<User>;
555
+ ```
556
+
557
+ **Available helper types:**
558
+
559
+ - Function subscribers: `TApiSubscriberFunctionBeforeCreateContext`, `TApiSubscriberFunctionAfterCreateContext`, etc.
560
+ - Route subscribers: `TApiSubscriberRouteBeforeCreateContext`, `TApiSubscriberRouteAfterCreateContext`, etc.
561
+
562
+ These helpers provide full type safety and autocomplete for `context.DATA`, `context.ENTITY`, and `context.result`.
563
+
539
564
  ### Swagger Documentation
540
565
 
541
566
  The library automatically generates Swagger/OpenAPI documentation for all endpoints. To enable it in your NestJS application:
@@ -4,6 +4,8 @@ import type { IApiSubscriberErrorExecutionContext } from './error-execution-cont
4
4
  /**
5
5
  * Error execution context for function subscriber callbacks.
6
6
  * Contains function type information but no result field.
7
+ * @template E - Entity type extending IApiBaseEntity
8
+ * @template Input - Type of the DATA field (immutable context data). Use IApiSubscriberFunctionExecutionContextData<E> for typed access.
7
9
  */
8
10
  export interface IApiSubscriberFunctionErrorExecutionContext<E extends IApiBaseEntity, Input = unknown> extends IApiSubscriberErrorExecutionContext<E, Input> {
9
11
  readonly FUNCTION_TYPE: EApiFunctionType;
@@ -0,0 +1,38 @@
1
+ import type { IApiBaseEntity } from '../../../api-base-entity.interface';
2
+ import type { EntityManager, Repository } from "typeorm";
3
+ /**
4
+ * Data container for function subscriber execution context.
5
+ * Contains transaction manager and repository references.
6
+ * This interface provides typed access to the DATA field in function execution contexts.
7
+ * @example
8
+ * ```typescript
9
+ * async onBeforeCreate(
10
+ * context: IApiSubscriberFunctionExecutionContext<
11
+ * User,
12
+ * TApiFunctionCreateProperties<User>,
13
+ * IApiSubscriberFunctionExecutionContextData<User>
14
+ * >
15
+ * ): Promise<TApiFunctionCreateProperties<User>> {
16
+ * const manager = context.DATA.eventManager;
17
+ * const repository = context.DATA.repository;
18
+ *
19
+ * if (manager) {
20
+ * await manager.save(RelatedEntity, { ... });
21
+ * }
22
+ *
23
+ * return context.result;
24
+ * }
25
+ * ```
26
+ */
27
+ export interface IApiSubscriberFunctionExecutionContextData<E extends IApiBaseEntity> {
28
+ /**
29
+ * Entity manager for transactional operations.
30
+ * Available when service methods are called with a transaction manager.
31
+ */
32
+ eventManager?: EntityManager;
33
+ /**
34
+ * TypeORM repository instance for the entity.
35
+ * Provides access to database operations for the entity type.
36
+ */
37
+ repository: Repository<E>;
38
+ }
@@ -4,6 +4,25 @@ import type { IApiSubscriberExecutionContext } from './execution-context.interfa
4
4
  /**
5
5
  * Execution context for function subscriber callbacks.
6
6
  * Extends base execution context with function type information.
7
+ * @template E - Entity type extending IApiBaseEntity
8
+ * @template Result - Type of the result field (mutable data payload)
9
+ * @template Input - Type of the DATA field (immutable context data). Use IApiSubscriberFunctionExecutionContextData<E> for typed access.
10
+ * @example
11
+ * ```typescript
12
+ * import type { IApiSubscriberFunctionExecutionContextData } from '@elsikora/nestjs-crud-automator';
13
+ *
14
+ * async onBeforeCreate(
15
+ * context: IApiSubscriberFunctionExecutionContext<
16
+ * User,
17
+ * TApiFunctionCreateProperties<User>,
18
+ * IApiSubscriberFunctionExecutionContextData<User>
19
+ * >
20
+ * ): Promise<TApiFunctionCreateProperties<User>> {
21
+ * const manager = context.DATA.eventManager;
22
+ * const repository = context.DATA.repository;
23
+ * // ...
24
+ * }
25
+ * ```
7
26
  */
8
27
  export interface IApiSubscriberFunctionExecutionContext<E extends IApiBaseEntity, Result = unknown, Input = unknown> extends IApiSubscriberExecutionContext<E, Result, Input> {
9
28
  readonly FUNCTION_TYPE: EApiFunctionType;
@@ -1,9 +1,11 @@
1
1
  export type * from './error-execution-context.interface';
2
2
  export type * from './execution-context.interface';
3
3
  export type * from './function-error-execution-context.interface';
4
+ export type * from './function-execution-context-data.interface';
4
5
  export type * from './function-execution-context.interface';
5
6
  export type * from './function.interface';
6
7
  export type * from './interface';
7
8
  export type * from './route-error-execution-context.interface';
9
+ export type * from './route-execution-context-data.interface';
8
10
  export type * from './route-execution-context.interface';
9
11
  export type * from './route.interface';
@@ -4,6 +4,8 @@ import type { IApiSubscriberErrorExecutionContext } from './error-execution-cont
4
4
  /**
5
5
  * Error execution context for route subscriber callbacks.
6
6
  * Contains route type information but no result field.
7
+ * @template E - Entity type extending IApiBaseEntity
8
+ * @template Input - Type of the DATA field (immutable context data). Use IApiSubscriberRouteExecutionContextData<E> or IApiSubscriberRouteExecutionContextDataExtended<E> for typed access.
7
9
  */
8
10
  export interface IApiSubscriberRouteErrorExecutionContext<E extends IApiBaseEntity, Input = unknown> extends IApiSubscriberErrorExecutionContext<E, Input> {
9
11
  readonly ROUTE_TYPE: EApiRouteType;
@@ -0,0 +1,62 @@
1
+ import type { EApiRouteType } from '../../../../enum/decorator/api/route-type.enum';
2
+ import type { IApiAuthenticationRequest } from '../../../api-authentication-request.interface';
3
+ import type { IApiBaseEntity } from '../../../api-base-entity.interface';
4
+ import type { IApiControllerProperties } from '../../../decorator/api/controller/properties.interface';
5
+ import type { IApiEntity } from '../../../entity/index';
6
+ /**
7
+ * Base data container for route subscriber execution context.
8
+ * Contains route metadata and configuration.
9
+ * This interface provides typed access to the DATA field in route execution contexts.
10
+ * @example
11
+ * ```typescript
12
+ * async onBeforeCreate(
13
+ * context: IApiSubscriberRouteExecutionContext<
14
+ * User,
15
+ * { body: DeepPartial<User> },
16
+ * IApiSubscriberRouteExecutionContextData<User>
17
+ * >
18
+ * ): Promise<{ body: DeepPartial<User> }> {
19
+ * const entityMetadata = context.DATA.entityMetadata;
20
+ * const method = context.DATA.method;
21
+ * const methodName = context.DATA.methodName;
22
+ *
23
+ * return context.result;
24
+ * }
25
+ * ```
26
+ */
27
+ export interface IApiSubscriberRouteExecutionContextData<E extends IApiBaseEntity> {
28
+ /**
29
+ * Entity metadata containing information about entity columns, relations, and configuration.
30
+ */
31
+ entityMetadata: IApiEntity<E>;
32
+ /**
33
+ * Route method type (create, update, delete, get, etc.).
34
+ */
35
+ method: EApiRouteType;
36
+ /**
37
+ * Controller method name as defined in the controller.
38
+ */
39
+ methodName: string;
40
+ /**
41
+ * Controller properties and configuration for the current route.
42
+ */
43
+ properties: IApiControllerProperties<E>;
44
+ }
45
+ /**
46
+ * Extended data container for route subscriber execution context.
47
+ * Includes request context (headers, IP, authentication) in addition to base route data.
48
+ */
49
+ export interface IApiSubscriberRouteExecutionContextDataExtended<E extends IApiBaseEntity> extends IApiSubscriberRouteExecutionContextData<E> {
50
+ /**
51
+ * Authentication request information
52
+ */
53
+ authenticationRequest?: IApiAuthenticationRequest;
54
+ /**
55
+ * HTTP request headers
56
+ */
57
+ headers: Record<string, string>;
58
+ /**
59
+ * Client IP address
60
+ */
61
+ ip: string;
62
+ }
@@ -4,6 +4,25 @@ import type { IApiSubscriberExecutionContext } from './execution-context.interfa
4
4
  /**
5
5
  * Execution context for route subscriber callbacks.
6
6
  * Extends base execution context with route type information.
7
+ * @template E - Entity type extending IApiBaseEntity
8
+ * @template Result - Type of the result field (mutable data payload)
9
+ * @template Input - Type of the DATA field (immutable context data). Use IApiSubscriberRouteExecutionContextData<E> or IApiSubscriberRouteExecutionContextDataExtended<E> for typed access.
10
+ * @example
11
+ * ```typescript
12
+ * import type { IApiSubscriberRouteExecutionContextData } from '@elsikora/nestjs-crud-automator';
13
+ *
14
+ * async onBeforeCreate(
15
+ * context: IApiSubscriberRouteExecutionContext<
16
+ * User,
17
+ * { body: DeepPartial<User> },
18
+ * IApiSubscriberRouteExecutionContextData<User>
19
+ * >
20
+ * ): Promise<{ body: DeepPartial<User> }> {
21
+ * const entityMetadata = context.DATA.entityMetadata;
22
+ * const method = context.DATA.method;
23
+ * // ...
24
+ * }
25
+ * ```
7
26
  */
8
27
  export interface IApiSubscriberRouteExecutionContext<E extends IApiBaseEntity, Result = unknown, Input = unknown> extends IApiSubscriberExecutionContext<E, Result, Input> {
9
28
  readonly ROUTE_TYPE: EApiRouteType;
@@ -0,0 +1 @@
1
+ export type * from './subscriber/index';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterCreateContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, E, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterDeleteContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, E, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterGetContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, E, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,3 @@
1
+ export { type TApiSubscriberFunctionAfterGetContext } from './context.type';
2
+ export { type TApiSubscriberFunctionAfterGetListContext } from './list-context.type';
3
+ export { type TApiSubscriberFunctionAfterGetManyContext } from './many-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterGetListContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, Array<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterGetManyContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, Array<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ export { type TApiSubscriberFunctionAfterCreateContext } from './create-context.type';
2
+ export { type TApiSubscriberFunctionAfterDeleteContext } from './delete-context.type';
3
+ export type * from './get/index';
4
+ export { type TApiSubscriberFunctionAfterUpdateContext } from './update-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterUpdateContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, E, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionCreateProperties } from '../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeCreateContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionCreateProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionDeleteCriteria } from '../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeDeleteContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionDeleteCriteria<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionGetProperties } from '../../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeGetContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionGetProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,3 @@
1
+ export { type TApiSubscriberFunctionBeforeGetContext } from './context.type';
2
+ export { type TApiSubscriberFunctionBeforeGetListContext } from './list-context.type';
3
+ export { type TApiSubscriberFunctionBeforeGetManyContext } from './many-context.type';
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionGetListProperties } from '../../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeGetListContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionGetListProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionGetManyProperties } from '../../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeGetManyContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionGetManyProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ export { type TApiSubscriberFunctionBeforeCreateContext } from './create-context.type';
2
+ export { type TApiSubscriberFunctionBeforeDeleteContext } from './delete-context.type';
3
+ export type * from './get/index';
4
+ export { type TApiSubscriberFunctionBeforeUpdateContext } from './update-context.type';
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionUpdateProperties } from '../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeUpdateContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionUpdateProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,2 @@
1
+ export type * from './after/index';
2
+ export type * from './before/index';
@@ -0,0 +1,2 @@
1
+ export type * from './function/index';
2
+ export type * from './route/index';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterCreateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterDeleteContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterGetContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,3 @@
1
+ export { type TApiSubscriberRouteAfterGetContext } from './context.type';
2
+ export { type TApiSubscriberRouteAfterGetListContext } from './list-context.type';
3
+ export { type TApiSubscriberRouteAfterGetManyContext } from './many-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterGetListContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, Array<E>, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterGetManyContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, Array<E>, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,4 @@
1
+ export { type TApiSubscriberRouteAfterCreateContext } from './create-context.type';
2
+ export { type TApiSubscriberRouteAfterDeleteContext } from './delete-context.type';
3
+ export type * from './get/index';
4
+ export { type TApiSubscriberRouteAfterUpdateContext } from './update-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterUpdateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,7 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ import type { DeepPartial } from "typeorm";
5
+ export type TApiSubscriberRouteBeforeCreateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, {
6
+ body: DeepPartial<E>;
7
+ }, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteBeforeDeleteContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteBeforeGetContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,3 @@
1
+ export { type TApiSubscriberRouteBeforeGetContext } from './context.type';
2
+ export { type TApiSubscriberRouteBeforeGetListContext } from './list-context.type';
3
+ export { type TApiSubscriberRouteBeforeGetManyContext } from './many-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteBeforeGetListContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteBeforeGetManyContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ export { type TApiSubscriberRouteBeforeCreateContext } from './create-context.type';
2
+ export { type TApiSubscriberRouteBeforeDeleteContext } from './delete-context.type';
3
+ export type * from './get/index';
4
+ export { type TApiSubscriberRouteBeforeUpdateContext } from './update-context.type';
@@ -0,0 +1,7 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ import type { DeepPartial } from "typeorm";
5
+ export type TApiSubscriberRouteBeforeUpdateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, {
6
+ body: DeepPartial<E>;
7
+ }, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,2 @@
1
+ export type * from './after/index';
2
+ export type * from './before/index';
@@ -1,3 +1,4 @@
1
+ export type * from './api/index';
1
2
  export { type TApiException } from './api-exception.type';
2
3
  export type * from './controller/index';
3
4
  export { type TMetadata } from './metadata.type';
@@ -4,6 +4,8 @@ import type { IApiSubscriberErrorExecutionContext } from './error-execution-cont
4
4
  /**
5
5
  * Error execution context for function subscriber callbacks.
6
6
  * Contains function type information but no result field.
7
+ * @template E - Entity type extending IApiBaseEntity
8
+ * @template Input - Type of the DATA field (immutable context data). Use IApiSubscriberFunctionExecutionContextData<E> for typed access.
7
9
  */
8
10
  export interface IApiSubscriberFunctionErrorExecutionContext<E extends IApiBaseEntity, Input = unknown> extends IApiSubscriberErrorExecutionContext<E, Input> {
9
11
  readonly FUNCTION_TYPE: EApiFunctionType;
@@ -0,0 +1,38 @@
1
+ import type { IApiBaseEntity } from '../../../api-base-entity.interface';
2
+ import type { EntityManager, Repository } from "typeorm";
3
+ /**
4
+ * Data container for function subscriber execution context.
5
+ * Contains transaction manager and repository references.
6
+ * This interface provides typed access to the DATA field in function execution contexts.
7
+ * @example
8
+ * ```typescript
9
+ * async onBeforeCreate(
10
+ * context: IApiSubscriberFunctionExecutionContext<
11
+ * User,
12
+ * TApiFunctionCreateProperties<User>,
13
+ * IApiSubscriberFunctionExecutionContextData<User>
14
+ * >
15
+ * ): Promise<TApiFunctionCreateProperties<User>> {
16
+ * const manager = context.DATA.eventManager;
17
+ * const repository = context.DATA.repository;
18
+ *
19
+ * if (manager) {
20
+ * await manager.save(RelatedEntity, { ... });
21
+ * }
22
+ *
23
+ * return context.result;
24
+ * }
25
+ * ```
26
+ */
27
+ export interface IApiSubscriberFunctionExecutionContextData<E extends IApiBaseEntity> {
28
+ /**
29
+ * Entity manager for transactional operations.
30
+ * Available when service methods are called with a transaction manager.
31
+ */
32
+ eventManager?: EntityManager;
33
+ /**
34
+ * TypeORM repository instance for the entity.
35
+ * Provides access to database operations for the entity type.
36
+ */
37
+ repository: Repository<E>;
38
+ }
@@ -4,6 +4,25 @@ import type { IApiSubscriberExecutionContext } from './execution-context.interfa
4
4
  /**
5
5
  * Execution context for function subscriber callbacks.
6
6
  * Extends base execution context with function type information.
7
+ * @template E - Entity type extending IApiBaseEntity
8
+ * @template Result - Type of the result field (mutable data payload)
9
+ * @template Input - Type of the DATA field (immutable context data). Use IApiSubscriberFunctionExecutionContextData<E> for typed access.
10
+ * @example
11
+ * ```typescript
12
+ * import type { IApiSubscriberFunctionExecutionContextData } from '@elsikora/nestjs-crud-automator';
13
+ *
14
+ * async onBeforeCreate(
15
+ * context: IApiSubscriberFunctionExecutionContext<
16
+ * User,
17
+ * TApiFunctionCreateProperties<User>,
18
+ * IApiSubscriberFunctionExecutionContextData<User>
19
+ * >
20
+ * ): Promise<TApiFunctionCreateProperties<User>> {
21
+ * const manager = context.DATA.eventManager;
22
+ * const repository = context.DATA.repository;
23
+ * // ...
24
+ * }
25
+ * ```
7
26
  */
8
27
  export interface IApiSubscriberFunctionExecutionContext<E extends IApiBaseEntity, Result = unknown, Input = unknown> extends IApiSubscriberExecutionContext<E, Result, Input> {
9
28
  readonly FUNCTION_TYPE: EApiFunctionType;
@@ -1,9 +1,11 @@
1
1
  export type * from './error-execution-context.interface';
2
2
  export type * from './execution-context.interface';
3
3
  export type * from './function-error-execution-context.interface';
4
+ export type * from './function-execution-context-data.interface';
4
5
  export type * from './function-execution-context.interface';
5
6
  export type * from './function.interface';
6
7
  export type * from './interface';
7
8
  export type * from './route-error-execution-context.interface';
9
+ export type * from './route-execution-context-data.interface';
8
10
  export type * from './route-execution-context.interface';
9
11
  export type * from './route.interface';
@@ -4,6 +4,8 @@ import type { IApiSubscriberErrorExecutionContext } from './error-execution-cont
4
4
  /**
5
5
  * Error execution context for route subscriber callbacks.
6
6
  * Contains route type information but no result field.
7
+ * @template E - Entity type extending IApiBaseEntity
8
+ * @template Input - Type of the DATA field (immutable context data). Use IApiSubscriberRouteExecutionContextData<E> or IApiSubscriberRouteExecutionContextDataExtended<E> for typed access.
7
9
  */
8
10
  export interface IApiSubscriberRouteErrorExecutionContext<E extends IApiBaseEntity, Input = unknown> extends IApiSubscriberErrorExecutionContext<E, Input> {
9
11
  readonly ROUTE_TYPE: EApiRouteType;
@@ -0,0 +1,62 @@
1
+ import type { EApiRouteType } from '../../../../enum/decorator/api/route-type.enum';
2
+ import type { IApiAuthenticationRequest } from '../../../api-authentication-request.interface';
3
+ import type { IApiBaseEntity } from '../../../api-base-entity.interface';
4
+ import type { IApiControllerProperties } from '../../../decorator/api/controller/properties.interface';
5
+ import type { IApiEntity } from '../../../entity/index';
6
+ /**
7
+ * Base data container for route subscriber execution context.
8
+ * Contains route metadata and configuration.
9
+ * This interface provides typed access to the DATA field in route execution contexts.
10
+ * @example
11
+ * ```typescript
12
+ * async onBeforeCreate(
13
+ * context: IApiSubscriberRouteExecutionContext<
14
+ * User,
15
+ * { body: DeepPartial<User> },
16
+ * IApiSubscriberRouteExecutionContextData<User>
17
+ * >
18
+ * ): Promise<{ body: DeepPartial<User> }> {
19
+ * const entityMetadata = context.DATA.entityMetadata;
20
+ * const method = context.DATA.method;
21
+ * const methodName = context.DATA.methodName;
22
+ *
23
+ * return context.result;
24
+ * }
25
+ * ```
26
+ */
27
+ export interface IApiSubscriberRouteExecutionContextData<E extends IApiBaseEntity> {
28
+ /**
29
+ * Entity metadata containing information about entity columns, relations, and configuration.
30
+ */
31
+ entityMetadata: IApiEntity<E>;
32
+ /**
33
+ * Route method type (create, update, delete, get, etc.).
34
+ */
35
+ method: EApiRouteType;
36
+ /**
37
+ * Controller method name as defined in the controller.
38
+ */
39
+ methodName: string;
40
+ /**
41
+ * Controller properties and configuration for the current route.
42
+ */
43
+ properties: IApiControllerProperties<E>;
44
+ }
45
+ /**
46
+ * Extended data container for route subscriber execution context.
47
+ * Includes request context (headers, IP, authentication) in addition to base route data.
48
+ */
49
+ export interface IApiSubscriberRouteExecutionContextDataExtended<E extends IApiBaseEntity> extends IApiSubscriberRouteExecutionContextData<E> {
50
+ /**
51
+ * Authentication request information
52
+ */
53
+ authenticationRequest?: IApiAuthenticationRequest;
54
+ /**
55
+ * HTTP request headers
56
+ */
57
+ headers: Record<string, string>;
58
+ /**
59
+ * Client IP address
60
+ */
61
+ ip: string;
62
+ }
@@ -4,6 +4,25 @@ import type { IApiSubscriberExecutionContext } from './execution-context.interfa
4
4
  /**
5
5
  * Execution context for route subscriber callbacks.
6
6
  * Extends base execution context with route type information.
7
+ * @template E - Entity type extending IApiBaseEntity
8
+ * @template Result - Type of the result field (mutable data payload)
9
+ * @template Input - Type of the DATA field (immutable context data). Use IApiSubscriberRouteExecutionContextData<E> or IApiSubscriberRouteExecutionContextDataExtended<E> for typed access.
10
+ * @example
11
+ * ```typescript
12
+ * import type { IApiSubscriberRouteExecutionContextData } from '@elsikora/nestjs-crud-automator';
13
+ *
14
+ * async onBeforeCreate(
15
+ * context: IApiSubscriberRouteExecutionContext<
16
+ * User,
17
+ * { body: DeepPartial<User> },
18
+ * IApiSubscriberRouteExecutionContextData<User>
19
+ * >
20
+ * ): Promise<{ body: DeepPartial<User> }> {
21
+ * const entityMetadata = context.DATA.entityMetadata;
22
+ * const method = context.DATA.method;
23
+ * // ...
24
+ * }
25
+ * ```
7
26
  */
8
27
  export interface IApiSubscriberRouteExecutionContext<E extends IApiBaseEntity, Result = unknown, Input = unknown> extends IApiSubscriberExecutionContext<E, Result, Input> {
9
28
  readonly ROUTE_TYPE: EApiRouteType;
@@ -0,0 +1 @@
1
+ export type * from './subscriber/index';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterCreateContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, E, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterDeleteContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, E, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterGetContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, E, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,3 @@
1
+ export { type TApiSubscriberFunctionAfterGetContext } from './context.type';
2
+ export { type TApiSubscriberFunctionAfterGetListContext } from './list-context.type';
3
+ export { type TApiSubscriberFunctionAfterGetManyContext } from './many-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterGetListContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, Array<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterGetManyContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, Array<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ export { type TApiSubscriberFunctionAfterCreateContext } from './create-context.type';
2
+ export { type TApiSubscriberFunctionAfterDeleteContext } from './delete-context.type';
3
+ export type * from './get/index';
4
+ export { type TApiSubscriberFunctionAfterUpdateContext } from './update-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ export type TApiSubscriberFunctionAfterUpdateContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, E, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionCreateProperties } from '../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeCreateContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionCreateProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionDeleteCriteria } from '../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeDeleteContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionDeleteCriteria<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionGetProperties } from '../../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeGetContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionGetProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,3 @@
1
+ export { type TApiSubscriberFunctionBeforeGetContext } from './context.type';
2
+ export { type TApiSubscriberFunctionBeforeGetListContext } from './list-context.type';
3
+ export { type TApiSubscriberFunctionBeforeGetManyContext } from './many-context.type';
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionGetListProperties } from '../../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeGetListContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionGetListProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionGetManyProperties } from '../../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeGetManyContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionGetManyProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ export { type TApiSubscriberFunctionBeforeCreateContext } from './create-context.type';
2
+ export { type TApiSubscriberFunctionBeforeDeleteContext } from './delete-context.type';
3
+ export type * from './get/index';
4
+ export { type TApiSubscriberFunctionBeforeUpdateContext } from './update-context.type';
@@ -0,0 +1,5 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberFunctionExecutionContextData } from '../../../../../../interface/class/api/subscriber/function-execution-context-data.interface';
3
+ import type { IApiSubscriberFunctionExecutionContext } from '../../../../../../interface/class/api/subscriber/function-execution-context.interface';
4
+ import type { TApiFunctionUpdateProperties } from '../../../../../decorator/api/function/index';
5
+ export type TApiSubscriberFunctionBeforeUpdateContext<E extends IApiBaseEntity> = IApiSubscriberFunctionExecutionContext<E, TApiFunctionUpdateProperties<E>, IApiSubscriberFunctionExecutionContextData<E>>;
@@ -0,0 +1,2 @@
1
+ export type * from './after/index';
2
+ export type * from './before/index';
@@ -0,0 +1,2 @@
1
+ export type * from './function/index';
2
+ export type * from './route/index';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterCreateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterDeleteContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterGetContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,3 @@
1
+ export { type TApiSubscriberRouteAfterGetContext } from './context.type';
2
+ export { type TApiSubscriberRouteAfterGetListContext } from './list-context.type';
3
+ export { type TApiSubscriberRouteAfterGetManyContext } from './many-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterGetListContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, Array<E>, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterGetManyContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, Array<E>, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,4 @@
1
+ export { type TApiSubscriberRouteAfterCreateContext } from './create-context.type';
2
+ export { type TApiSubscriberRouteAfterDeleteContext } from './delete-context.type';
3
+ export type * from './get/index';
4
+ export { type TApiSubscriberRouteAfterUpdateContext } from './update-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteAfterUpdateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E>>;
@@ -0,0 +1,7 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ import type { DeepPartial } from "typeorm";
5
+ export type TApiSubscriberRouteBeforeCreateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, {
6
+ body: DeepPartial<E>;
7
+ }, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteBeforeDeleteContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteBeforeGetContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,3 @@
1
+ export { type TApiSubscriberRouteBeforeGetContext } from './context.type';
2
+ export { type TApiSubscriberRouteBeforeGetListContext } from './list-context.type';
3
+ export { type TApiSubscriberRouteBeforeGetManyContext } from './many-context.type';
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteBeforeGetListContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ export type TApiSubscriberRouteBeforeGetManyContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,4 @@
1
+ export { type TApiSubscriberRouteBeforeCreateContext } from './create-context.type';
2
+ export { type TApiSubscriberRouteBeforeDeleteContext } from './delete-context.type';
3
+ export type * from './get/index';
4
+ export { type TApiSubscriberRouteBeforeUpdateContext } from './update-context.type';
@@ -0,0 +1,7 @@
1
+ import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
2
+ import type { IApiSubscriberRouteExecutionContextData } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
3
+ import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
4
+ import type { DeepPartial } from "typeorm";
5
+ export type TApiSubscriberRouteBeforeUpdateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, {
6
+ body: DeepPartial<E>;
7
+ }, IApiSubscriberRouteExecutionContextData<E>>;
@@ -0,0 +1,2 @@
1
+ export type * from './after/index';
2
+ export type * from './before/index';
@@ -1,3 +1,4 @@
1
+ export type * from './api/index';
1
2
  export { type TApiException } from './api-exception.type';
2
3
  export type * from './controller/index';
3
4
  export { type TMetadata } from './metadata.type';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elsikora/nestjs-crud-automator",
3
- "version": "1.15.0",
3
+ "version": "1.16.0-dev.1",
4
4
  "description": "A library for automating the creation of CRUD operations in NestJS.",
5
5
  "keywords": [
6
6
  "NestJS",