diff --git a/.e2e-micro.env b/.e2e-micro.env
new file mode 100644
index 00000000..866e5ea8
--- /dev/null
+++ b/.e2e-micro.env
@@ -0,0 +1,2 @@
+DB_LOGGING=0
+ORM_TYPE=microorm
diff --git a/.e2e.env b/.e2e.env
index f48c488a..eda3206d 100644
--- a/.e2e.env
+++ b/.e2e.env
@@ -1 +1,2 @@
DB_LOGGING=0
+ORM_TYPE=typeorm
diff --git a/.env b/.env
index eaa22638..4a927090 100644
--- a/.env
+++ b/.env
@@ -3,7 +3,8 @@ DB_LOGGING=1
DB_USERNAME="postgres"
DB_PASSWORD="postgres"
-DB_NAME="json-api-db"
+#DB_NAME="json-api-db"
+DB_NAME="postgres"
DB_PORT=5432
DB_TYPE=postgres
@@ -12,3 +13,7 @@ DB_TYPE=postgres
#DB_NAME="example_new"
#DB_PORT=3306
#DB_TYPE=mysql
+
+
+ORM_TYPE=microorm
+#ORM_TYPE=typeorm
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9c3542bb..0820cc30 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -30,11 +30,11 @@ jobs:
- name: Test
env:
NX_REJECT_UNKNOWN_LOCAL_CACHE: 0
- run: npx nx affected -t test --parallel=3 --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,database,@nestjs-json-api/source,type-for-rpc'
+ run: npx nx affected -t test --parallel=3 --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc'
- name: Build
env:
NX_REJECT_UNKNOWN_LOCAL_CACHE: 0
- run: npx nx affected -t build --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,database,@nestjs-json-api/source,type-for-rpc'
+ run: npx nx affected -t build --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc'
- name: Save cached .nx
id: cache-dependencies-save
uses: actions/cache/save@v4
@@ -85,6 +85,7 @@ jobs:
- run: npm run typeorm migration:run
- run: npm run seed:run
- run: npx nx affected -t e2e --parallel=1
+ - run: npx nx affected -t e2e-micro --parallel=1
- name: Save cached .nx
id: cache-dependencies-save
uses: actions/cache/save@v4
diff --git a/.test.env b/.test.env
new file mode 100644
index 00000000..4f233b1b
--- /dev/null
+++ b/.test.env
@@ -0,0 +1,2 @@
+NODE_OPTIONS=--experimental-vm-modules --disable-warning=ExperimentalWarning
+DB_LOGGING=0
diff --git a/.verdaccio/config.yml b/.verdaccio/config.yml
new file mode 100644
index 00000000..f74420f2
--- /dev/null
+++ b/.verdaccio/config.yml
@@ -0,0 +1,28 @@
+# path to a directory with all packages
+storage: ../tmp/local-registry/storage
+
+# a list of other known repositories we can talk to
+uplinks:
+ npmjs:
+ url: https://registry.npmjs.org/
+ maxage: 60m
+
+packages:
+ '**':
+ # give all users (including non-authenticated users) full access
+ # because it is a local registry
+ access: $all
+ publish: $all
+ unpublish: $all
+
+ # if package is not available locally, proxy requests to npm registry
+ proxy: npmjs
+
+# log settings
+log:
+ type: stdout
+ format: pretty
+ level: warn
+
+publish:
+ allow_offline: true # set offline to true to allow publish offline
diff --git a/README.md b/README.md
index 219146a1..b268dff2 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,24 @@
- Json API plugins for
- NestJS
- framework
+NestJS JSON API & JSON RPC Suite
+
- Tools to implement JSON API, such as, end point, query params, body params, validation and transformation response.
+ This monorepo contains a set of several libraries designed to simplify the development of server and client applications using NestJS. These tools help you work with two popular protocols:
-- *[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)* - plugin for create CRUD overs JSON API
-- *[json-api-nestjs-sdk](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs-sdk)* - tool for client, call api over *json-api-nestjs*
-- *[nestjs-json-rpc](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-rpc/nestjs-json-rpc)* - plugin for create RPC server using [JSON-RPC](https://www.jsonrpc.org/)
-- *[nestjs-json-rpc-sdk](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-rpc/nestjs-json-rpc-sdk)* - tool for client, call RPC server *nestjs-json-rpc*
-- *json-api-nestjs-acl* - tool for acl over *json-api-nestjs*(coming soon...)
+
+- **[JSON:API](https://jsonapi.org/)** – A specification for building RESTful APIs with standardized request and response formats.
+
+ > **[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)** - This package enables you to quickly set up a server API that adheres to the JSON:API specification, handling standard CRUD operations for your resources.
+ > **[json-api-nestjs-sdk](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs-sdk)** - tool for client, call api over *json-api-nestjs*
+
+
+- **[JSON-RPC](https://www.jsonrpc.org/)** – A protocol for remote procedure calls using JSON.
+
+> **[nestjs-json-rpc](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-rpc/nestjs-json-rpc)** - Use this package to implement remote procedure call (RPC) functionality in your NestJS applications, enabling efficient inter-service communication.
+> **[nestjs-json-rpc-sdk](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-rpc/nestjs-json-rpc-sdk)** - This tool offers a straightforward way to call remote procedures from your client-side code, ensuring smooth communication with your JSON-RPC server.
+
+- **ACL tools** - tool for acl over *json-api-nestjs*(coming soon...)
## Installation
```bash
@@ -24,7 +31,7 @@ $ npm run seed:run
```bash
# dev server
-$ npm run demo:json-api
+$ nx run json-api-server:serve:development
```
## License
diff --git a/apps/json-api-server-e2e/project.json b/apps/json-api-server-e2e/project.json
index 94445c8f..4c159112 100644
--- a/apps/json-api-server-e2e/project.json
+++ b/apps/json-api-server-e2e/project.json
@@ -16,6 +16,17 @@
"passWithNoTests": true,
"parallel": 1
}
+ },
+ "e2e-micro": {
+ "executor": "@nx/jest:jest",
+ "outputs": [
+ "{workspaceRoot}/coverage/{e2eProjectRoot}"
+ ],
+ "options": {
+ "jestConfig": "apps/json-api-server-e2e/jest.config.ts",
+ "passWithNoTests": true,
+ "parallel": 1
+ }
}
}
}
diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/atomic-sdk.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/atomic-sdk.spec.ts
index bb5fe060..b89a48c5 100644
--- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/atomic-sdk.spec.ts
+++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/atomic-sdk.spec.ts
@@ -1,6 +1,12 @@
import { INestApplication } from '@nestjs/common';
-import { FilterOperand, JsonSdkPromise } from 'json-api-nestjs-sdk';
-import { Addresses, CommentKind, Comments, Roles, Users } from 'database';
+import { FilterOperand, JsonSdkPromise } from '@klerick/json-api-nestjs-sdk';
+import {
+ Addresses,
+ CommentKind,
+ Comments,
+ Roles,
+ Users,
+} from '@nestjs-json-api/typeorm-database';
import { faker } from '@faker-js/faker';
import { getUser } from '../utils/data-utils';
import { run, creatSdk } from '../utils/run-application';
diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/check-common-decorator.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/check-common-decorator.spec.ts
index 47b18d9f..969858db 100644
--- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/check-common-decorator.spec.ts
+++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/check-common-decorator.spec.ts
@@ -1,7 +1,7 @@
import { INestApplication } from '@nestjs/common';
-import { FilterOperand, JsonSdkPromise } from 'json-api-nestjs-sdk';
+import { FilterOperand, JsonSdkPromise } from '@klerick/json-api-nestjs-sdk';
import { AxiosError } from 'axios';
-import { Users } from 'database';
+import { Users } from '@nestjs-json-api/typeorm-database';
import { run, creatSdk } from '../utils/run-application';
diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/check-othe-call.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/check-othe-call.spec.ts
index 076dc277..d6d2957a 100644
--- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/check-othe-call.spec.ts
+++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/check-othe-call.spec.ts
@@ -1,6 +1,6 @@
import { INestApplication } from '@nestjs/common';
-import { FilterOperand, JsonSdkPromise } from 'json-api-nestjs-sdk';
-import { BookList, Users } from 'database';
+import { FilterOperand, JsonSdkPromise } from '@klerick/json-api-nestjs-sdk';
+import { BookList, Users } from '@nestjs-json-api/typeorm-database';
import { AxiosError } from 'axios';
import { faker } from '@faker-js/faker';
import { lastValueFrom } from 'rxjs';
diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts
index 04889c41..50bbd940 100644
--- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts
+++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts
@@ -1,11 +1,16 @@
import { INestApplication } from '@nestjs/common';
-import { Addresses, CommentKind, Comments, Roles, Users } from 'database';
+import {
+ Addresses,
+ CommentKind,
+ Comments,
+ Roles,
+ Users,
+} from '@nestjs-json-api/typeorm-database';
import { faker } from '@faker-js/faker';
-import { FilterOperand, JsonSdkPromise } from 'json-api-nestjs-sdk';
+import { FilterOperand, JsonSdkPromise } from '@klerick/json-api-nestjs-sdk';
import { getUser } from '../utils/data-utils';
import { creatSdk, run } from '../utils/run-application';
-import { AxiosError } from 'axios';
let app: INestApplication;
@@ -91,10 +96,10 @@ describe('GET method:', () => {
return Promise.all(tmp);
})
);
- await Promise.all(addressArray);
+
await Promise.all(
- [...usersArray, ...commentsArray, ...rolesArray].map((i) =>
- jsonSdk.jonApiSdkService.deleteOne(i)
+ [...usersArray, ...commentsArray, ...rolesArray, ...addressArray].map(
+ (i) => jsonSdk.jonApiSdkService.deleteOne(i)
)
);
});
@@ -334,6 +339,7 @@ describe('GET method:', () => {
userItem.id,
{ include: ['addresses'] }
);
+
expect(result).toBe(`${resultGetOne.addresses.id}`);
});
diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts
index 62deb265..09289a0f 100644
--- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts
+++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts
@@ -1,7 +1,12 @@
import { INestApplication } from '@nestjs/common';
-import { Addresses, CommentKind, Comments, Users } from 'database';
+import {
+ Addresses,
+ CommentKind,
+ Comments,
+ Users,
+} from '@nestjs-json-api/typeorm-database';
import { faker } from '@faker-js/faker';
-import { JsonSdkPromise } from 'json-api-nestjs-sdk';
+import { JsonSdkPromise } from '@klerick/json-api-nestjs-sdk';
import { creatSdk, run } from '../utils/run-application';
diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts
index ebc9b484..226947cf 100644
--- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts
+++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts
@@ -1,6 +1,12 @@
-import { Addresses, BookList, CommentKind, Comments, Users } from 'database';
+import {
+ Addresses,
+ BookList,
+ CommentKind,
+ Comments,
+ Users,
+} from '@nestjs-json-api/typeorm-database';
import { faker } from '@faker-js/faker';
-import { JsonSdkPromise } from 'json-api-nestjs-sdk';
+import { JsonSdkPromise } from '@klerick/json-api-nestjs-sdk';
import { creatSdk, run } from '../utils/run-application';
import { INestApplication } from '@nestjs/common';
diff --git a/apps/json-api-server-e2e/src/json-api/utils/data-utils.ts b/apps/json-api-server-e2e/src/json-api/utils/data-utils.ts
index 89bc0937..7e4cef3b 100644
--- a/apps/json-api-server-e2e/src/json-api/utils/data-utils.ts
+++ b/apps/json-api-server-e2e/src/json-api/utils/data-utils.ts
@@ -1,4 +1,4 @@
-import { Users } from 'database';
+import { Users } from '@nestjs-json-api/typeorm-database';
import { faker } from '@faker-js/faker';
export const getUser = () => {
diff --git a/apps/json-api-server-e2e/src/json-api/utils/run-application.ts b/apps/json-api-server-e2e/src/json-api/utils/run-application.ts
index b4e57aca..74698971 100644
--- a/apps/json-api-server-e2e/src/json-api/utils/run-application.ts
+++ b/apps/json-api-server-e2e/src/json-api/utils/run-application.ts
@@ -1,6 +1,6 @@
import { Test } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
-import { adapterForAxios, JsonApiJs } from 'json-api-nestjs-sdk';
+import { adapterForAxios, JsonApiJs } from '@klerick/json-api-nestjs-sdk';
import {
RpcFactory,
axiosTransportFactory,
diff --git a/apps/json-api-server/src/app/app.module.ts b/apps/json-api-server/src/app/app.module.ts
index 45403244..28b47579 100644
--- a/apps/json-api-server/src/app/app.module.ts
+++ b/apps/json-api-server/src/app/app.module.ts
@@ -1,15 +1,27 @@
import { Module } from '@nestjs/common';
import { LoggerModule } from 'nestjs-pino';
-import { DatabaseModule } from 'database';
-import { ResourcesModule } from './resources/resources.module';
+import { TypeOrmDatabaseModule } from '@nestjs-json-api/typeorm-database';
+import { MicroOrmDatabaseModule } from '@nestjs-json-api/microorm-database';
+import { ResourcesTypeModule } from './resources/type-orm/resources-type.module';
+import { ResourcesMicroModule } from './resources/micro-orm/resources-micro.module';
import { RpcModule } from './rpc/rpc.module';
import * as process from 'process';
+const ormModule =
+ process.env['ORM_TYPE'] === 'typeorm'
+ ? TypeOrmDatabaseModule
+ : MicroOrmDatabaseModule;
+
+const resourceModule =
+ process.env['ORM_TYPE'] === 'typeorm'
+ ? ResourcesTypeModule
+ : ResourcesMicroModule;
+
@Module({
imports: [
- DatabaseModule,
- ResourcesModule,
+ ormModule,
+ resourceModule,
RpcModule,
LoggerModule.forRoot({
pinoHttp: {
diff --git a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts
new file mode 100644
index 00000000..ab49a56f
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts
@@ -0,0 +1,10 @@
+import { ParseUUIDPipe } from '@nestjs/common';
+import { JsonApi, JsonBaseController } from '@klerick/json-api-nestjs';
+
+import { BookList } from '@nestjs-json-api/microorm-database';
+@JsonApi(BookList, {
+ pipeForId: ParseUUIDPipe,
+ overrideRoute: 'override-book-list',
+ allowMethod: ['getOne', 'postOne', 'deleteOne'],
+})
+export class ExtendBookListController extends JsonBaseController {}
diff --git a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts
new file mode 100644
index 00000000..c2ba33f5
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts
@@ -0,0 +1,79 @@
+import {
+ Get,
+ Param,
+ Inject,
+ Query,
+ UseInterceptors,
+ UseFilters,
+ UseGuards,
+} from '@nestjs/common';
+
+import {
+ JsonApi,
+ JsonBaseController,
+ InjectService,
+ JsonApiService,
+ Query as QueryType,
+ QueryOne,
+ ResourceObject,
+ EntityRelation,
+ PatchRelationshipData,
+ ResourceObjectRelationships,
+ PostData,
+} from '@klerick/json-api-nestjs';
+import { ExamplePipe } from '../../service/example.pipe';
+import { ExampleService } from '../../service/example.service';
+import { ControllerInterceptor } from '../../service/controller.interceptor';
+import { MethodInterceptor } from '../../service/method.interceptor';
+import {
+ HttpExceptionFilter,
+ HttpExceptionMethodFilter,
+} from '../../service/http-exception.filter';
+import { GuardService, EntityName } from '../../service/guard.service';
+
+import { Users } from '@nestjs-json-api/microorm-database';
+import { AtomicInterceptor } from '../../service/atomic.interceptor';
+
+@UseGuards(GuardService)
+@UseFilters(new HttpExceptionFilter())
+@UseInterceptors(ControllerInterceptor)
+@JsonApi(Users)
+export class ExtendUserController extends JsonBaseController {
+ @InjectService() public service: JsonApiService;
+ @Inject(ExampleService) protected exampleService: ExampleService;
+ override getOne(
+ id: string | number,
+ query: QueryOne
+ ): Promise> {
+ const t = query.fields?.target;
+
+ return super.getOne(id, query);
+ }
+
+ patchRelationship>(
+ id: string | number,
+ relName: Rel,
+ input: PatchRelationshipData
+ ): Promise> {
+ return super.patchRelationship(id, relName, input);
+ }
+
+ // @UseInterceptors(AtomicInterceptor)
+ postOne(inputData: PostData): Promise> {
+ return super.postOne(inputData);
+ }
+
+ @EntityName('Users')
+ @UseFilters(HttpExceptionMethodFilter)
+ @UseInterceptors(MethodInterceptor)
+ getAll(
+ @Query(ExamplePipe) query: QueryType
+ ): Promise> {
+ return super.getAll(query);
+ }
+
+ @Get(':id/example')
+ testOne(@Param('id') id: string): string {
+ return this.exampleService.testMethode(id);
+ }
+}
diff --git a/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts b/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts
new file mode 100644
index 00000000..88248808
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts
@@ -0,0 +1,29 @@
+import { Module } from '@nestjs/common';
+import { JsonApiModule, MicroOrmJsonApiModule } from '@klerick/json-api-nestjs';
+import {
+ Users,
+ Addresses,
+ Comments,
+ Roles,
+ BookList,
+} from '@nestjs-json-api/microorm-database';
+
+import { ExtendBookListController } from './controllers/extend-book-list/extend-book-list.controller';
+import { ExtendUserController } from './controllers/extend-user/extend-user.controller';
+import { ExampleService } from './service/example.service';
+
+@Module({
+ imports: [
+ JsonApiModule.forRoot(MicroOrmJsonApiModule, {
+ entities: [Users, Addresses, Comments, Roles, BookList],
+ controllers: [ExtendBookListController, ExtendUserController],
+ providers: [ExampleService],
+ options: {
+ debug: true,
+ requiredSelectField: false,
+ operationUrl: 'operation',
+ },
+ }),
+ ],
+})
+export class ResourcesMicroModule {}
diff --git a/apps/json-api-server/src/app/resources/service/atomic.interceptor.ts b/apps/json-api-server/src/app/resources/micro-orm/service/atomic.interceptor.ts
similarity index 100%
rename from apps/json-api-server/src/app/resources/service/atomic.interceptor.ts
rename to apps/json-api-server/src/app/resources/micro-orm/service/atomic.interceptor.ts
diff --git a/apps/json-api-server/src/app/resources/service/controller.interceptor.ts b/apps/json-api-server/src/app/resources/micro-orm/service/controller.interceptor.ts
similarity index 100%
rename from apps/json-api-server/src/app/resources/service/controller.interceptor.ts
rename to apps/json-api-server/src/app/resources/micro-orm/service/controller.interceptor.ts
diff --git a/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts b/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts
new file mode 100644
index 00000000..a7b49347
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts
@@ -0,0 +1,22 @@
+import {
+ ArgumentMetadata,
+ BadRequestException,
+ PipeTransform,
+} from '@nestjs/common';
+
+import { Query } from '@klerick/json-api-nestjs';
+import { Users } from '@nestjs-json-api/microorm-database';
+
+export class ExamplePipe implements PipeTransform, Query> {
+ transform(value: Query, metadata: ArgumentMetadata): Query {
+ if (value.filter.target?.firstName?.eq === 'testCustomPipe') {
+ const error = {
+ code: 'invalid_arguments',
+ message: `Custom query pipe error`,
+ path: [],
+ };
+ throw new BadRequestException([error]);
+ }
+ return value;
+ }
+}
diff --git a/apps/json-api-server/src/app/resources/service/example.service.ts b/apps/json-api-server/src/app/resources/micro-orm/service/example.service.ts
similarity index 100%
rename from apps/json-api-server/src/app/resources/service/example.service.ts
rename to apps/json-api-server/src/app/resources/micro-orm/service/example.service.ts
diff --git a/apps/json-api-server/src/app/resources/service/guard.service.ts b/apps/json-api-server/src/app/resources/micro-orm/service/guard.service.ts
similarity index 94%
rename from apps/json-api-server/src/app/resources/service/guard.service.ts
rename to apps/json-api-server/src/app/resources/micro-orm/service/guard.service.ts
index 66714d6e..a8567bc2 100644
--- a/apps/json-api-server/src/app/resources/service/guard.service.ts
+++ b/apps/json-api-server/src/app/resources/micro-orm/service/guard.service.ts
@@ -6,7 +6,7 @@ import {
Injectable,
} from '@nestjs/common';
import { Observable } from 'rxjs';
-import { entityForClass } from 'json-api-nestjs';
+import { entityForClass } from '@klerick/json-api-nestjs';
import { Request } from 'express';
import { Reflector } from '@nestjs/core';
diff --git a/apps/json-api-server/src/app/resources/service/http-exception.filter.ts b/apps/json-api-server/src/app/resources/micro-orm/service/http-exception.filter.ts
similarity index 100%
rename from apps/json-api-server/src/app/resources/service/http-exception.filter.ts
rename to apps/json-api-server/src/app/resources/micro-orm/service/http-exception.filter.ts
diff --git a/apps/json-api-server/src/app/resources/service/method.interceptor.ts b/apps/json-api-server/src/app/resources/micro-orm/service/method.interceptor.ts
similarity index 100%
rename from apps/json-api-server/src/app/resources/service/method.interceptor.ts
rename to apps/json-api-server/src/app/resources/micro-orm/service/method.interceptor.ts
diff --git a/apps/json-api-server/src/app/resources/controllers/extend-book-list/extend-book-list.controller.ts b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts
similarity index 66%
rename from apps/json-api-server/src/app/resources/controllers/extend-book-list/extend-book-list.controller.ts
rename to apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts
index 971bba19..170dab5b 100644
--- a/apps/json-api-server/src/app/resources/controllers/extend-book-list/extend-book-list.controller.ts
+++ b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts
@@ -1,7 +1,7 @@
import { ParseUUIDPipe } from '@nestjs/common';
-import { BookList } from 'database';
-import { JsonApi, JsonBaseController } from 'json-api-nestjs';
+import { JsonApi, JsonBaseController } from '@klerick/json-api-nestjs';
+import { BookList } from '@nestjs-json-api/typeorm-database';
@JsonApi(BookList, {
pipeForId: ParseUUIDPipe,
overrideRoute: 'override-book-list',
diff --git a/apps/json-api-server/src/app/resources/controllers/extend-user/extend-user.controller.ts b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts
similarity index 92%
rename from apps/json-api-server/src/app/resources/controllers/extend-user/extend-user.controller.ts
rename to apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts
index 01acce2f..87b4f842 100644
--- a/apps/json-api-server/src/app/resources/controllers/extend-user/extend-user.controller.ts
+++ b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts
@@ -7,19 +7,20 @@ import {
UseFilters,
UseGuards,
} from '@nestjs/common';
-import { Users } from 'database';
+
import {
JsonApi,
JsonBaseController,
InjectService,
JsonApiService,
Query as QueryType,
+ QueryOne,
ResourceObject,
EntityRelation,
PatchRelationshipData,
ResourceObjectRelationships,
PostData,
-} from 'json-api-nestjs';
+} from '@klerick/json-api-nestjs';
import { ExamplePipe } from '../../service/example.pipe';
import { ExampleService } from '../../service/example.service';
import { ControllerInterceptor } from '../../service/controller.interceptor';
@@ -29,6 +30,8 @@ import {
HttpExceptionMethodFilter,
} from '../../service/http-exception.filter';
import { GuardService, EntityName } from '../../service/guard.service';
+
+import { Users } from '@nestjs-json-api/typeorm-database';
import { AtomicInterceptor } from '../../service/atomic.interceptor';
@UseGuards(GuardService)
@@ -38,9 +41,9 @@ import { AtomicInterceptor } from '../../service/atomic.interceptor';
export class ExtendUserController extends JsonBaseController {
@InjectService() public service: JsonApiService;
@Inject(ExampleService) protected exampleService: ExampleService;
- getOne(
+ override getOne(
id: string | number,
- query: QueryType
+ query: QueryOne
): Promise> {
return super.getOne(id, query);
}
diff --git a/apps/json-api-server/src/app/resources/resources.module.ts b/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts
similarity index 69%
rename from apps/json-api-server/src/app/resources/resources.module.ts
rename to apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts
index 1c4d0e8d..397eb04b 100644
--- a/apps/json-api-server/src/app/resources/resources.module.ts
+++ b/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts
@@ -1,13 +1,20 @@
import { Module } from '@nestjs/common';
-import { JsonApiModule } from 'json-api-nestjs';
-import { Users, Addresses, Comments, Roles, BookList } from 'database';
+import { JsonApiModule, TypeOrmJsonApiModule } from '@klerick/json-api-nestjs';
+import {
+ Users,
+ Addresses,
+ Comments,
+ Roles,
+ BookList,
+} from '@nestjs-json-api/typeorm-database';
+
import { ExtendBookListController } from './controllers/extend-book-list/extend-book-list.controller';
import { ExtendUserController } from './controllers/extend-user/extend-user.controller';
import { ExampleService } from './service/example.service';
@Module({
imports: [
- JsonApiModule.forRoot({
+ JsonApiModule.forRoot(TypeOrmJsonApiModule, {
entities: [Users, Addresses, Comments, Roles, BookList],
controllers: [ExtendBookListController, ExtendUserController],
providers: [ExampleService],
@@ -19,4 +26,4 @@ import { ExampleService } from './service/example.service';
}),
],
})
-export class ResourcesModule {}
+export class ResourcesTypeModule {}
diff --git a/apps/json-api-server/src/app/resources/type-orm/service/atomic.interceptor.ts b/apps/json-api-server/src/app/resources/type-orm/service/atomic.interceptor.ts
new file mode 100644
index 00000000..a52366ac
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/type-orm/service/atomic.interceptor.ts
@@ -0,0 +1,18 @@
+import {
+ CallHandler,
+ ExecutionContext,
+ NestInterceptor,
+ Injectable,
+} from '@nestjs/common';
+import { Observable } from 'rxjs';
+
+@Injectable()
+export class AtomicInterceptor implements NestInterceptor {
+ intercept(context: ExecutionContext, next: CallHandler): Observable {
+ const isAtomic = context.getArgByIndex(3);
+ if (isAtomic) {
+ console.log('call from atomic operation');
+ }
+ return next.handle();
+ }
+}
diff --git a/apps/json-api-server/src/app/resources/type-orm/service/controller.interceptor.ts b/apps/json-api-server/src/app/resources/type-orm/service/controller.interceptor.ts
new file mode 100644
index 00000000..ee6db5ea
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/type-orm/service/controller.interceptor.ts
@@ -0,0 +1,39 @@
+import {
+ CallHandler,
+ ExecutionContext,
+ NestInterceptor,
+ Injectable,
+ BadRequestException,
+} from '@nestjs/common';
+import { Observable, of, switchMap, throwError } from 'rxjs';
+import { map } from 'rxjs/operators';
+import { Request } from 'express';
+import { ImATeapotException } from '@nestjs/common/exceptions/im-a-teapot.exception';
+
+@Injectable()
+export class ControllerInterceptor implements NestInterceptor {
+ intercept(context: ExecutionContext, next: CallHandler): Observable {
+ const query = context.switchToHttp().getRequest().query;
+ const typeCall = (query as any)?.filter?.firstName?.eq;
+
+ return of(typeCall).pipe(
+ switchMap((r) => {
+ if (r === 'testControllerFilter') {
+ return throwError(() => new ImATeapotException());
+ }
+ return next.handle();
+ }),
+ map((r) => {
+ if (typeCall === 'testControllerInterceptor') {
+ const error = {
+ code: 'invalid_arguments',
+ message: `testControllerInterceptor error`,
+ path: [],
+ };
+ throw new BadRequestException([error]);
+ }
+ return r;
+ })
+ );
+ }
+}
diff --git a/apps/json-api-server/src/app/resources/service/example.pipe.ts b/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts
similarity index 82%
rename from apps/json-api-server/src/app/resources/service/example.pipe.ts
rename to apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts
index 63d0dc9f..9adda16d 100644
--- a/apps/json-api-server/src/app/resources/service/example.pipe.ts
+++ b/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts
@@ -4,8 +4,8 @@ import {
PipeTransform,
} from '@nestjs/common';
-import { Query } from 'json-api-nestjs';
-import { Users } from 'database';
+import { Query } from '@klerick/json-api-nestjs';
+import { Users } from '@nestjs-json-api/typeorm-database';
export class ExamplePipe implements PipeTransform, Query> {
transform(value: Query, metadata: ArgumentMetadata): Query {
diff --git a/apps/json-api-server/src/app/resources/type-orm/service/example.service.ts b/apps/json-api-server/src/app/resources/type-orm/service/example.service.ts
new file mode 100644
index 00000000..be8fc1e8
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/type-orm/service/example.service.ts
@@ -0,0 +1,5 @@
+export class ExampleService {
+ testMethode(id: string): string {
+ return id;
+ }
+}
diff --git a/apps/json-api-server/src/app/resources/type-orm/service/guard.service.ts b/apps/json-api-server/src/app/resources/type-orm/service/guard.service.ts
new file mode 100644
index 00000000..a8567bc2
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/type-orm/service/guard.service.ts
@@ -0,0 +1,41 @@
+import {
+ BadRequestException,
+ CanActivate,
+ ExecutionContext,
+ ForbiddenException,
+ Injectable,
+} from '@nestjs/common';
+import { Observable } from 'rxjs';
+import { entityForClass } from '@klerick/json-api-nestjs';
+import { Request } from 'express';
+import { Reflector } from '@nestjs/core';
+
+export const EntityName = Reflector.createDecorator();
+
+@Injectable()
+export class GuardService implements CanActivate {
+ constructor(private reflector: Reflector) {}
+
+ canActivate(
+ context: ExecutionContext
+ ): boolean | Promise | Observable {
+ const query = context.switchToHttp().getRequest().query;
+ const typeCall = (query as any)?.filter?.firstName?.eq;
+
+ if (typeCall === 'testControllerGuard') {
+ return false;
+ }
+
+ if (typeCall === 'testMethodeGuard') {
+ const entityName = this.reflector.get(EntityName, context.getHandler());
+ if (!entityName) throw new BadRequestException();
+
+ // @ts-ignore
+ if (entityForClass(context.getClass()).name === entityName) {
+ throw new ForbiddenException('Not allow to ' + entityName);
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/apps/json-api-server/src/app/resources/type-orm/service/http-exception.filter.ts b/apps/json-api-server/src/app/resources/type-orm/service/http-exception.filter.ts
new file mode 100644
index 00000000..125a3db5
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/type-orm/service/http-exception.filter.ts
@@ -0,0 +1,38 @@
+import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common';
+import { ImATeapotException } from '@nestjs/common/exceptions/im-a-teapot.exception';
+import { Request, Response } from 'express';
+import { PreconditionFailedException } from '@nestjs/common/exceptions/precondition-failed.exception';
+
+@Catch(ImATeapotException)
+export class HttpExceptionFilter implements ExceptionFilter {
+ catch(exception: any, host: ArgumentsHost): any {
+ const ctx = host.switchToHttp();
+ const response = ctx.getResponse();
+ const request = ctx.getRequest();
+ const status = exception.getStatus();
+
+ response.status(status).json({
+ statusCode: status,
+ timestamp: new Date().toISOString(),
+ path: request.url,
+ method: false,
+ });
+ }
+}
+
+@Catch(PreconditionFailedException)
+export class HttpExceptionMethodFilter implements ExceptionFilter {
+ catch(exception: any, host: ArgumentsHost): any {
+ const ctx = host.switchToHttp();
+ const response = ctx.getResponse();
+ const request = ctx.getRequest();
+ const status = exception.getStatus();
+
+ response.status(status).json({
+ statusCode: status,
+ timestamp: new Date().toISOString(),
+ path: request.url,
+ method: true,
+ });
+ }
+}
diff --git a/apps/json-api-server/src/app/resources/type-orm/service/method.interceptor.ts b/apps/json-api-server/src/app/resources/type-orm/service/method.interceptor.ts
new file mode 100644
index 00000000..37045f48
--- /dev/null
+++ b/apps/json-api-server/src/app/resources/type-orm/service/method.interceptor.ts
@@ -0,0 +1,40 @@
+import {
+ CallHandler,
+ ExecutionContext,
+ NestInterceptor,
+ Injectable,
+ BadRequestException,
+} from '@nestjs/common';
+import { Observable, of, switchMap, throwError } from 'rxjs';
+import { map } from 'rxjs/operators';
+import { Request } from 'express';
+import { ImATeapotException } from '@nestjs/common/exceptions/im-a-teapot.exception';
+import { PreconditionFailedException } from '@nestjs/common/exceptions/precondition-failed.exception';
+
+@Injectable()
+export class MethodInterceptor implements NestInterceptor {
+ intercept(context: ExecutionContext, next: CallHandler): Observable {
+ const query = context.switchToHttp().getRequest().query;
+ const typeCall = (query as any)?.filter?.firstName?.eq;
+
+ return of(typeCall).pipe(
+ switchMap((r) => {
+ if (r === 'testMethodFilter') {
+ return throwError(() => new PreconditionFailedException());
+ }
+ return next.handle();
+ }),
+ map((r) => {
+ if (typeCall === 'testMethodInterceptor') {
+ const error = {
+ code: 'invalid_arguments',
+ message: `testMethodInterceptor error`,
+ path: [],
+ };
+ throw new BadRequestException([error]);
+ }
+ return r;
+ })
+ );
+ }
+}
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 00000000..52340133
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,51 @@
+version: '3.8'
+services:
+# api-gate:
+# container_name: api-gate
+# restart: always
+# build: apps/api-gate/
+# ports:
+# - "3000:3000"
+ postgres:
+ image: postgres:15.1-alpine
+ restart: always
+ environment:
+ - POSTGRES_USER=postgres
+ - POSTGRES_PASSWORD=postgres
+ ports:
+ - '5432:5432'
+ volumes:
+ - db:/var/lib/postgresql/data
+ pgadmin:
+ container_name: 'pgadmin'
+ image: 'dpage/pgadmin4:latest'
+ hostname: pgadmin
+ depends_on:
+ - 'postgres'
+ environment:
+ - PGADMIN_DEFAULT_PASSWORD=password
+ - PGADMIN_DEFAULT_EMAIL=pg.admin@email.com
+ volumes:
+ - pgadmin:/root/.pgadmin
+ ports:
+ - '8000:80'
+# redis:
+# image: redis:6.2-alpine
+# restart: always
+# ports:
+# - '6379:6379'
+# command: redis-server --save 20 1 --loglevel warning
+# volumes:
+# - redis:/data
+# jaeger:
+# image: jaegertracing/all-in-one:1.41
+# ports:
+# - "16686:16686"
+# - "14268:14268"
+volumes:
+ db:
+ driver: local
+# redis:
+# driver: local
+ pgadmin:
+ driver: local
diff --git a/libs/database/README.md b/libs/database/README.md
deleted file mode 100644
index 8453478f..00000000
--- a/libs/database/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# database
-
-This library was generated with [Nx](https://nx.dev).
-
-## Running unit tests
-
-Run `nx test database` to execute the unit tests via [Jest](https://jestjs.io).
diff --git a/libs/database/project.json b/libs/database/project.json
deleted file mode 100644
index 43dc1750..00000000
--- a/libs/database/project.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "database",
- "$schema": "../../node_modules/nx/schemas/project-schema.json",
- "sourceRoot": "libs/database/src",
- "projectType": "library",
- "targets": {},
- "tags": []
-}
diff --git a/libs/database/src/index.ts b/libs/database/src/index.ts
deleted file mode 100644
index 0207b998..00000000
--- a/libs/database/src/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './lib/database.module';
-export * from './lib/entities';
diff --git a/libs/json-api/json-api-nestjs-sdk/README.md b/libs/json-api/json-api-nestjs-sdk/README.md
index 15f7fbc4..51cc5bf0 100644
--- a/libs/json-api/json-api-nestjs-sdk/README.md
+++ b/libs/json-api/json-api-nestjs-sdk/README.md
@@ -14,7 +14,7 @@ The plugin of client for help work with JSON API over [json-api-nestjs](https://
## Installation
```bash $
-npm install json-api-nestjs-sdk
+npm install @klerick/json-api-nestjs-sdk
```
## Example
@@ -27,7 +27,7 @@ import {
FilterOperand,
JsonApiJs,
JsonSdkPromise,
-} from 'json-api-nestjs-sdk';
+} from '@klerick/json-api-nestjs-sdk';
import { faker } from '@faker-js/faker';
import axios from 'axios';
@@ -93,7 +93,11 @@ const [addressPost, managerPost, rolesPost, userPost] = await jsonSdk
```
or you can use Angular module:
```typescript
-import { provideJsonApi, AtomicFactory, JsonApiSdkService } from 'json-api-nestjs-sdk/ngModule';
+import {
+ provideJsonApi,
+ AtomicFactory,
+ JsonApiSdkService
+} from '@klerick/json-api-nestjs-sdk/ngModule';
import {
provideHttpClient,
withFetch,
diff --git a/libs/json-api/json-api-nestjs-sdk/package.json b/libs/json-api/json-api-nestjs-sdk/package.json
index 98799c5f..fc882e54 100644
--- a/libs/json-api/json-api-nestjs-sdk/package.json
+++ b/libs/json-api/json-api-nestjs-sdk/package.json
@@ -1,5 +1,5 @@
{
- "name": "json-api-nestjs-sdk",
+ "name": "@klerick/json-api-nestjs-sdk",
"version": "8.0.0",
"engines": {
"node": ">= 16.0.0"
diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts
index 95feb008..dd04a10e 100644
--- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts
@@ -453,15 +453,19 @@ describe('JsonApiUtilsService', () => {
},
relationships: {
relatedEntity: {
- type: 'related-entity',
- id: '2',
- },
- relatedEntities: [
- {
- type: 'related-entities',
- id: '3',
+ data: {
+ type: 'related-entity',
+ id: '2',
},
- ],
+ },
+ relatedEntities: {
+ data: [
+ {
+ type: 'related-entities',
+ id: '3',
+ },
+ ],
+ },
},
});
});
diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts
index 0584fd3c..6f029dce 100644
--- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts
@@ -1,3 +1,5 @@
+import { createEntityInstance } from '../../shared';
+
import {
Attributes,
Entity as EntityObject,
@@ -19,7 +21,6 @@ import {
HttpParams,
isObject,
isRelation,
- kebabToCamel,
ObjectTyped,
} from '../utils';
import { ID_KEY } from '../constants';
@@ -260,8 +261,7 @@ export class JsonApiUtilsService {
}
createEntityInstance(name: string): E {
- const entityName = kebabToCamel(name);
- return Function('return new class ' + entityName + '{}')();
+ return createEntityInstance(name);
}
private findIncludeEntity>>(
@@ -272,6 +272,7 @@ export class JsonApiUtilsService {
(includedItem) =>
includedItem.type === item.type && includedItem.id === item.id
);
+
if (!relatedIncluded) return;
const entityObject = {
@@ -338,7 +339,7 @@ export class JsonApiUtilsService {
}
return {
...acum,
- [key]: data,
+ [key]: { data },
};
}, {} as Relationships);
diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts
index ecc3a2b1..682c399a 100644
--- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts
@@ -1,4 +1,4 @@
-import { EntityField, EntityProps } from 'json-shared-type';
+import { EntityField, EntityProps } from '../../shared';
export { EntityField, EntityProps };
diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts
index ba47b6e3..c1f1a670 100644
--- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts
@@ -1,4 +1,4 @@
-import { FilterOperand } from 'json-shared-type';
+import { FilterOperand } from '../../shared';
export { FilterOperand };
diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts
index 1450e19d..8a555ac8 100644
--- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts
@@ -1,4 +1,4 @@
-import { QueryField } from 'json-shared-type';
+import { QueryField } from '../../shared';
import { EntityProps, EntityRelation } from './entity';
import { TypeOfArray } from './utils';
import { Operands, OperandsRelation } from './filter-operand';
diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts
index 33f67dab..24813506 100644
--- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts
@@ -10,4 +10,4 @@ export {
ResourceData,
ResourceObject,
ResourceObjectRelationships,
-} from 'json-shared-type';
+} from '../../shared';
diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts
index 4ce83427..233d219b 100644
--- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts
@@ -1,4 +1,4 @@
-import { TypeOfArray } from 'json-shared-type';
+import { TypeOfArray } from '../../shared';
export { TypeOfArray };
type IntersectionToObj = {
diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts
index f768ed57..4a278865 100644
--- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts
@@ -69,12 +69,14 @@ describe('GenerateAtomicBody', () => {
text: entity.text,
},
relationships: {
- users: [
- {
- id: `${user.id}`,
- type: 'users',
- },
- ],
+ users: {
+ data: [
+ {
+ id: `${user.id}`,
+ type: 'users',
+ },
+ ],
+ },
},
type: 'book-list',
},
@@ -102,12 +104,14 @@ describe('GenerateAtomicBody', () => {
text: entity.text,
},
relationships: {
- users: [
- {
- id: `${user.id}`,
- type: 'users',
- },
- ],
+ users: {
+ data: [
+ {
+ id: `${user.id}`,
+ type: 'users',
+ },
+ ],
+ },
},
type: 'book-list',
},
@@ -147,12 +151,14 @@ describe('GenerateAtomicBody', () => {
text: entity.text,
},
relationships: {
- users: [
- {
- id: `${user.id}`,
- type: 'users',
- },
- ],
+ users: {
+ data: [
+ {
+ id: `${user.id}`,
+ type: 'users',
+ },
+ ],
+ },
},
type: 'book-list',
},
diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts
index 1367c3c2..495bd3c5 100644
--- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts
@@ -1,4 +1,4 @@
-import { camelToKebab } from 'shared-utils';
+import { camelToKebab } from '../../shared';
import { JsonApiSdkConfig, JsonSdkConfig } from '../types';
import { ID_KEY } from '../constants';
@@ -14,7 +14,7 @@ export {
capitalizeFirstChar,
kebabToCamel,
isObject,
-} from 'shared-utils';
+} from '../../shared';
export function resultConfig(partialConfig: JsonSdkConfig): JsonApiSdkConfig {
return {
diff --git a/libs/shared-utils/src/index.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/index.ts
similarity index 100%
rename from libs/shared-utils/src/index.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/index.ts
diff --git a/libs/json-api/json-shared-type/src/types/entity-type.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/entity-type.ts
similarity index 100%
rename from libs/json-api/json-shared-type/src/types/entity-type.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/entity-type.ts
diff --git a/libs/json-api/json-shared-type/src/types/index.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts
similarity index 71%
rename from libs/json-api/json-shared-type/src/types/index.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts
index 8b86a958..33b70ba6 100644
--- a/libs/json-api/json-shared-type/src/types/index.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts
@@ -1,4 +1,4 @@
-export * from './entity-type';
+export * from './utils-string.type';
export * from './query-type';
-export * from './utils-type';
+export * from './entity-type';
export * from './response-body';
diff --git a/libs/json-api/json-shared-type/src/types/query-type.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts
similarity index 58%
rename from libs/json-api/json-shared-type/src/types/query-type.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts
index dba33ee2..ddeead7a 100644
--- a/libs/json-api/json-shared-type/src/types/query-type.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts
@@ -10,12 +10,27 @@ export enum FilterOperand {
eq = 'eq',
gt = 'gt',
gte = 'gte',
- in = 'in',
like = 'like',
lt = 'lt',
lte = 'lte',
ne = 'ne',
- nin = 'nin',
regexp = 'regexp',
+ in = 'in',
+ nin = 'nin',
some = 'some',
}
+
+export enum FilterOperandOnlyInNin {
+ in = 'in',
+ nin = 'nin',
+}
+export enum FilterOperandOnlySimple {
+ eq = 'eq',
+ gt = 'gt',
+ gte = 'gte',
+ like = 'like',
+ lt = 'lt',
+ lte = 'lte',
+ ne = 'ne',
+ regexp = 'regexp',
+}
diff --git a/libs/json-api/json-shared-type/src/types/response-body.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts
similarity index 86%
rename from libs/json-api/json-shared-type/src/types/response-body.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts
index fbe91dde..85dbdb49 100644
--- a/libs/json-api/json-shared-type/src/types/response-body.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts
@@ -5,6 +5,7 @@ import {
TypeOfArray,
ValueOf,
} from '.';
+import { Collection } from '@mikro-orm/core';
export type PageProps = {
totalItems: number;
@@ -30,8 +31,14 @@ export type Attributes = {
[P in EntityProps]?: D[P] extends EntityField ? D[P] : TypeOfArray;
};
+export type DataResult = E extends unknown[]
+ ? MainData[]
+ : E extends Collection
+ ? MainData[]
+ : MainData | null;
+
export type Data = {
- data?: E extends unknown[] ? MainData[] : MainData | null;
+ data?: DataResult;
};
export type Relationships = {
diff --git a/libs/shared-utils/src/lib/types/utils-string.type.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts
similarity index 72%
rename from libs/shared-utils/src/lib/types/utils-string.type.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts
index d5719e31..b861d238 100644
--- a/libs/shared-utils/src/lib/types/utils-string.type.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts
@@ -1,3 +1,5 @@
+import type { Collection } from '@mikro-orm/core';
+
export type KebabCase = S extends `${infer C}${infer T}`
? KebabCase extends infer U
? U extends string
@@ -14,3 +16,11 @@ export type KebabToCamelCase =
: S extends `${infer T}-${infer U}`
? `${Capitalize}${Capitalize>}`
: S;
+
+export type TypeOfArray = T extends (infer U)[]
+ ? U
+ : T extends Collection
+ ? U
+ : T;
+
+export type ValueOf = T[keyof T];
diff --git a/libs/shared-utils/src/lib/utils/index.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/index.ts
similarity index 100%
rename from libs/shared-utils/src/lib/utils/index.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/index.ts
diff --git a/libs/shared-utils/src/lib/utils/object-utils.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts
similarity index 71%
rename from libs/shared-utils/src/lib/utils/object-utils.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts
index 461455b3..5d4ad26d 100644
--- a/libs/shared-utils/src/lib/utils/object-utils.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts
@@ -1,3 +1,5 @@
+import { kebabToCamel } from './string-utils';
+
export const ObjectTyped = {
keys: Object.keys as (yourObject: T) => Array,
values: Object.values as (yourObject: U) => Array,
@@ -12,3 +14,8 @@ export const ObjectTyped = {
export function isObject(item: unknown): item is object {
return typeof item === 'object' && !Array.isArray(item) && item !== null;
}
+
+export function createEntityInstance(name: string): E {
+ const entityName = kebabToCamel(name);
+ return Function('return new class ' + entityName + '{}')();
+}
diff --git a/libs/shared-utils/src/lib/utils/string-utils.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts
similarity index 91%
rename from libs/shared-utils/src/lib/utils/string-utils.spec.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts
index 437de652..4596cd21 100644
--- a/libs/shared-utils/src/lib/utils/string-utils.spec.ts
+++ b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts
@@ -1,4 +1,9 @@
-import { camelToKebab, snakeToCamel, isString, kebabToCamel } from './';
+import {
+ camelToKebab,
+ snakeToCamel,
+ isString,
+ kebabToCamel,
+} from './string-utils';
describe('Test utils', () => {
it('camelToKebab', () => {
diff --git a/libs/shared-utils/src/lib/utils/string-utils.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.ts
similarity index 100%
rename from libs/shared-utils/src/lib/utils/string-utils.ts
rename to libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.ts
diff --git a/libs/json-api/json-api-nestjs-shared/.eslintrc.json b/libs/json-api/json-api-nestjs-shared/.eslintrc.json
new file mode 100644
index 00000000..0af28030
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/.eslintrc.json
@@ -0,0 +1,30 @@
+{
+ "extends": ["../../../.eslintrc.base.json"],
+ "ignorePatterns": ["!**/*"],
+ "overrides": [
+ {
+ "files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
+ "rules": {}
+ },
+ {
+ "files": ["*.ts", "*.tsx"],
+ "rules": {}
+ },
+ {
+ "files": ["*.js", "*.jsx"],
+ "rules": {}
+ },
+ {
+ "files": ["*.json"],
+ "parser": "jsonc-eslint-parser",
+ "rules": {
+ "@nx/dependency-checks": [
+ "error",
+ {
+ "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"]
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/libs/json-api/json-api-nestjs-shared/README.md b/libs/json-api/json-api-nestjs-shared/README.md
new file mode 100644
index 00000000..8703f1bf
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/README.md
@@ -0,0 +1,11 @@
+# json-api-nestjs-shared
+
+This library was generated with [Nx](https://nx.dev).
+
+## Building
+
+Run `nx build json-api-nestjs-shared` to build the library.
+
+## Running unit tests
+
+Run `nx test json-api-nestjs-shared` to execute the unit tests via [Jest](https://jestjs.io).
diff --git a/libs/json-api/json-shared-type/jest.config.ts b/libs/json-api/json-api-nestjs-shared/jest.config.ts
similarity index 63%
rename from libs/json-api/json-shared-type/jest.config.ts
rename to libs/json-api/json-api-nestjs-shared/jest.config.ts
index 2c9b7818..67ade3e9 100644
--- a/libs/json-api/json-shared-type/jest.config.ts
+++ b/libs/json-api/json-api-nestjs-shared/jest.config.ts
@@ -1,11 +1,10 @@
-/* eslint-disable */
export default {
- displayName: 'json-shared-type',
+ displayName: 'json-api-nestjs-shared',
preset: '../../../jest.preset.js',
testEnvironment: 'node',
transform: {
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }],
},
moduleFileExtensions: ['ts', 'js', 'html'],
- coverageDirectory: '../../../coverage/libs/json-api/json-shared-type',
+ coverageDirectory: '../../../coverage/libs/json-api/json-api-nestjs-shared',
};
diff --git a/libs/json-api/json-api-nestjs-shared/package.json b/libs/json-api/json-api-nestjs-shared/package.json
new file mode 100644
index 00000000..25918d9b
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "@klerick/json-api-nestjs-shared",
+ "version": "0.0.1",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "type": "commonjs",
+ "main": "./src/index.js",
+ "typings": "./src/index.d.ts"
+}
diff --git a/libs/json-api/json-api-nestjs-shared/project.json b/libs/json-api/json-api-nestjs-shared/project.json
new file mode 100644
index 00000000..cdb32619
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/project.json
@@ -0,0 +1,33 @@
+{
+ "name": "json-api-nestjs-shared",
+ "$schema": "../../../node_modules/nx/schemas/project-schema.json",
+ "sourceRoot": "libs/json-api/json-api-nestjs-shared/src",
+ "projectType": "library",
+ "release": {
+ "version": {
+ "generatorOptions": {
+ "packageRoot": "dist/{projectRoot}",
+ "currentVersionResolver": "git-tag"
+ }
+ }
+ },
+ "tags": [],
+ "targets": {
+ "build": {
+ "executor": "@nx/js:tsc",
+ "outputs": ["{options.outputPath}"],
+ "options": {
+ "outputPath": "dist/libs/json-api/json-api-nestjs-shared",
+ "tsConfig": "libs/json-api/json-api-nestjs-shared/tsconfig.lib.json",
+ "packageJson": "libs/json-api/json-api-nestjs-shared/package.json",
+ "main": "libs/json-api/json-api-nestjs-shared/src/index.ts",
+ "assets": ["libs/json-api/json-api-nestjs-shared/*.md"]
+ }
+ },
+ "nx-release-publish": {
+ "options": {
+ "packageRoot": "dist/{projectRoot}"
+ }
+ }
+ }
+}
diff --git a/libs/json-api/json-api-nestjs-shared/src/index.ts b/libs/json-api/json-api-nestjs-shared/src/index.ts
new file mode 100644
index 00000000..a0fe9b9f
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/index.ts
@@ -0,0 +1,2 @@
+export * from './lib/utils';
+export * from './lib/types';
diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts
new file mode 100644
index 00000000..5fbdd04f
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts
@@ -0,0 +1,17 @@
+export type EntityField =
+ | string
+ | number
+ | bigint
+ | boolean
+ | string[]
+ | number[]
+ | null
+ | Date;
+
+export type EntityProps = {
+ [P in keyof T]: T[P] extends EntityField ? P : never;
+}[keyof T];
+
+export type EntityRelation = {
+ [P in keyof T]: T[P] extends EntityField ? never : P;
+}[keyof T];
diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts
new file mode 100644
index 00000000..33b70ba6
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts
@@ -0,0 +1,4 @@
+export * from './utils-string.type';
+export * from './query-type';
+export * from './entity-type';
+export * from './response-body';
diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts
new file mode 100644
index 00000000..ddeead7a
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts
@@ -0,0 +1,36 @@
+export enum QueryField {
+ filter = 'filter',
+ sort = 'sort',
+ include = 'include',
+ page = 'page',
+ fields = 'fields',
+}
+
+export enum FilterOperand {
+ eq = 'eq',
+ gt = 'gt',
+ gte = 'gte',
+ like = 'like',
+ lt = 'lt',
+ lte = 'lte',
+ ne = 'ne',
+ regexp = 'regexp',
+ in = 'in',
+ nin = 'nin',
+ some = 'some',
+}
+
+export enum FilterOperandOnlyInNin {
+ in = 'in',
+ nin = 'nin',
+}
+export enum FilterOperandOnlySimple {
+ eq = 'eq',
+ gt = 'gt',
+ gte = 'gte',
+ like = 'like',
+ lt = 'lt',
+ lte = 'lte',
+ ne = 'ne',
+ regexp = 'regexp',
+}
diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts
new file mode 100644
index 00000000..85dbdb49
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts
@@ -0,0 +1,76 @@
+import {
+ EntityField,
+ EntityProps,
+ EntityRelation,
+ TypeOfArray,
+ ValueOf,
+} from '.';
+import { Collection } from '@mikro-orm/core';
+
+export type PageProps = {
+ totalItems: number;
+ pageNumber: number;
+ pageSize: number;
+};
+
+export type DebugMetaProps = Partial<{
+ time: number;
+}>;
+
+export type MainData = {
+ type: T;
+ id: string;
+};
+
+export type Links = {
+ self: string;
+ related?: string;
+};
+
+export type Attributes = {
+ [P in EntityProps]?: D[P] extends EntityField ? D[P] : TypeOfArray;
+};
+
+export type DataResult = E extends unknown[]
+ ? MainData[]
+ : E extends Collection
+ ? MainData[]
+ : MainData | null;
+
+export type Data = {
+ data?: DataResult;
+};
+
+export type Relationships = {
+ [P in EntityRelation]?: {
+ links: Links;
+ } & Data;
+};
+
+export type Include = ValueOf<{
+ [P in EntityRelation]: ResourceData>;
+}>;
+
+export type ResourceData = MainData & {
+ attributes?: Attributes;
+ relationships?: Relationships;
+ links: Omit;
+};
+
+export type MetaProps = R extends null ? T : T & R;
+
+export type ResourceObject<
+ T,
+ R extends 'object' | 'array' = 'object',
+ M = null
+> = {
+ meta: R extends 'array'
+ ? MetaProps
+ : MetaProps;
+ data: R extends 'array' ? ResourceData[] : ResourceData;
+ included?: Include[];
+};
+
+export type ResourceObjectRelationships> = {
+ meta: DebugMetaProps;
+} & Required>;
diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts
new file mode 100644
index 00000000..b861d238
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts
@@ -0,0 +1,26 @@
+import type { Collection } from '@mikro-orm/core';
+
+export type KebabCase = S extends `${infer C}${infer T}`
+ ? KebabCase extends infer U
+ ? U extends string
+ ? T extends Uncapitalize
+ ? `${Uncapitalize}${U}`
+ : `${Uncapitalize}-${U}`
+ : never
+ : never
+ : S;
+
+export type KebabToCamelCase =
+ S extends `${infer T}-${infer U}-${infer V}`
+ ? `${T}${Capitalize}${Capitalize>}`
+ : S extends `${infer T}-${infer U}`
+ ? `${Capitalize}${Capitalize>}`
+ : S;
+
+export type TypeOfArray = T extends (infer U)[]
+ ? U
+ : T extends Collection
+ ? U
+ : T;
+
+export type ValueOf = T[keyof T];
diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts
new file mode 100644
index 00000000..a7799257
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts
@@ -0,0 +1,2 @@
+export * from './string-utils';
+export * from './object-utils';
diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts
new file mode 100644
index 00000000..5d4ad26d
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts
@@ -0,0 +1,21 @@
+import { kebabToCamel } from './string-utils';
+
+export const ObjectTyped = {
+ keys: Object.keys as (yourObject: T) => Array,
+ values: Object.values as (yourObject: U) => Array,
+ entries: Object.entries as (
+ yourObject: O
+ ) => Array<[keyof O, O[keyof O]]>,
+ fromEntries: Object.fromEntries as (
+ yourObjectEntries: [K, V][]
+ ) => Record,
+};
+
+export function isObject(item: unknown): item is object {
+ return typeof item === 'object' && !Array.isArray(item) && item !== null;
+}
+
+export function createEntityInstance(name: string): E {
+ const entityName = kebabToCamel(name);
+ return Function('return new class ' + entityName + '{}')();
+}
diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts
new file mode 100644
index 00000000..4596cd21
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts
@@ -0,0 +1,42 @@
+import {
+ camelToKebab,
+ snakeToCamel,
+ isString,
+ kebabToCamel,
+} from './string-utils';
+
+describe('Test utils', () => {
+ it('camelToKebab', () => {
+ const result = camelToKebab('ApproverGroups');
+ const result1 = camelToKebab('Users');
+
+ expect(result).toBe('approver-groups');
+ expect(result1).toBe('users');
+ });
+
+ it('snakeToCamel', () => {
+ const result = snakeToCamel('test_test');
+ const result1 = snakeToCamel('test-test');
+ const result2 = snakeToCamel('testTest');
+ const result3 = snakeToCamel('event_incident_typeFK');
+ expect(result).toBe('testTest');
+ expect(result1).toBe('testTest');
+ expect(result2).toBe('testTest');
+ expect(result3).toBe('eventIncidentTypeFK');
+ });
+
+ it('isString', () => {
+ expect(isString('string')).toBe(true);
+ expect(isString(String('string'))).toBe(true);
+ expect(isString(new Date())).toBe(false);
+ expect(isString(class {})).toBe(false);
+ });
+
+ it('kebabToCamel', () => {
+ const type = 'users-group';
+ const type1 = 'users';
+
+ expect(kebabToCamel(type)).toBe('UsersGroup');
+ expect(kebabToCamel(type1)).toBe('Users');
+ });
+});
diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts
new file mode 100644
index 00000000..3b678710
--- /dev/null
+++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts
@@ -0,0 +1,38 @@
+import { KebabToCamelCase, KebabCase } from '../types';
+
+export function isString(value: T): value is P {
+ return typeof value === 'string' || value instanceof String;
+}
+
+export function snakeToCamel(str: string): string {
+ if (!str.match(/[\s_-]/g)) {
+ return str;
+ }
+ return str.replace(/([-_][a-z])/g, (group) =>
+ group.toUpperCase().replace('-', '').replace('_', '')
+ );
+}
+
+export function camelToKebab(string: S): KebabCase {
+ return string
+ .replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, '-$1')
+ .toLowerCase() as KebabCase;
+}
+
+export function upperFirstLetter(string: S): Capitalize {
+ return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize;
+}
+
+export function kebabToCamel(str: S): KebabToCamelCase {
+ return str
+ .split('-')
+ .map((i) => i.charAt(0).toUpperCase() + i.substring(1))
+ .join('') as KebabToCamelCase;
+}
+
+export function capitalizeFirstChar(str: string) {
+ return str
+ .split('-')
+ .map((i) => i.charAt(0).toUpperCase() + i.substring(1))
+ .join('');
+}
diff --git a/libs/json-api/json-shared-type/tsconfig.json b/libs/json-api/json-api-nestjs-shared/tsconfig.json
similarity index 81%
rename from libs/json-api/json-shared-type/tsconfig.json
rename to libs/json-api/json-api-nestjs-shared/tsconfig.json
index 8122543a..0dc79caa 100644
--- a/libs/json-api/json-shared-type/tsconfig.json
+++ b/libs/json-api/json-api-nestjs-shared/tsconfig.json
@@ -5,9 +5,9 @@
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
- "noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
- "noFallthroughCasesInSwitch": true
+ "noFallthroughCasesInSwitch": true,
+ "noPropertyAccessFromIndexSignature": true
},
"files": [],
"include": [],
diff --git a/libs/json-api/json-shared-type/tsconfig.lib.json b/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json
similarity index 50%
rename from libs/json-api/json-shared-type/tsconfig.lib.json
rename to libs/json-api/json-api-nestjs-shared/tsconfig.lib.json
index 4befa7f0..dbf54fd7 100644
--- a/libs/json-api/json-shared-type/tsconfig.lib.json
+++ b/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json
@@ -3,7 +3,13 @@
"compilerOptions": {
"outDir": "../../../dist/out-tsc",
"declaration": true,
- "types": ["node"]
+ "types": ["node"],
+ "target": "es2021",
+ "strictNullChecks": true,
+ "noImplicitAny": true,
+ "strictBindCallApply": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true
},
"include": ["src/**/*.ts"],
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
diff --git a/libs/json-api/json-shared-type/tsconfig.spec.json b/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json
similarity index 88%
rename from libs/json-api/json-shared-type/tsconfig.spec.json
rename to libs/json-api/json-api-nestjs-shared/tsconfig.spec.json
index 69a251f3..ab55b7c7 100644
--- a/libs/json-api/json-shared-type/tsconfig.spec.json
+++ b/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json
@@ -3,6 +3,7 @@
"compilerOptions": {
"outDir": "../../../dist/out-tsc",
"module": "commonjs",
+ "moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": [
diff --git a/libs/json-api/json-api-nestjs/.eslintrc.json b/libs/json-api/json-api-nestjs/.eslintrc.json
index ac1a6002..0af28030 100644
--- a/libs/json-api/json-api-nestjs/.eslintrc.json
+++ b/libs/json-api/json-api-nestjs/.eslintrc.json
@@ -1,6 +1,6 @@
{
- "extends": ["../../../.eslintrc.json"],
- "ignorePatterns": ["!**/*", "**/*.spec.ts"],
+ "extends": ["../../../.eslintrc.base.json"],
+ "ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
@@ -18,7 +18,12 @@
"files": ["*.json"],
"parser": "jsonc-eslint-parser",
"rules": {
- "@nx/dependency-checks": "error"
+ "@nx/dependency-checks": [
+ "error",
+ {
+ "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"]
+ }
+ ]
}
}
]
diff --git a/libs/json-api/json-api-nestjs/README.md b/libs/json-api/json-api-nestjs/README.md
index cba8c946..ffa4bf6a 100644
--- a/libs/json-api/json-api-nestjs/README.md
+++ b/libs/json-api/json-api-nestjs/README.md
@@ -8,8 +8,8 @@
# json-api-nestjs
-This plugin works upon TypeOrm library, which is used as the main database abstraction layer tool. The module
-automatically generates an API according to JSON API specification from the database structure (TypeORM entities). It
+This plugin works upon **TypeOrm** or **MicroOrm** library, which is used as the main database abstraction layer tool. The module
+automatically generates an API according to JSON API specification from the database structure (**TypeOrm** or **MicroOrm** entities). It
supports features such as requests validation based on database fields types, request filtering, endpoints extending,
data relations control and much more. Our module significantly reduces the development time of REST services by removing
the need to negotiate the mechanism of client-server interaction and implementing automatic API generation without the
@@ -24,15 +24,32 @@ $ npm install json-api-nestjs
## Example
Once the installation process is complete, we can import the **JsonApiModule** into the root **AppModule**.
+### TypeOrm
+```typescript
+import {Module} from '@nestjs/common';
+import {JsonApiModule, TypeOrmJsonApiModule} from 'json-api-nestjs';
+import {Users} from 'type-orm/database';
+@Module({
+ imports: [
+ JsonApiModule.forRoot(TypeOrmJsonApiModule, {
+ entities: [Users]
+ }),
+ ],
+})
+export class AppModule {
+}
+```
+
+### MicroOrm
```typescript
import {Module} from '@nestjs/common';
-import {JsonApiModule} from 'json-api-nestjs';
-import {Users} from 'database';
+import {JsonApiModule, MicroOrmJsonApiModule} from 'json-api-nestjs';
+import {Users} from 'micro-orm/database';
@Module({
imports: [
- JsonApiModule.forRoot({
+ JsonApiModule.forRoot(MicroOrmJsonApiModule, {
entities: [Users]
}),
],
@@ -69,11 +86,14 @@ export interface ModuleOptions {
debug?: boolean; // Debug info in result object, like error message
pipeForId?: Type // Nestjs pipe for validate id params, by default ParseIntPipe
operationUrl?: string // Url for atomic operation https://jsonapi.org/ext/atomic/
+ // TypeOrm
useSoftDelete?: boolean // Use soft delete
runInTransaction?: any>(
isolationLevel: IsolationLevel,
fn: Func
) => ReturnType // You can use cutom function for wrapping transaction in atomic operation, example: runInTransaction from https://github.com/Aliheym/typeorm-transactional
+ // MicroOrm
+ arrayType?: string[]; //Custom type for indicate of array
};
}
```
@@ -254,7 +274,7 @@ Available query params:
```typescript
type FilterOperand
{
-in:string[] // is equal to the conditional of query "WHERE 'attribute_name' IN ('value1', 'value2')"
+ in:string[] // is equal to the conditional of query "WHERE 'attribute_name' IN ('value1', 'value2')"
nin: string[] // is equal to the conditional of query "WHERE 'attribute_name' NOT IN ('value1', 'value1')"
eq: string // is equal to the conditional of query "WHERE 'attribute_name' = 'value1'
ne: string // is equal to the conditional of query "WHERE 'attribute_name' <> 'value1'
diff --git a/libs/json-api/json-api-nestjs/package.json b/libs/json-api/json-api-nestjs/package.json
index 32a4b080..b2231f27 100644
--- a/libs/json-api/json-api-nestjs/package.json
+++ b/libs/json-api/json-api-nestjs/package.json
@@ -27,10 +27,24 @@
"jsonapi",
"json-api",
"typeorm",
+ "microorm",
"CRUD"
],
"peerDependencies": {
"reflect-metadata": "^0.1.13",
- "tslib": "^2.3.0"
+ "tslib": "^2.3.0",
+ "@mikro-orm/core": "^6.0.0 || ^6.0.0-dev.0",
+ "@nestjs/common": "^10.0.0",
+ "@nestjs/core": "^10.0.0",
+ "@nestjs/swagger": "^7.3.0",
+ "@nestjs/typeorm": "^10.0.0",
+ "@mikro-orm/knex": "^6.0.0",
+ "typeorm": "^0.3.20"
+ },
+ "dependencies": {
+ "@anatine/zod-openapi": "^2.0.0",
+ "zod": "^3.24.0",
+ "zod-validation-error": "^3.4.0",
+ "uuid": "^10.0.0"
}
}
diff --git a/libs/json-api/json-api-nestjs/project.json b/libs/json-api/json-api-nestjs/project.json
index f0cb4555..ad65b72e 100644
--- a/libs/json-api/json-api-nestjs/project.json
+++ b/libs/json-api/json-api-nestjs/project.json
@@ -3,47 +3,72 @@
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/json-api/json-api-nestjs/src",
"projectType": "library",
+ "release": {
+ "version": {
+ "generatorOptions": {
+ "packageRoot": "dist/{projectRoot}",
+ "currentVersionResolver": "git-tag"
+ }
+ }
+ },
+ "tags": [],
"targets": {
- "build-ts": {
+ "build": {
"executor": "@nx/js:tsc",
- "outputs": ["{options.outputPath}"],
+ "outputs": [
+ "{options.outputPath}"
+ ],
"options": {
"outputPath": "dist/libs/json-api/json-api-nestjs",
- "main": "libs/json-api/json-api-nestjs/src/index.ts",
"tsConfig": "libs/json-api/json-api-nestjs/tsconfig.lib.json",
- "assets": ["libs/json-api/json-api-nestjs/README.md"],
- "external": "none",
- "updateBuildableProjectDepsInPackageJson": true,
+ "packageJson": "libs/json-api/json-api-nestjs/package.json",
+ "main": "libs/json-api/json-api-nestjs/src/index.ts",
+ "assets": [
+ "libs/json-api/json-api-nestjs/*.md"
+ ],
"buildableProjectDepsInPackageJsonType": "peerDependencies",
"generateExportsField": true
}
},
- "build": {
- "executor": "nx:run-commands",
- "dependsOn": [
- "build-ts"
+ "build-npm": {
+ "executor": "@nx/js:tsc",
+ "outputs": [
+ "{options.outputPath}"
],
"options": {
- "commands": ["rm -rf dist/libs/json-api/json-api-nestjs/libs"],
- "cwd": "./",
- "parallel": false
+ "outputPath": "node_modules/@klerick/json-api-nestjs",
+ "tsConfig": "libs/json-api/json-api-nestjs/tsconfig.lib.json",
+ "packageJson": "libs/json-api/json-api-nestjs/package.json",
+ "main": "libs/json-api/json-api-nestjs/src/index.ts",
+ "assets": [
+ "libs/json-api/json-api-nestjs/*.md"
+ ],
+ "buildableProjectDepsInPackageJsonType": "peerDependencies",
+ "generateExportsField": true
+ }
+ },
+ "nx-release-publish": {
+ "options": {
+ "packageRoot": "dist/{projectRoot}"
}
},
"publish": {
"command": "node tools/scripts/publish.mjs json-api-nestjs {args.ver} {args.tag}",
- "dependsOn": ["build"]
- },
- "lint": {
- "executor": "@nx/eslint:lint",
- "outputs": ["{options.outputFile}"]
+ "dependsOn": [
+ "build"
+ ]
},
"test": {
"executor": "@nx/jest:jest",
- "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
+ "outputs": [
+ "{workspaceRoot}/coverage/{projectRoot}"
+ ],
"options": {
"jestConfig": "libs/json-api/json-api-nestjs/jest.config.ts",
"codeCoverage": true,
- "coverageReporters": ["json-summary"]
+ "coverageReporters": [
+ "json-summary"
+ ]
}
},
"upload-badge": {
@@ -54,17 +79,13 @@
}
],
"options": {
- "commands": ["node tools/scripts/upload-badge.mjs json-api-nestjs"],
+ "commands": [
+ "node tools/scripts/upload-badge.mjs json-api-nestjs"
+ ],
"cwd": "./",
"parallel": false,
"outputPath": "{workspaceRoot}/libs/json-api/json-api-nestjs"
}
- },
- "nx-release-publish": {
- "options": {
- "packageRoot": "dist/libs/json-api/json-api-nestjs"
- }
}
- },
- "tags": []
+ }
}
diff --git a/libs/json-api/json-api-nestjs/src/index.ts b/libs/json-api/json-api-nestjs/src/index.ts
index 1a4e1274..fc0b6e76 100644
--- a/libs/json-api/json-api-nestjs/src/index.ts
+++ b/libs/json-api/json-api-nestjs/src/index.ts
@@ -1,19 +1,24 @@
export { JsonApiModule } from './lib/json-api.module';
-export { InjectService, JsonApi } from './lib/decorators';
-export {
- EntityRelation,
- TypeormService as JsonApiService,
- ResourceObject,
- ResourceObjectRelationships,
-} from './lib/types';
-export { JsonBaseController } from './lib/mixin/controller/json-base.controller';
+export { TypeOrmJsonApiModule, MicroOrmJsonApiModule } from './lib/modules';
+
+export { JsonApi, InjectService } from './lib/modules/mixin/decorators';
+export { OrmService as JsonApiService } from './lib/modules/mixin/types';
+export { JsonBaseController } from './lib/modules/mixin/controller/json-base.controller';
export {
Query,
PatchData,
PostData,
PostRelationshipData,
PatchRelationshipData,
+ QueryOne,
+} from './lib/modules/mixin/zod';
+
+export {
+ EntityRelation,
+ ResourceObject,
+ ResourceObjectRelationships,
QueryField,
-} from './lib/helper/zod';
-export { excludeMethod } from './lib/config/bindings';
-export { entityForClass } from './lib/helper/utils';
+} from './lib/utils/nestjs-shared';
+
+export { excludeMethod } from './lib/modules/mixin/config/bindings';
+export { entityForClass } from './lib/utils';
diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/default.ts b/libs/json-api/json-api-nestjs/src/lib/constants/default.ts
new file mode 100644
index 00000000..de75ca27
--- /dev/null
+++ b/libs/json-api/json-api-nestjs/src/lib/constants/default.ts
@@ -0,0 +1,4 @@
+export const DEFAULT_CONNECTION_NAME = 'default';
+
+export const DEFAULT_QUERY_PAGE = 1;
+export const DEFAULT_PAGE_SIZE = 20;
diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/defaults.ts b/libs/json-api/json-api-nestjs/src/lib/constants/defaults.ts
deleted file mode 100644
index 627c7834..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/constants/defaults.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { ParseIntPipe } from '@nestjs/common';
-import { ConfigParam } from '../types';
-
-export const DESC = 'DESC';
-export const ASC = 'ASC';
-
-export const SORT_TYPE = [DESC, ASC] as const;
-
-export const DEFAULT_QUERY_PAGE = 1;
-export const DEFAULT_PAGE_SIZE = 20;
-export const DEFAULT_CONNECTION_NAME = 'default';
-
-export const TYPEORM_SERVICE_PROPS = Symbol('typeormService');
-
-export const SUB_QUERY_ALIAS_FOR_PAGINATION = 'subQueryWithLimitOffset';
-export const ALIAS_FOR_PAGINATION = 'aliasForPagination';
-
-export const ConfigParamDefault: ConfigParam = {
- debug: true,
- requiredSelectField: true,
- pipeForId: ParseIntPipe,
- useSoftDelete: false,
-};
diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/di.ts b/libs/json-api/json-api-nestjs/src/lib/constants/di.ts
new file mode 100644
index 00000000..2d70e17d
--- /dev/null
+++ b/libs/json-api/json-api-nestjs/src/lib/constants/di.ts
@@ -0,0 +1,32 @@
+export const CURRENT_ENTITY_MANAGER_TOKEN = Symbol(
+ 'CURRENT_ENTITY_MANAGER_TOKEN'
+);
+export const GLOBAL_MODULE_OPTIONS_TOKEN = Symbol('GLOBAL_MODULE_OPTIONS');
+export const ORM_SERVICE = Symbol('ORM_SERVICE');
+export const ORM_SERVICE_PROPS = Symbol('ORM_SERVICE_PROPS');
+
+export const PARAMS_FOR_ZOD_SCHEMA = Symbol('PARAMS_FOR_ZOD_SCHEMA');
+export const FIELD_FOR_ENTITY = Symbol('FIELD_FOR_ENTITY');
+export const CONTROL_OPTIONS_TOKEN = Symbol('CONTROL_OPTIONS_TOKEN');
+export const RUN_IN_TRANSACTION_FUNCTION = Symbol(
+ 'RUN_IN_TRANSACTION_FUNCTION'
+);
+
+export const CURRENT_ENTITY = Symbol('CURRENT_ENTITY');
+export const FIND_ONE_ROW_ENTITY = Symbol('FIND_ONE_ROW_ENTITY');
+export const CHECK_RELATION_NAME = Symbol('CHECK_RELATION_NAME');
+
+export const ZOD_INPUT_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA');
+export const ZOD_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA');
+export const ZOD_POST_SCHEMA = Symbol('ZOD_POST_SCHEMA');
+export const ZOD_PATCH_SCHEMA = Symbol('ZOD_PATCH_SCHEMA');
+export const ZOD_POST_RELATIONSHIP_SCHEMA = Symbol(
+ 'ZOD_POST_RELATIONSHIP_SCHEMA'
+);
+export const ZOD_PATCH_RELATIONSHIP_SCHEMA = Symbol(
+ 'ZOD_PATCH_RELATIONSHIP_SCHEMA'
+);
+export const CURRENT_DATA_SOURCE_TOKEN = Symbol('CURRENT_DATA_SOURCE_TOKEN');
+export const CURRENT_ENTITY_REPOSITORY = Symbol('CURRENT_ENTITY_REPOSITORY');
+
+export const ENTITY_MAP_PROPS = Symbol('ENTITY_MAP_PROPS');
diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/constants/index.ts
index 40c2a13a..83b9d181 100644
--- a/libs/json-api/json-api-nestjs/src/lib/constants/index.ts
+++ b/libs/json-api/json-api-nestjs/src/lib/constants/index.ts
@@ -1,3 +1,14 @@
-export * from './defaults';
+export * from './default';
+export * from './di';
export * from './reflection';
-export * from './postfix';
+
+export const JSON_API_CONTROLLER_POSTFIX = 'JsonApiController';
+export const JSON_API_MODULE_POSTFIX = 'JsonApiModule';
+
+export const PARAMS_RESOURCE_ID = 'id';
+export const PARAMS_RELATION_ID = 'relId';
+export const PARAMS_RELATION_NAME = 'relName';
+
+export const DESC = 'DESC';
+export const ASC = 'ASC';
+export const SORT_TYPE = [DESC, ASC] as const;
diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/postfix.ts b/libs/json-api/json-api-nestjs/src/lib/constants/postfix.ts
deleted file mode 100644
index 0086dee1..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/constants/postfix.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export const JSON_API_SERVICE_POSTFIX = 'JsonApiService';
-export const CONFIG_PARAM_POSTFIX = 'JsonApiConfigParam';
-export const JSON_API_CONTROLLER_POSTFIX = 'JsonApiController';
-export const JSON_API_MODULE_POSTFIX = 'JsonApiModule';
-export const TYPEORM_UTILS_SERVICE_POSTFIX = 'TypeormUtilsService';
-export const TYPEORM_MIXIN_SERVICE_POSTFIX = 'JsonApiTypeormService';
-export const TRANSFORM_MIXIN_SERVICE_POSTFIX = 'JsonApiTransformService';
diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/reflection.ts b/libs/json-api/json-api-nestjs/src/lib/constants/reflection.ts
index 06af80da..6656d32f 100644
--- a/libs/json-api/json-api-nestjs/src/lib/constants/reflection.ts
+++ b/libs/json-api/json-api-nestjs/src/lib/constants/reflection.ts
@@ -1,24 +1,2 @@
export const JSON_API_DECORATOR_ENTITY = Symbol('JSON_API_ENTITY');
export const JSON_API_DECORATOR_OPTIONS = Symbol('JSON_API_OPTIONS');
-export const GLOBAL_MODULE_OPTIONS_TOKEN = Symbol('GLOBAL_MODULE_OPTIONS');
-export const CURRENT_DATA_SOURCE_TOKEN = Symbol('CURRENT_DATA_SOURCE_TOKEN');
-export const CURRENT_ENTITY_REPOSITORY = Symbol('CURRENT_ENTITY_REPOSITORY');
-export const ZOD_INPUT_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA');
-export const ZOD_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA');
-export const ZOD_POST_SCHEMA = Symbol('ZOD_POST_SCHEMA');
-export const SWAGGER_METHOD = Symbol('SWAGGER_METHOD');
-export const ZOD_POST_RELATIONSHIP_SCHEMA = Symbol(
- 'ZOD_POST_RELATIONSHIP_SCHEMA'
-);
-export const ZOD_PATCH_RELATIONSHIP_SCHEMA = Symbol(
- 'ZOD_PATCH_RELATIONSHIP_SCHEMA'
-);
-export const ZOD_PATCH_SCHEMA = Symbol('ZOD_PATCH_SCHEMA');
-export const TYPEORM_SERVICE = Symbol('TYPEORM_SERVICE');
-export const CONTROL_OPTIONS_TOKEN = Symbol('CONTROL_OPTIONS_TOKEN');
-
-export const PARAMS_RESOURCE_ID = 'id';
-export const PARAMS_RELATION_ID = 'relId';
-export const PARAMS_RELATION_NAME = 'relName';
-
-export const JSON_API_CONFIG = 'JSON_API_CONFIG';
diff --git a/libs/json-api/json-api-nestjs/src/lib/factory/data-source.factory.ts b/libs/json-api/json-api-nestjs/src/lib/factory/data-source.factory.ts
deleted file mode 100644
index 4d284072..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/factory/data-source.factory.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { FactoryProvider } from '@nestjs/common';
-import { DataSource } from 'typeorm';
-import { CURRENT_DATA_SOURCE_TOKEN } from '../constants';
-import { getDataSourceToken } from '@nestjs/typeorm';
-
-export function CurrentDataSourceProvider(
- connectionName?: string
-): FactoryProvider {
- return {
- provide: CURRENT_DATA_SOURCE_TOKEN,
- useFactory: (dataSource: DataSource) => dataSource,
- inject: [getDataSourceToken(connectionName)],
- };
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/factory/entity-repository.factory.ts b/libs/json-api/json-api-nestjs/src/lib/factory/entity-repository.factory.ts
deleted file mode 100644
index 7903f4e6..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/factory/entity-repository.factory.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { FactoryProvider } from '@nestjs/common';
-import { DataSource, Repository } from 'typeorm';
-
-import { Entity } from '../types';
-import {
- CURRENT_DATA_SOURCE_TOKEN,
- CURRENT_ENTITY_REPOSITORY,
-} from '../constants';
-import { EntityTarget } from 'typeorm/common/EntityTarget';
-
-export function EntityRepositoryFactory(
- entity: E
-): FactoryProvider> {
- return {
- provide: CURRENT_ENTITY_REPOSITORY,
- useFactory: (dataSource: DataSource) =>
- dataSource.getRepository(entity as EntityTarget),
- inject: [
- {
- token: CURRENT_DATA_SOURCE_TOKEN,
- optional: false,
- },
- ],
- };
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/factory/index.ts b/libs/json-api/json-api-nestjs/src/lib/factory/index.ts
deleted file mode 100644
index b529e2bf..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/factory/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export * from './zod-validate.factory';
-export * from './data-source.factory';
-export * from './typeorm-service.factory';
-export * from './entity-repository.factory';
-export * from './swagger-bind-method';
diff --git a/libs/json-api/json-api-nestjs/src/lib/factory/swagger-bind-method.ts b/libs/json-api/json-api-nestjs/src/lib/factory/swagger-bind-method.ts
deleted file mode 100644
index 0ab682cc..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/factory/swagger-bind-method.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { ValueProvider } from '@nestjs/common';
-import { SwaggerMethod, swaggerMethod } from '../helper/swagger/method';
-import { SWAGGER_METHOD } from '../constants';
-
-export const SwaggerBindMethod: ValueProvider = {
- provide: SWAGGER_METHOD,
- useValue: swaggerMethod,
-};
diff --git a/libs/json-api/json-api-nestjs/src/lib/factory/typeorm-service.factory.ts b/libs/json-api/json-api-nestjs/src/lib/factory/typeorm-service.factory.ts
deleted file mode 100644
index 28304051..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/factory/typeorm-service.factory.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import { FactoryProvider } from '@nestjs/common';
-import { DataSource, Repository } from 'typeorm';
-
-import {
- ConfigParam,
- Entity,
- TypeormService,
- TypeormServiceObject,
-} from '../types';
-import {
- CONFIG_PARAM_POSTFIX,
- TYPEORM_UTILS_SERVICE_POSTFIX,
- CURRENT_DATA_SOURCE_TOKEN,
- TYPEORM_SERVICE,
- CURRENT_ENTITY_REPOSITORY,
- CONTROL_OPTIONS_TOKEN,
-} from '../constants';
-
-import {
- getEntityName,
- getProviderName,
- MethodsService,
- ObjectTyped,
-} from '../helper';
-import { TypeormUtilsService } from '../service';
-import { TransformDataService } from '../mixin/service';
-
-function guardMethodsServiceName(
- methodsService: R,
- key: any
-): asserts key is keyof R {
- if (!(key in methodsService))
- throw new Error(`${key} is not methode of MethodsService`);
-}
-
-export function TypeormServiceFactory(
- entity: E
-): FactoryProvider> {
- const entityName = getEntityName(entity as any);
- return {
- provide: TYPEORM_SERVICE,
- inject: [
- {
- token: CURRENT_ENTITY_REPOSITORY,
- optional: false,
- },
- {
- token: CONTROL_OPTIONS_TOKEN,
- optional: false,
- },
- TypeormUtilsService,
- TransformDataService,
- ],
- useFactory: (
- repository: Repository,
- config: ConfigParam,
- typeormUtilsService: TypeormUtilsService,
- transformDataService: TransformDataService
- ) => {
- const typeOrmObject: TypeormServiceObject = {
- repository,
- config,
- typeormUtilsService,
- transformDataService,
- };
-
- const bindMethods = ObjectTyped.entries(MethodsService).reduce(
- (acum, [key, val]) => ({
- ...acum,
- [key]: (val as any).bind(typeOrmObject) as typeof val,
- }),
- {} as typeof MethodsService
- );
-
- const target = {} as TypeormService;
- return new Proxy>(target, {
- get(target: {}, p: string | symbol, receiver: any): any {
- try {
- guardMethodsServiceName(bindMethods, p);
- return bindMethods[p];
- } catch (e) {
- return undefined;
- }
- },
- });
- },
- };
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/factory/zod-validate.factory.ts b/libs/json-api/json-api-nestjs/src/lib/factory/zod-validate.factory.ts
deleted file mode 100644
index 52952be5..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/factory/zod-validate.factory.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import { DataSource, Repository } from 'typeorm';
-import { Entity, ModuleOptions } from '../types';
-import { FactoryProvider, ValueProvider } from '@nestjs/common';
-import {
- ZodInputQuerySchema,
- zodInputQuerySchema,
- ZodQuerySchema,
- zodQuerySchema,
- zodInputPostSchema,
- ZodInputPostSchema,
- zodInputPatchSchema,
- ZodInputPatchSchema,
- ZodInputPostRelationshipSchema as ZodInputPostRelationshipSchemaType,
- ZodInputPatchRelationshipSchema as ZodInputPatchRelationshipSchemaType,
- zodInputPostRelationshipSchema,
- zodInputPatchRelationshipSchema,
-} from '../helper/zod';
-import {
- CURRENT_DATA_SOURCE_TOKEN,
- ZOD_INPUT_QUERY_SCHEMA,
- ZOD_POST_SCHEMA,
- ZOD_PATCH_SCHEMA,
- ZOD_POST_RELATIONSHIP_SCHEMA,
- ZOD_PATCH_RELATIONSHIP_SCHEMA,
- ZOD_QUERY_SCHEMA,
-} from '../constants';
-
-import { EntityTarget } from 'typeorm/common/EntityTarget';
-
-export function ZodInputQuerySchema(
- entity: E
-): FactoryProvider> {
- return {
- provide: ZOD_INPUT_QUERY_SCHEMA,
- inject: [
- {
- token: CURRENT_DATA_SOURCE_TOKEN,
- optional: false,
- },
- ],
- useFactory: (dataSource: DataSource) =>
- zodInputQuerySchema(
- dataSource.getRepository(entity as EntityTarget)
- ),
- };
-}
-
-export function ZodQuerySchema(
- entity: E
-): FactoryProvider> {
- return {
- provide: ZOD_QUERY_SCHEMA,
- inject: [
- {
- token: CURRENT_DATA_SOURCE_TOKEN,
- optional: false,
- },
- ],
- useFactory: (dataSource: DataSource) =>
- zodQuerySchema(dataSource.getRepository(entity as EntityTarget)),
- };
-}
-
-export function ZodInputPostSchema(
- entity: E
-): FactoryProvider> {
- return {
- provide: ZOD_POST_SCHEMA,
- inject: [
- {
- token: CURRENT_DATA_SOURCE_TOKEN,
- optional: false,
- },
- ],
- useFactory: (dataSource: DataSource) =>
- zodInputPostSchema(
- dataSource.getRepository(entity as EntityTarget)
- ),
- };
-}
-
-export function ZodInputPatchSchema(
- entity: E
-): FactoryProvider> {
- return {
- provide: ZOD_PATCH_SCHEMA,
- inject: [
- {
- token: CURRENT_DATA_SOURCE_TOKEN,
- optional: false,
- },
- ],
- useFactory: (dataSource: DataSource) =>
- zodInputPatchSchema(
- dataSource.getRepository(entity as EntityTarget)
- ),
- };
-}
-
-export const ZodInputPostRelationshipSchema: ValueProvider =
- {
- provide: ZOD_POST_RELATIONSHIP_SCHEMA,
- useValue: zodInputPostRelationshipSchema,
- };
-
-export const ZodInputPatchRelationshipSchema: ValueProvider =
- {
- provide: ZOD_PATCH_RELATIONSHIP_SCHEMA,
- useValue: zodInputPatchRelationshipSchema,
- };
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/error-database/index.ts b/libs/json-api/json-api-nestjs/src/lib/helper/error-database/index.ts
deleted file mode 100644
index 07ef1b42..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/error-database/index.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { EntityMetadata } from 'typeorm';
-import { ValidateQueryError } from '../../types';
-
-import { formErrorString } from './utils';
-import {
- BadRequestException,
- ConflictException,
- NotAcceptableException,
-} from '@nestjs/common';
-
-const fieldNotNullOrDefault = (
- entityMetadata: EntityMetadata,
- errorText: string,
- detail?: string
-) => {
- const error: ValidateQueryError = {
- code: 'invalid_arguments',
- message: formErrorString(entityMetadata, errorText),
- path: ['data', 'attributes'],
- };
-
- return new BadRequestException([error]);
-};
-
-const duplicateItems = (
- entityMetadata: EntityMetadata,
- errorText: string,
- detail?: string
-) => {
- errorText = 'Duplicate value';
- if (detail) {
- const matches = detail.match(/(?<=\().+?(?=\))/gm);
- if (matches) {
- errorText = `Duplicate value in the "${matches[0]}"`;
- }
- }
-
- const error: ValidateQueryError = {
- code: 'invalid_arguments',
- message: detail ? formErrorString(entityMetadata, errorText) : errorText,
- path: ['data', 'attributes'],
- };
-
- return new ConflictException([error]);
-};
-
-const invalidInputSyntax = (
- entityMetadata: EntityMetadata,
- errorText: string,
- detail?: string
-) => {
- const error: ValidateQueryError = {
- code: 'invalid_arguments',
- message: errorText,
- path: [],
- };
- return new BadRequestException([error]);
-};
-
-const entityHasRelation = (
- entityMetadata: EntityMetadata,
- errorText: string,
- detail?: string
-) => {
- const error: ValidateQueryError = {
- code: 'invalid_arguments',
- message: detail || errorText,
- path: ['data', 'attributes'],
- };
- return new NotAcceptableException([error]);
-};
-
-export const MysqlError = {
- [1364]: fieldNotNullOrDefault,
- [1062]: duplicateItems,
- [1525]: invalidInputSyntax,
-};
-
-export const PostgresError = {
- [23502]: fieldNotNullOrDefault,
- [23505]: duplicateItems,
- ['22P02']: invalidInputSyntax,
- [22007]: invalidInputSyntax,
- [22003]: invalidInputSyntax,
- [23503]: entityHasRelation,
-};
-
-export type PostgresErrorCode = keyof typeof PostgresError;
-export type MysqlErrorCode = keyof typeof MysqlError;
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/error-database/utils.spec.ts b/libs/json-api/json-api-nestjs/src/lib/helper/error-database/utils.spec.ts
deleted file mode 100644
index 7fe1e600..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/error-database/utils.spec.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { formErrorString } from './utils';
-
-const metadata = {
- tableName: 'users',
- name: 'Users',
- columns: [
- {
- databaseName: 'created_at',
- propertyName: 'createdAt',
- },
- {
- databaseName: 'addresses_id',
- propertyName: 'addresses',
- },
- ],
-} as any;
-
-describe('utils', () => {
- it('formErrorString', () => {
- const result = formErrorString(
- metadata,
- `null value in column "${metadata.columns[1].propertyName}" of relation "${metadata.tableName}" violates not-null constraint`
- );
- expect(result).toBe(
- `null value in column "${metadata.columns[1].propertyName}" of relation "${metadata.name}" violates not-null constraint`
- );
- });
-});
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/error-database/utils.ts b/libs/json-api/json-api-nestjs/src/lib/helper/error-database/utils.ts
deleted file mode 100644
index 06e0f01a..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/error-database/utils.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { EntityMetadata } from 'typeorm';
-
-export const formErrorString = (
- entityMetadata: EntityMetadata,
- errorText: string
-) => {
- for (const column of entityMetadata.columns) {
- const result = new RegExp(column.databaseName).test(errorText);
- if (!result) continue;
-
- errorText = errorText.replace(column.databaseName, column.propertyName);
- }
- return errorText.replace(entityMetadata.tableName, entityMetadata.name);
-};
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/index.ts b/libs/json-api/json-api-nestjs/src/lib/helper/index.ts
deleted file mode 100644
index de801b8a..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export * from './utils';
-export * from './bind-controller';
-export * from './create-controller';
-export * from './zod/zod-helper';
-export * from './swagger';
-export { MethodsService } from './orm';
-export * from './error-database';
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/orm/index.ts b/libs/json-api/json-api-nestjs/src/lib/helper/orm/index.ts
deleted file mode 100644
index b687d4dd..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/orm/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './orm-helper';
-export * from './orm-type-asserts';
-export * from './methods';
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/orm/methods/index.ts b/libs/json-api/json-api-nestjs/src/lib/helper/orm/methods/index.ts
deleted file mode 100644
index 866c347a..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/orm/methods/index.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { getAll } from './get-all/get-all';
-import { getOne } from './get-one/get-one';
-import { deleteOne } from './delete-one/delete-one';
-import { postOne } from './post-one/post-one';
-import { patchOne } from './patch-one/patch-one';
-import { getRelationship } from './get-relationship/get-relationship';
-import { postRelationship } from './post-relationship/post-relationship';
-import { deleteRelationship } from './delete-relationship/delete-relationship';
-import { patchRelationship } from './patch-relationship/patch-relationship';
-import { Entity, EntityRelation } from '../../../types';
-
-export const MethodsService = {
- getAll,
- getOne,
- deleteOne,
- postOne,
- patchOne,
- getRelationship,
- postRelationship,
- deleteRelationship,
- patchRelationship,
-};
-
-export type MethodsService = {
- getAll: (
- ...arg: Parameters>
- ) => ReturnType>;
- getOne: (
- ...arg: Parameters>
- ) => ReturnType>;
- deleteOne: (
- ...arg: Parameters>
- ) => ReturnType>;
- postOne: (
- ...arg: Parameters>
- ) => ReturnType>;
- patchOne: (
- ...arg: Parameters>
- ) => ReturnType>;
- getRelationship: >(
- ...arg: Parameters>
- ) => ReturnType>;
- postRelationship: >(
- ...arg: Parameters>
- ) => ReturnType>;
- deleteRelationship: >(
- ...arg: Parameters>
- ) => ReturnType>;
- patchRelationship: >(
- ...arg: Parameters>
- ) => ReturnType>;
-};
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/orm/orm-type-asserts.ts b/libs/json-api/json-api-nestjs/src/lib/helper/orm/orm-type-asserts.ts
deleted file mode 100644
index 779f339d..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/orm/orm-type-asserts.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Entity } from '../../types';
-import {
- PropsNameResultField,
- PropertyTarget,
-} from './orm-helper';
-
-export function guardKeyForPropertyTarget<
- E extends Entity,
- For extends PropsNameResultField,
- R extends PropertyTarget
->(relationsTargets: R, key: any): asserts key is keyof R {
- if (!(key in relationsTargets)) throw new Error('Type guard error');
-}
-
-export function guardIsKeyOfObject(
- object: R,
- key: string | number | symbol
-): asserts key is keyof R {
- if (typeof object === 'object' && object !== null && key in object)
- return void 0;
-
- throw new Error('Type guard error');
-}
-
-export function guardIsArray(input: T|Array): input is Array{
- return Array.isArray(input)
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/index.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/index.ts
deleted file mode 100644
index e0bff43c..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/index.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-// import { Type } from '@nestjs/common';
-// import { DECORATORS } from '@nestjs/swagger/dist/constants';
-// import { ApiTags, ApiExtraModels } from '@nestjs/swagger';
-// // import { camelToKebab, ObjectTyped } from '../utils';
-// // import { FilterOperand } from './filter-operand-model';
-// // import { JSON_API_DECORATOR_OPTIONS } from '../../constants';
-// // import { DecoratorOptions, Entity, MethodName, ConfigParam } from '../../types';
-// import { Bindings } from '../../config/bindings';
-// import { swaggerMethod } from './method';
-// // import { createApiModels } from './utils';
-//
-// import { Entity, ConfigParam } from '../../types';
-// import { ObjectTyped } from '../utils';
-//
-// export function setSwaggerDecorator(
-// controller: Type,
-// entity: Entity,
-// config: ConfigParam
-// ) {
-// // const apiTag = Reflect.getMetadata(DECORATORS.API_TAGS, controller);
-// // if (!apiTag) {
-// // const entityName =
-// // entity instanceof Function ? entity.name : entity.options.name;
-// //
-// // ApiTags(config?.['overrideRoute'] || `${camelToKebab(entityName)}`)(
-// // controller
-// // );
-// // }
-// // ApiExtraModels(FilterOperand)(controller);
-// // ApiExtraModels(createApiModels(entity))(controller);
-// //
-// // const decoratorOptions: DecoratorOptions = Reflect.getMetadata(
-// // JSON_API_DECORATOR_OPTIONS,
-// // controller
-// // );
-// //
-// for (const method of ObjectTyped.keys(Bindings)) {
-// // if (decoratorOptions) {
-// // const { allowMethod = Object.keys(Bindings) } = decoratorOptions;
-// //
-// // if (!allowMethod.includes(method as MethodName)) {
-// // continue;
-// // }
-// // }
-// //
-// if (method in swaggerMethod) {
-// swaggerMethod[method](controller, entity, Bindings[method], config);
-// }
-// }
-// }
-
-export * from './method';
-export * from './filter-operand-model';
-export { createApiModels } from './utils';
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/delete-one.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/delete-one.ts
deleted file mode 100644
index 0d0b7f73..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/delete-one.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { ApiParam, ApiOperation, ApiResponse } from '@nestjs/swagger';
-import { ParseIntPipe, Type } from '@nestjs/common';
-import { Repository } from 'typeorm';
-
-import { Binding, Entity, ConfigParam } from '../../../types';
-import { errorSchema } from '../utils';
-
-export function deleteOne(
- controller: Type,
- repository: Repository,
- binding: Binding<'deleteOne'>,
- config: ConfigParam
-) {
- const entityName = repository.metadata.name;
-
- const descriptor = Reflect.getOwnPropertyDescriptor(controller, binding.name);
- if (!descriptor)
- throw new Error(`Descriptor for entity controller ${entityName} is empty`);
-
- ApiParam({
- name: 'id',
- required: true,
- type: config.pipeForId === ParseIntPipe ? 'integer' : 'string',
- description: `ID of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiOperation({
- summary: `Delete item of resource "${entityName}"`,
- operationId: `${controller.constructor.name}_${binding.name}`,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 404,
- description: `Item of resource "${entityName}" not found`,
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 204,
- description: `Item of resource "${entityName}" has been deleted`,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 400,
- description: 'Wrong query parameters',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/delete-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/delete-relationship.ts
deleted file mode 100644
index f8568432..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/delete-relationship.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-import {
- ApiBody,
- ApiExtraModels,
- ApiOperation,
- ApiParam,
- ApiResponse,
-} from '@nestjs/swagger';
-import { ParseIntPipe, Type } from '@nestjs/common';
-import { extendApi, generateSchema } from '@anatine/zod-openapi';
-import { createZodDto } from '@anatine/zod-nestjs';
-import {
- ReferenceObject,
- SchemaObject,
-} from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
-import { Repository } from 'typeorm';
-
-import { Binding, ConfigParam, Entity } from '../../../types';
-import { errorSchema } from '../utils';
-import { getField } from '../../orm';
-import { zodInputPatchRelationshipSchema, zodInputPostSchema } from '../../zod';
-
-export function deleteRelationship(
- controller: Type,
- repository: Repository,
- binding: Binding<'deleteRelationship'>,
- config: ConfigParam
-) {
- const entityName = repository.metadata.name;
-
- const descriptor = Reflect.getOwnPropertyDescriptor(
- controller.constructor.prototype,
- binding.name
- );
-
- if (!descriptor)
- throw new Error(`Descriptor for entity controller ${entityName} is empty`);
-
- const { relations } = getField(repository);
-
- const classBodySchemaDto = createZodDto(
- extendApi(zodInputPostSchema(repository))
- );
- Object.defineProperty(classBodySchemaDto, 'name', {
- value: `${entityName}DeleteRelationship`,
- });
- ApiExtraModels(classBodySchemaDto)(controller.constructor);
-
- ApiOperation({
- summary: `Delete list of relation for resource "${entityName}"`,
- operationId: `${controller.name}_${binding.name}`,
- })(controller, binding.name, descriptor);
-
- ApiParam({
- name: 'id',
- required: true,
- type: config.pipeForId === ParseIntPipe ? 'integer' : 'string',
- description: `ID of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiParam({
- name: 'relName',
- required: true,
- type: 'string',
- enum: relations,
- description: `Relation name of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiBody({
- description: `Json api schema for delete "${entityName}" item`,
- schema: generateSchema(zodInputPatchRelationshipSchema) as
- | SchemaObject
- | ReferenceObject,
- required: true,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 400,
- description: 'Wrong url parameters',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 422,
- description: 'Incorrect type for relation',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 404,
- description: 'Resource not found ',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 204,
- description: `Item/s of relation for "${entityName}" has been deleted`,
- })(controller, binding.name, descriptor);
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/get-all.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/get-all.ts
deleted file mode 100644
index c5506eba..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/get-all.ts
+++ /dev/null
@@ -1,232 +0,0 @@
-import { ApiOperation, ApiQuery, ApiResponse } from '@nestjs/swagger';
-import { Type } from '@nestjs/common';
-import { Repository } from 'typeorm';
-
-import { DEFAULT_PAGE_SIZE, DEFAULT_QUERY_PAGE } from '../../../constants';
-import { Binding, Entity, ConfigParam } from '../../../types';
-import { ObjectTyped } from '../../utils';
-import { errorSchema, jsonSchemaResponse } from '../utils';
-
-import {
- fromRelationTreeToArrayName,
- getField,
- getPrimaryColumnsForRelation,
- getPropsTreeForRepository,
-} from '../../orm';
-
-export function getAll(
- controller: Type,
- repository: Repository,
- binding: Binding<'getAll'>,
- config: ConfigParam
-): void {
- const entityName = repository.metadata.name;
-
- const descriptor = Reflect.getOwnPropertyDescriptor(controller, binding.name);
- if (!descriptor)
- throw new Error(`Descriptor for entity controller ${entityName} is empty`);
-
- const { relations, field } = getField(repository);
- const propsTree = getPropsTreeForRepository(repository);
- const relationTree = fromRelationTreeToArrayName(propsTree);
- const relationPrimaryColum = getPrimaryColumnsForRelation(repository);
- const primaryColumn = repository.metadata.primaryColumns[0].propertyName;
-
- ApiOperation({
- summary: `Get list items of resource "${entityName}"`,
- operationId: `${controller.constructor.name}_${binding.name}`,
- })(controller, binding.name, descriptor);
-
- ApiQuery({
- name: 'fields',
- required: false,
- style: 'deepObject',
- schema: {
- type: 'object',
- },
- examples: {
- allField: {
- summary: 'Select all field',
- description: 'Select field for target and relation',
- value: {
- target: field.join(','),
- ...ObjectTyped.entries(propsTree).reduce((acum, [name, props]) => {
- acum[name.toString()] = props.join(',');
- return acum;
- }, {} as Record),
- },
- },
- selectOnlyIdsTarget: {
- summary: 'Select ids for target',
- description: 'Select ids for target',
- value: {
- target: field.filter((i) => i === primaryColumn).join(','),
- },
- },
- selectOnlyIds: {
- summary: 'Select ids',
- description: 'Select ids',
- value: {
- target: field.filter((i) => i === primaryColumn).join(','),
- ...ObjectTyped.entries(relationPrimaryColum).reduce(
- (acum, [name, props]) => {
- acum[name.toString()] = props;
- return acum;
- },
- {} as Record
- ),
- },
- },
- },
- description: `Object of field for select field from "${entityName}" resource`,
- })(controller, binding.name, descriptor);
-
- ApiQuery({
- name: 'filter',
- required: false,
- style: 'deepObject',
- schema: {
- type: 'object',
- },
- examples: {
- simpleExample: {
- summary: 'Several conditional',
- description: 'Get if relation is not null',
- value: {
- [field[0]]: {
- in: '1,2,3',
- },
- [field[1]]: {
- lt: '1',
- },
- [relationTree[0]]: {
- eq: 'test',
- },
- },
- },
- relationNull: {
- summary: 'Get if relation is null',
- description: 'Get if relation is null',
- value: {
- [relations[0]]: {
- eq: null,
- },
- },
- },
- relationNotNull: {
- summary: 'Get if relation is not null',
- description: 'Get if relation is not null',
- value: {
- [relations[0]]: {
- ne: null,
- },
- },
- },
- getRelationByConditional: {
- summary: 'Get if relation field is',
- description: 'Get if relation field is',
- value: {
- [relationTree[0]]: {
- eq: 'test',
- },
- },
- },
- },
- description: `Object of filter for select items from "${entityName}" resource`,
- })(controller, binding.name, descriptor);
- ApiQuery({
- name: 'include',
- required: false,
- enum: relations,
- style: 'simple',
- isArray: true,
- description: `"${entityName}" resource item has been extended with existing relations`,
- examples: {
- withInclude: {
- summary: 'Add all relation',
- description: 'Add all realtion',
- value: relations,
- },
- without: {
- summary: 'Without relation',
- description: 'Without all realtion',
- value: [],
- },
- },
- })(controller, binding.name, descriptor);
- ApiQuery({
- name: 'sort',
- type: 'string',
- required: false,
- description: `Params for sorting of "${entityName}"`,
- examples: {
- sortAsc: {
- summary: 'Sort field by ASC',
- description: 'Sort field by ASC',
- value: field[1],
- },
- sortDesc: {
- summary: 'Sort field by DESC',
- description: 'Sort field by DESC',
- value: `-${field[1]}`,
- },
- sortAscRelation: {
- summary: 'Sort field relation by ASC',
- description: 'Sort field relation by ASC',
- value: relationTree[2],
- },
- sortDescRelation: {
- summary: 'Sort field relation by DESC',
- description: 'Sort field relation by DESC',
- value: `-${relationTree[2]}`,
- },
- sortSeveral: {
- summary: 'Sort several field relation',
- description: 'Sort several field relation',
- value: `${field[1]},-${relationTree[2]},${relationTree[1]},-${field[0]}`,
- },
- },
- })(controller, binding.name, descriptor);
-
- ApiQuery({
- name: 'page',
- style: 'deepObject',
- required: false,
- schema: {
- type: 'object',
- properties: {
- number: {
- type: 'integer',
- minimum: 1,
- example: DEFAULT_QUERY_PAGE,
- },
- size: {
- type: 'integer',
- minimum: 1,
- example: DEFAULT_PAGE_SIZE,
- maximum: 500,
- },
- },
- additionalProperties: false,
- },
- description: `"${entityName}" resource has been limit and offset with this params.`,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 404,
- description: `Item of resource "${entityName}" not found`,
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 400,
- description: 'Wrong query parameters',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 200,
- description: 'Resource list received successfully',
- schema: jsonSchemaResponse(repository, true),
- })(controller, binding.name, descriptor);
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/get-one.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/get-one.ts
deleted file mode 100644
index 765238fe..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/get-one.ts
+++ /dev/null
@@ -1,126 +0,0 @@
-import { ParseIntPipe, Type } from '@nestjs/common';
-import { ApiOperation, ApiParam, ApiQuery, ApiResponse } from '@nestjs/swagger';
-import { Repository } from 'typeorm';
-
-import { Binding, Entity, ConfigParam } from '../../../types';
-import { jsonSchemaResponse, errorSchema } from '../utils';
-
-import {
- getField,
- getPropsTreeForRepository,
- getPrimaryColumnsForRelation,
-} from '../../orm';
-import { ObjectTyped } from '../../utils';
-
-export function getOne(
- controller: Type,
- repository: Repository,
- binding: Binding<'getOne'>,
- config: ConfigParam
-) {
- const entityName = repository.metadata.name;
- const descriptor = Reflect.getOwnPropertyDescriptor(controller, binding.name);
- if (!descriptor)
- throw new Error(
- `Descriptor for entity controller ${entityName}:${binding.name} is empty`
- );
-
- const { relations, field } = getField(repository);
- const propsTree = getPropsTreeForRepository(repository);
- const relationPrimaryColum = getPrimaryColumnsForRelation(repository);
- const primaryColumn = repository.metadata.primaryColumns[0].propertyName;
-
- ApiOperation({
- summary: `Get one item of resource "${entityName}"`,
- operationId: `${controller.constructor.name}_${binding.name}`,
- })(controller, binding.name, descriptor);
-
- ApiParam({
- name: 'id',
- required: true,
- type: config.pipeForId === ParseIntPipe ? 'integer' : 'string',
- description: `ID of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiQuery({
- name: 'fields',
- required: false,
- style: 'deepObject',
- schema: {
- type: 'object',
- },
- examples: {
- allField: {
- summary: 'Select all field',
- description: 'Select field for target and relation',
- value: {
- target: field.join(','),
- ...ObjectTyped.entries(propsTree).reduce((acum, [name, props]) => {
- acum[name.toString()] = props.join(',');
- return acum;
- }, {} as Record),
- },
- },
- selectOnlyIdsTarget: {
- summary: 'Select ids for target',
- description: 'Select ids for target',
- value: {
- target: field.filter((i) => i === primaryColumn).join(','),
- },
- },
- selectOnlyIds: {
- summary: 'Select ids',
- description: 'Select ids',
- value: {
- target: field.filter((i) => i === primaryColumn).join(','),
- ...ObjectTyped.entries(relationPrimaryColum).reduce(
- (acum, [name, props]) => {
- acum[name.toString()] = props;
- return acum;
- },
- {} as Record
- ),
- },
- },
- },
- description: `Object of field for select field from "${entityName}" resource`,
- })(controller, binding.name, descriptor);
- ApiQuery({
- name: 'include',
- required: false,
- enum: relations,
- style: 'simple',
- isArray: true,
- description: `"${entityName}" resource item has been extended with existing relations`,
- examples: {
- withInclude: {
- summary: 'Add all relation',
- description: 'Add all realtion',
- value: relations,
- },
- without: {
- summary: 'Without relation',
- description: 'Without all realtion',
- value: [],
- },
- },
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 404,
- description: `Item of resource "${entityName}" not found`,
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 400,
- description: 'Wrong query parameters',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 200,
- description: 'Resource one item received successfully',
- schema: jsonSchemaResponse(repository),
- })(controller, binding.name, descriptor);
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/get-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/get-relationship.ts
deleted file mode 100644
index 31d817f4..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/get-relationship.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { ParseIntPipe, Type } from '@nestjs/common';
-import { ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger';
-import { Repository } from 'typeorm';
-
-import { Binding, ConfigParam, Entity } from '../../../types';
-import { errorSchema, schemaTypeForRelation } from '../utils';
-import { getField } from '../../orm';
-
-export function getRelationship(
- controller: Type,
- repository: Repository,
- binding: Binding<'getRelationship'>,
- config: ConfigParam
-) {
- const entityName = repository.metadata.name;
-
- const descriptor = Reflect.getOwnPropertyDescriptor(controller, binding.name);
-
- if (!descriptor)
- throw new Error(`Descriptor for entity controller ${entityName} is empty`);
-
- const { relations } = getField(repository);
-
- ApiOperation({
- summary: `Get list of relation for resource "${entityName}"`,
- operationId: `${controller.constructor.name}_${binding.name}`,
- })(controller, binding.name, descriptor);
-
- ApiParam({
- name: 'id',
- required: true,
- type: config.pipeForId === ParseIntPipe ? 'integer' : 'string',
- description: `ID of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiParam({
- name: 'relName',
- required: true,
- type: 'string',
- enum: relations,
- description: `Relation name of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 200,
- schema: schemaTypeForRelation,
- description: `Item/s of relation for "${entityName}" has been created`,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 400,
- description: 'Wrong url parameters',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 422,
- description: 'Incorrect type for relation',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 404,
- description: 'Resource not found ',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/index.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/index.ts
deleted file mode 100644
index 232f6eff..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/index.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { getAll } from './get-all';
-import { getOne } from './get-one';
-import { deleteOne } from './delete-one';
-import { postOne } from './post-one';
-import { patchOne } from './patch-one';
-import { getRelationship } from './get-relationship';
-import { deleteRelationship } from './delete-relationship';
-import { postRelationship } from './post-relationship';
-import { patchRelationship } from './patch-relationship';
-import { MethodName } from '../../../types';
-
-export type SwaggerMethod = {
- [Key in MethodName]?: any;
-};
-
-export const swaggerMethod: SwaggerMethod = {
- getAll,
- getOne,
- deleteOne,
- postOne,
- patchOne,
- getRelationship,
- deleteRelationship,
- postRelationship,
- patchRelationship,
-};
-
-export const errorSchema = {
- type: 'object',
- properties: {
- status: {
- type: 'number',
- },
- errors: {
- type: 'array',
- items: {
- type: 'object',
- properties: {
- detail: {
- type: 'string',
- },
- source: {
- type: 'object',
- properties: {
- parameter: {
- type: 'string',
- },
- },
- },
- },
- required: ['detail'],
- },
- },
- },
-};
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/patch-one.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/patch-one.ts
deleted file mode 100644
index a4abf4aa..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/patch-one.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import {
- ReferenceObject,
- SchemaObject,
-} from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
-import {
- ApiBody,
- ApiExtraModels,
- ApiOperation,
- ApiParam,
- ApiResponse,
-} from '@nestjs/swagger';
-import { ParseIntPipe, Type } from '@nestjs/common';
-import { extendApi, generateSchema } from '@anatine/zod-openapi';
-import { Repository } from 'typeorm';
-
-import { jsonSchemaResponse, errorSchema } from '../utils';
-
-import { zodInputPatchSchema, zodInputPostSchema } from '../../zod';
-import { Binding, ConfigParam, Entity } from '../../../types';
-import { createZodDto } from '@anatine/zod-nestjs';
-
-export function patchOne(
- controller: Type,
- repository: Repository,
- binding: Binding<'patchOne'>,
- config: ConfigParam
-) {
- const entityName = repository.metadata.name;
-
- const descriptor = Reflect.getOwnPropertyDescriptor(controller, binding.name);
-
- if (!descriptor)
- throw new Error(`Descriptor for entity controller ${entityName} is empty`);
-
- const classBodySchemaDto = createZodDto(
- extendApi(zodInputPostSchema(repository))
- );
- Object.defineProperty(classBodySchemaDto, 'name', {
- value: `${entityName}PatchOne`,
- });
- ApiExtraModels(classBodySchemaDto)(controller.constructor);
-
- ApiOperation({
- summary: `Update item of resource "${entityName}"`,
- operationId: `${controller.constructor.name}_${binding.name}`,
- })(controller, binding.name, descriptor);
-
- ApiParam({
- name: 'id',
- required: true,
- type: config.pipeForId === ParseIntPipe ? 'integer' : 'string',
- description: `ID of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiBody({
- description: `Json api schema for update "${entityName}" item`,
- schema: generateSchema(zodInputPatchSchema(repository)) as
- | SchemaObject
- | ReferenceObject,
- required: true,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 200,
- description: `Item of resource "${entityName}" has been updated`,
- schema: jsonSchemaResponse(repository),
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 400,
- description: 'Wrong body parameters',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 422,
- description: 'Unprocessable data',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/patch-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/patch-relationship.ts
deleted file mode 100644
index b87b2cfa..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/patch-relationship.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-import { ParseIntPipe, Type } from '@nestjs/common';
-import {
- ApiBody,
- ApiExtraModels,
- ApiOperation,
- ApiParam,
- ApiResponse,
-} from '@nestjs/swagger';
-import {
- ReferenceObject,
- SchemaObject,
-} from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
-import { extendApi, generateSchema } from '@anatine/zod-openapi';
-import { Repository } from 'typeorm';
-import { Binding, ConfigParam, Entity } from '../../../types';
-import { schemaTypeForRelation, errorSchema } from '../utils';
-import { zodInputPatchRelationshipSchema, zodInputPostSchema } from '../../zod';
-import { getField } from '../../orm';
-import { createZodDto } from '@anatine/zod-nestjs';
-
-export function patchRelationship(
- controller: Type,
- repository: Repository,
- binding: Binding<'patchRelationship'>,
- config: ConfigParam
-) {
- const entityName = repository.metadata.name;
-
- const descriptor = Reflect.getOwnPropertyDescriptor(controller, binding.name);
-
- if (!descriptor)
- throw new Error(`Descriptor for entity controller ${entityName} is empty`);
-
- const { relations } = getField(repository);
-
- const classBodySchemaDto = createZodDto(
- extendApi(zodInputPostSchema(repository))
- );
- Object.defineProperty(classBodySchemaDto, 'name', {
- value: `${entityName}PatchRelationship`,
- });
- ApiExtraModels(classBodySchemaDto)(controller.constructor);
-
- ApiOperation({
- summary: `Update list of relation for resource "${entityName}"`,
- operationId: `${controller.constructor.name}_${binding.name}`,
- })(controller.prototype, binding.name, descriptor);
-
- ApiParam({
- name: 'id',
- required: true,
- type: config.pipeForId === ParseIntPipe ? 'integer' : 'string',
- description: `ID of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiParam({
- name: 'relName',
- required: true,
- type: 'string',
- enum: relations,
- description: `Relation name of resource "${entityName}"`,
- })(controller.prototype, binding.name, descriptor);
-
- ApiBody({
- description: `Json api schema for update "${entityName}" item`,
- schema: generateSchema(zodInputPatchRelationshipSchema) as
- | SchemaObject
- | ReferenceObject,
- required: true,
- })(controller.prototype, binding.name, descriptor);
-
- ApiResponse({
- status: 200,
- schema: schemaTypeForRelation,
- description: `Item/s of relation for "${entityName}" has been updated`,
- })(controller.prototype, binding.name, descriptor);
-
- ApiResponse({
- status: 400,
- description: 'Wrong url parameters',
- schema: errorSchema,
- })(controller.prototype, binding.name, descriptor);
-
- ApiResponse({
- status: 422,
- description: 'Incorrect type for relation',
- schema: errorSchema,
- })(controller.prototype, binding.name, descriptor);
-
- ApiResponse({
- status: 404,
- description: 'Resource not found ',
- schema: errorSchema,
- })(controller.prototype, binding.name, descriptor);
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/post-one.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/post-one.ts
deleted file mode 100644
index 608e0fae..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/post-one.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import {
- ApiOperation,
- ApiResponse,
- ApiBody,
- ApiExtraModels,
-} from '@nestjs/swagger';
-
-import { Binding, ConfigParam, Entity } from '../../../types';
-import { jsonSchemaResponse } from '../utils';
-
-import { errorSchema } from '../utils';
-import { Type } from '@nestjs/common';
-import { Repository } from 'typeorm';
-
-import { generateSchema, extendApi } from '@anatine/zod-openapi';
-
-import { zodInputPostSchema } from '../../zod';
-import {
- ReferenceObject,
- SchemaObject,
-} from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
-import { createZodDto } from '@anatine/zod-nestjs';
-
-export function postOne(
- controller: Type,
- repository: Repository,
- binding: Binding<'postOne'>,
- config: ConfigParam
-) {
- const entityName = repository.metadata.name;
-
- const descriptor = Reflect.getOwnPropertyDescriptor(controller, binding.name);
-
- if (!descriptor)
- throw new Error(`Descriptor for entity controller ${entityName} is empty`);
-
- const classBodySchemaDto = createZodDto(
- extendApi(zodInputPostSchema(repository))
- );
-
- Object.defineProperty(classBodySchemaDto, 'name', {
- value: `${entityName}PostOne`,
- });
- ApiExtraModels(classBodySchemaDto)(controller.constructor);
-
- ApiOperation({
- summary: `Create item of resource "${entityName}"`,
- operationId: `${controller.constructor.name}_${binding.name}`,
- })(controller, binding.name, descriptor);
-
- ApiBody({
- description: `Json api schema for new "${entityName}" item`,
- schema: generateSchema(zodInputPostSchema(repository)) as
- | SchemaObject
- | ReferenceObject,
- required: true,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 201,
- description: `Item of resource "${entityName}" has been created`,
- schema: jsonSchemaResponse(repository),
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 400,
- description: 'Wrong body parameters',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 422,
- description: 'Unprocessable data',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/post-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/post-relationship.ts
deleted file mode 100644
index 6cdeb525..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/swagger/method/post-relationship.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { ParseIntPipe, Type } from '@nestjs/common';
-import {
- ApiBody,
- ApiExtraModels,
- ApiOperation,
- ApiParam,
- ApiResponse,
-} from '@nestjs/swagger';
-import { extendApi, generateSchema } from '@anatine/zod-openapi';
-import {
- ReferenceObject,
- SchemaObject,
-} from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
-import { Repository } from 'typeorm';
-
-import { getField } from '../../orm';
-import { zodInputPostRelationshipSchema, zodInputPostSchema } from '../../zod';
-import { Binding, ConfigParam, Entity } from '../../../types';
-import { schemaTypeForRelation, errorSchema } from '../utils';
-import { createZodDto } from '@anatine/zod-nestjs';
-
-export function postRelationship(
- controller: Type,
- repository: Repository,
- binding: Binding<'postRelationship'>,
- config: ConfigParam
-) {
- const entityName = repository.metadata.name;
-
- const descriptor = Reflect.getOwnPropertyDescriptor(controller, binding.name);
-
- if (!descriptor)
- throw new Error(`Descriptor for entity controller ${entityName} is empty`);
-
- const { relations } = getField(repository);
-
- const classBodySchemaDto = createZodDto(
- extendApi(zodInputPostSchema(repository))
- );
- Object.defineProperty(classBodySchemaDto, 'name', {
- value: `${entityName}PostRelationship`,
- });
- ApiExtraModels(classBodySchemaDto)(controller.constructor);
-
- ApiParam({
- name: 'id',
- required: true,
- type: config.pipeForId === ParseIntPipe ? 'integer' : 'string',
- description: `ID of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiParam({
- name: 'relName',
- required: true,
- type: 'string',
- enum: relations,
- description: `Relation name of resource "${entityName}"`,
- })(controller, binding.name, descriptor);
-
- ApiBody({
- description: `Json api schema for update "${entityName}" item`,
- schema: generateSchema(zodInputPostRelationshipSchema) as
- | SchemaObject
- | ReferenceObject,
- required: true,
- })(controller, binding.name, descriptor);
-
- ApiOperation({
- summary: `Create list of relation for resource "${entityName}"`,
- operationId: `${controller.constructor.name}_${binding.name}`,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 200,
- schema: schemaTypeForRelation,
- description: `Item/s of relation for "${entityName}" has been created`,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 400,
- description: 'Wrong url parameters',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 422,
- description: 'Incorrect type for relation',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-
- ApiResponse({
- status: 404,
- description: 'Resource not found ',
- schema: errorSchema,
- })(controller, binding.name, descriptor);
-}
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/zod/index.ts b/libs/json-api/json-api-nestjs/src/lib/helper/zod/index.ts
deleted file mode 100644
index b70e311c..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/zod/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './zod-helper';
diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-helper.spec.ts b/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-helper.spec.ts
deleted file mode 100644
index 3221b9bc..00000000
--- a/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-helper.spec.ts
+++ /dev/null
@@ -1,728 +0,0 @@
-import { Test, TestingModule } from '@nestjs/testing';
-import { getDataSourceToken } from '@nestjs/typeorm';
-import { Repository } from 'typeorm';
-import { IMemoryDb } from 'pg-mem';
-import { z, ZodError } from 'zod';
-
-import {
- Addresses,
- Comments,
- createAndPullSchemaBase,
- getRepository,
- mockDBTestModule,
- Notes,
- providerEntities,
- pullAllData,
- pullUser,
- Roles,
- UserGroups,
- Users,
-} from '../../mock-utils';
-import {
- QueryField,
- zodInputQuerySchema,
- ZodInputQuerySchema,
- zodQuerySchema,
- ZodQuerySchema,
- zodInputPostSchema,
- ZodInputPostSchema,
- ZodInputPatchSchema,
- zodInputPatchSchema,
- zodInputPostRelationshipSchema,
- zodInputPatchRelationshipSchema,
-} from './zod-helper';
-import { DEFAULT_PAGE_SIZE, DEFAULT_QUERY_PAGE } from '../../constants';
-
-const page = {
- [QueryField.page]: {
- size: DEFAULT_PAGE_SIZE,
- number: DEFAULT_QUERY_PAGE,
- },
-};
-
-describe('zod-helper', () => {
- let userRepository: Repository;
- let addressesRepository: Repository;
- let notesRepository: Repository;
- let commentsRepository: Repository;
- let rolesRepository: Repository;
- let userGroupRepository: Repository;
- let db: IMemoryDb;
- let zodInputQuerySchemaTest: ZodInputQuerySchema;
- type zodInputQuerySchema = z.infer;
- type TypeFilterInputQuery = zodInputQuerySchema['filter'];
- type TypeIncludeInputQuery = zodInputQuerySchema['include'];
- type TypeFieldsInputQuery = zodInputQuerySchema['fields'];
- type TypePageInputQuery = zodInputQuerySchema['page'];
-
- let zodQuerySchemaTest: ZodQuerySchema;
- type zodQuerySchema = z.infer;
- type TypeFilterQuery = zodQuerySchema['filter'];
- type TypeIncludeQuery = zodQuerySchema['include'];
- type TypeFieldsQuery = zodQuerySchema['fields'];
- type TypePageQuery = zodQuerySchema['page'];
- type TypeSortQuery = zodQuerySchema['sort'];
- const dataCheckDefault = {
- [QueryField.filter]: null,
- [QueryField.fields]: null,
- [QueryField.include]: null,
- [QueryField.sort]: null,
- [QueryField.page]: page[QueryField.page],
- };
-
- let zodInputPostSchemaTest: ZodInputPostSchema;
- type zodInputPostSchema = z.infer;
-
- let zodInputPatchSchemaTest: ZodInputPatchSchema;
- type zodInputPatchSchema = z.infer;
-
- beforeAll(async () => {
- db = createAndPullSchemaBase();
- const module: TestingModule = await Test.createTestingModule({
- imports: [mockDBTestModule(db)],
- providers: [...providerEntities(getDataSourceToken())],
- }).compile();
- ({
- userRepository,
- addressesRepository,
- notesRepository,
- commentsRepository,
- rolesRepository,
- userGroupRepository,
- } = getRepository(module));
-
- const user = await pullUser(userRepository);
- const userWithRelation = await pullAllData(
- userRepository,
- addressesRepository,
- notesRepository,
- commentsRepository,
- rolesRepository,
- userGroupRepository
- );
- zodInputQuerySchemaTest = zodInputQuerySchema(userRepository);
- zodQuerySchemaTest = zodQuerySchema(userRepository);
- zodInputPostSchemaTest = zodInputPostSchema