From 2e2e070257837acc74f8028b25d13187d75fadfc Mon Sep 17 00:00:00 2001 From: "amplication[bot]" <100755160+amplication[bot]@users.noreply.github.com> Date: Sun, 14 May 2023 21:34:47 +0000 Subject: [PATCH] Amplication build # clhnxoqo40rjqj001cwp3r1ro. Commit message: gfggg https://app.amplication.com/ckjfo5iat165703410s6os7mmgc3/cl97vju9045404001i0t1wckk8z/cl97vl69r38903601gw5nozm8t7/builds/clhnxoqo40rjqj001cwp3r1ro --- packages/core/.env | 11 +- packages/core/.gitignore | 5 +- packages/core/Dockerfile | 4 +- packages/core/README.md | 66 +++ packages/core/docker-compose.yml | 14 +- packages/core/package.json | 20 +- packages/core/prisma/schema.prisma | 45 +- packages/core/scripts/seed.ts | 11 +- packages/core/src/app.module.ts | 16 +- .../core/src/arcadeGame/base/ArcadeGame.ts | 13 +- .../arcadeGame/base/ArcadeGameCreateInput.ts | 13 +- .../arcadeGame/base/ArcadeGameFindManyArgs.ts | 2 +- .../base/ArcadeGameFindUniqueArgs.ts | 2 +- .../base/ArcadeGameListRelationFilter.ts | 2 +- .../arcadeGame/base/ArcadeGameOrderByInput.ts | 2 +- .../arcadeGame/base/ArcadeGameUpdateInput.ts | 13 +- .../arcadeGame/base/ArcadeGameWhereInput.ts | 4 +- .../base/ArcadeGameWhereUniqueInput.ts | 4 +- .../arcadeGame/base/CreateArcadeGameArgs.ts | 2 +- .../arcadeGame/base/DeleteArcadeGameArgs.ts | 2 +- .../arcadeGame/base/UpdateArcadeGameArgs.ts | 2 +- .../base/arcadeGame.controller.base.ts | 54 +- .../arcadeGame/base/arcadeGame.module.base.ts | 12 +- .../base/arcadeGame.service.base.ts | 2 +- packages/core/src/auth/UserInfo.ts | 2 +- packages/core/src/auth/auth.service.spec.ts | 118 ++++ .../auth/basic/base/basic.strategy.base.ts | 23 - .../core/src/auth/basic/basic.strategy.ts | 10 - .../core/src/auth/basic/basicAuth.guard.ts | 3 - packages/core/src/auth/jwt/jwt.strategy.ts | 1 + .../core/src/auth/password.service.spec.ts | 69 +++ packages/core/src/auth/userData.decorator.ts | 1 - .../base/CreateFriendRelationshipArgs.ts | 21 - .../base/DeleteFriendRelationshipArgs.ts | 21 - .../base/FriendRelationship.ts | 61 --- .../base/FriendRelationshipCreateInput.ts | 43 -- .../base/FriendRelationshipFindManyArgs.ts | 53 -- .../base/FriendRelationshipFindUniqueArgs.ts | 21 - .../FriendRelationshipListRelationFilter.ts | 56 -- .../base/FriendRelationshipOrderByInput.ts | 67 --- .../base/FriendRelationshipUpdateInput.ts | 43 -- .../base/FriendRelationshipWhereInput.ts | 55 -- .../FriendRelationshipWhereUniqueInput.ts | 25 - .../base/UpdateFriendRelationshipArgs.ts | 24 - ...friendRelationship.controller.base.spec.ts | 191 ------- .../friendRelationship.controller.base.ts | 270 ---------- .../base/friendRelationship.module.base.ts | 28 - .../base/friendRelationship.service.base.ts | 65 --- .../friendRelationship.controller.ts | 17 - .../friendRelationship.module.ts | 12 - .../friendRelationship.service.ts | 10 - packages/core/src/grants.json | 62 +-- .../src/health/base/health.service.base.ts | 2 +- packages/core/src/prisma.util.spec.ts | 23 + packages/core/src/prisma/prisma.module.ts | 9 + packages/core/src/prisma/prisma.service.ts | 15 + .../base/CreatePrivateMessageArgs.ts | 21 - .../base/DeletePrivateMessageArgs.ts | 21 - .../src/privateMessage/base/PrivateMessage.ts | 72 --- .../base/PrivateMessageCreateInput.ts | 54 -- .../base/PrivateMessageFindManyArgs.ts | 53 -- .../base/PrivateMessageFindUniqueArgs.ts | 21 - .../base/PrivateMessageListRelationFilter.ts | 56 -- .../base/PrivateMessageOrderByInput.ts | 76 --- .../base/PrivateMessageUpdateInput.ts | 54 -- .../base/PrivateMessageWhereInput.ts | 67 --- .../base/PrivateMessageWhereUniqueInput.ts | 25 - .../base/UpdatePrivateMessageArgs.ts | 24 - .../privateMessage.controller.base.spec.ts | 195 ------- .../base/privateMessage.controller.base.ts | 273 ---------- .../base/privateMessage.module.base.ts | 28 - .../base/privateMessage.service.base.ts | 65 --- .../privateMessage.controller.ts | 17 - .../privateMessage/privateMessage.module.ts | 12 - .../privateMessage/privateMessage.service.ts | 10 - .../base/secretsManager.service.base.spec.ts | 39 ++ packages/core/src/room/base/DeleteRoomArgs.ts | 2 +- packages/core/src/room/base/Room.ts | 4 +- .../core/src/room/base/RoomCreateInput.ts | 2 +- .../core/src/room/base/RoomFindManyArgs.ts | 2 +- .../core/src/room/base/RoomFindUniqueArgs.ts | 2 +- .../src/room/base/RoomListRelationFilter.ts | 2 +- .../core/src/room/base/RoomOrderByInput.ts | 2 +- .../core/src/room/base/RoomUpdateInput.ts | 2 +- packages/core/src/room/base/RoomWhereInput.ts | 4 +- .../src/room/base/RoomWhereUniqueInput.ts | 4 +- .../src/room/base/room.controller.base.ts | 54 +- .../core/src/room/base/room.module.base.ts | 12 +- .../core/src/room/base/room.service.base.ts | 2 +- .../roomMessage/base/CreateRoomMessageArgs.ts | 2 +- .../roomMessage/base/DeleteRoomMessageArgs.ts | 2 +- .../core/src/roomMessage/base/RoomMessage.ts | 4 +- .../base/RoomMessageCreateInput.ts | 4 +- .../base/RoomMessageFindManyArgs.ts | 2 +- .../base/RoomMessageFindUniqueArgs.ts | 2 +- .../base/RoomMessageListRelationFilter.ts | 2 +- .../base/RoomMessageOrderByInput.ts | 2 +- .../base/RoomMessageUpdateInput.ts | 4 +- .../roomMessage/base/RoomMessageWhereInput.ts | 4 +- .../base/RoomMessageWhereUniqueInput.ts | 4 +- .../roomMessage/base/UpdateRoomMessageArgs.ts | 2 +- .../base/roomMessage.controller.base.ts | 54 +- .../base/roomMessage.module.base.ts | 12 +- .../base/roomMessage.service.base.ts | 2 +- packages/core/src/swagger.ts | 2 +- .../src/tests/health/health.service.spec.ts | 36 ++ packages/core/src/types.ts | 2 +- packages/core/src/user/base/CreateUserArgs.ts | 2 +- packages/core/src/user/base/DeleteUserArgs.ts | 2 +- ...onshipCreateNestedManyWithoutUsersInput.ts | 26 - ...RelationshipUpdateManyWithoutUsersInput.ts | 44 -- ...essageCreateNestedManyWithoutUsersInput.ts | 26 - ...ivateMessageUpdateManyWithoutUsersInput.ts | 44 -- ...essageCreateNestedManyWithoutUsersInput.ts | 4 +- .../RoomMessageUpdateManyWithoutUsersInput.ts | 4 +- packages/core/src/user/base/UpdateUserArgs.ts | 2 +- packages/core/src/user/base/User.ts | 46 +- .../core/src/user/base/UserCreateInput.ts | 67 +-- .../core/src/user/base/UserFindManyArgs.ts | 2 +- .../core/src/user/base/UserFindUniqueArgs.ts | 2 +- .../src/user/base/UserListRelationFilter.ts | 2 +- .../core/src/user/base/UserOrderByInput.ts | 2 +- .../core/src/user/base/UserUpdateInput.ts | 67 +-- packages/core/src/user/base/UserWhereInput.ts | 54 +- .../src/user/base/UserWhereUniqueInput.ts | 4 +- .../src/user/base/user.controller.base.ts | 504 ++---------------- .../core/src/user/base/user.module.base.ts | 12 +- .../core/src/user/base/user.service.base.ts | 54 +- packages/core/src/util/JsonNullableFilter.ts | 2 +- packages/core/src/validators/index.ts | 1 + .../is-json-value-validator.spec.ts | 44 ++ .../src/validators/is-json-value-validator.ts | 29 + packages/core/tsconfig.json | 6 +- 133 files changed, 771 insertions(+), 3442 deletions(-) create mode 100644 packages/core/README.md create mode 100644 packages/core/src/auth/auth.service.spec.ts delete mode 100644 packages/core/src/auth/basic/base/basic.strategy.base.ts delete mode 100644 packages/core/src/auth/basic/basic.strategy.ts delete mode 100644 packages/core/src/auth/basic/basicAuth.guard.ts create mode 100644 packages/core/src/auth/password.service.spec.ts delete mode 100644 packages/core/src/friendRelationship/base/CreateFriendRelationshipArgs.ts delete mode 100644 packages/core/src/friendRelationship/base/DeleteFriendRelationshipArgs.ts delete mode 100644 packages/core/src/friendRelationship/base/FriendRelationship.ts delete mode 100644 packages/core/src/friendRelationship/base/FriendRelationshipCreateInput.ts delete mode 100644 packages/core/src/friendRelationship/base/FriendRelationshipFindManyArgs.ts delete mode 100644 packages/core/src/friendRelationship/base/FriendRelationshipFindUniqueArgs.ts delete mode 100644 packages/core/src/friendRelationship/base/FriendRelationshipListRelationFilter.ts delete mode 100644 packages/core/src/friendRelationship/base/FriendRelationshipOrderByInput.ts delete mode 100644 packages/core/src/friendRelationship/base/FriendRelationshipUpdateInput.ts delete mode 100644 packages/core/src/friendRelationship/base/FriendRelationshipWhereInput.ts delete mode 100644 packages/core/src/friendRelationship/base/FriendRelationshipWhereUniqueInput.ts delete mode 100644 packages/core/src/friendRelationship/base/UpdateFriendRelationshipArgs.ts delete mode 100644 packages/core/src/friendRelationship/base/friendRelationship.controller.base.spec.ts delete mode 100644 packages/core/src/friendRelationship/base/friendRelationship.controller.base.ts delete mode 100644 packages/core/src/friendRelationship/base/friendRelationship.module.base.ts delete mode 100644 packages/core/src/friendRelationship/base/friendRelationship.service.base.ts delete mode 100644 packages/core/src/friendRelationship/friendRelationship.controller.ts delete mode 100644 packages/core/src/friendRelationship/friendRelationship.module.ts delete mode 100644 packages/core/src/friendRelationship/friendRelationship.service.ts create mode 100644 packages/core/src/prisma.util.spec.ts create mode 100644 packages/core/src/prisma/prisma.module.ts create mode 100644 packages/core/src/prisma/prisma.service.ts delete mode 100644 packages/core/src/privateMessage/base/CreatePrivateMessageArgs.ts delete mode 100644 packages/core/src/privateMessage/base/DeletePrivateMessageArgs.ts delete mode 100644 packages/core/src/privateMessage/base/PrivateMessage.ts delete mode 100644 packages/core/src/privateMessage/base/PrivateMessageCreateInput.ts delete mode 100644 packages/core/src/privateMessage/base/PrivateMessageFindManyArgs.ts delete mode 100644 packages/core/src/privateMessage/base/PrivateMessageFindUniqueArgs.ts delete mode 100644 packages/core/src/privateMessage/base/PrivateMessageListRelationFilter.ts delete mode 100644 packages/core/src/privateMessage/base/PrivateMessageOrderByInput.ts delete mode 100644 packages/core/src/privateMessage/base/PrivateMessageUpdateInput.ts delete mode 100644 packages/core/src/privateMessage/base/PrivateMessageWhereInput.ts delete mode 100644 packages/core/src/privateMessage/base/PrivateMessageWhereUniqueInput.ts delete mode 100644 packages/core/src/privateMessage/base/UpdatePrivateMessageArgs.ts delete mode 100644 packages/core/src/privateMessage/base/privateMessage.controller.base.spec.ts delete mode 100644 packages/core/src/privateMessage/base/privateMessage.controller.base.ts delete mode 100644 packages/core/src/privateMessage/base/privateMessage.module.base.ts delete mode 100644 packages/core/src/privateMessage/base/privateMessage.service.base.ts delete mode 100644 packages/core/src/privateMessage/privateMessage.controller.ts delete mode 100644 packages/core/src/privateMessage/privateMessage.module.ts delete mode 100644 packages/core/src/privateMessage/privateMessage.service.ts create mode 100644 packages/core/src/providers/secrets/base/secretsManager.service.base.spec.ts create mode 100644 packages/core/src/tests/health/health.service.spec.ts delete mode 100644 packages/core/src/user/base/FriendRelationshipCreateNestedManyWithoutUsersInput.ts delete mode 100644 packages/core/src/user/base/FriendRelationshipUpdateManyWithoutUsersInput.ts delete mode 100644 packages/core/src/user/base/PrivateMessageCreateNestedManyWithoutUsersInput.ts delete mode 100644 packages/core/src/user/base/PrivateMessageUpdateManyWithoutUsersInput.ts create mode 100644 packages/core/src/validators/index.ts create mode 100644 packages/core/src/validators/is-json-value-validator.spec.ts create mode 100644 packages/core/src/validators/is-json-value-validator.ts diff --git a/packages/core/.env b/packages/core/.env index a676b92..123a69a 100644 --- a/packages/core/.env +++ b/packages/core/.env @@ -1,12 +1,13 @@ BCRYPT_SALT=10 COMPOSE_PROJECT_NAME=amp_cl97vl69r38903601gw5nozm8t7 -JWT_SECRET_KEY=Change_ME!!! -JWT_EXPIRATION=2d PORT=3000 -DB_USER=postgres -DB_PASSWORD=postgres +DB_URL=postgres://admin:admin@localhost:5432/my-db +DB_USER=admin +DB_PASSWORD=admin DB_PORT=5432 -DB_URL=postgres://postgres:postgres@localhost:5432/postgres +DB_NAME=my-db +JWT_SECRET_KEY=Change_ME!!! +JWT_EXPIRATION=2d KAFKA_BROKERS=localhost:9092 KAFKA_ENABLE_SSL=false KAFKA_CLIENT_ID=core diff --git a/packages/core/.gitignore b/packages/core/.gitignore index b65b772..08c9980 100644 --- a/packages/core/.gitignore +++ b/packages/core/.gitignore @@ -1,6 +1,5 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - - + /node_modules /dist -.DS_Store \ No newline at end of file +.DS_Store diff --git a/packages/core/Dockerfile b/packages/core/Dockerfile index 586f38c..0a20053 100644 --- a/packages/core/Dockerfile +++ b/packages/core/Dockerfile @@ -1,4 +1,4 @@ -FROM node:19.1 AS base +FROM node:18.12.1 AS base WORKDIR /app @@ -14,7 +14,7 @@ COPY . . RUN npm run build -FROM node:19.1 AS prod +FROM node:18.12.1 AS prod WORKDIR /app diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 0000000..9de25c0 --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,66 @@ +

+ + amplication-logo + +

+ +# Introduction + +This service was generated with Amplication. The server-side of the generated project. This component provides the different backend services - i.e., REST API, GraphQL API, authentication, authorization, logging, data validation and the connection to the database. Additional information about the server component and the architecture around it, can be found on the [documentation](https://docs.amplication.com/guides/getting-started) site. + +# Getting started + +## Step 1: Configuration + +Configuration for the server component can be provided through the use of environment variables. These can be passed to the application via the use of the `.env` file in the base directory of the generated service. Below a table can be found which show the different variables that can be passed - these are the variables which exist by default, through the use of plugins additional integrations could require additional values. These values are provided default values after generation, change them to the desired values. + +| Variable | Description | Value | +| -------------------- | -------------------------------------------- | ------------------------------------------------------------------- | +| BCRYPT_SALT | the string used for hashing | [random-string] | +| COMPOSE_PROJECT_NAME | the identifier of the service plus prefix | amp_[service-identifier] | +| PORT | the port on which to run the server | 3000 | +| DB_URL | the connection url for the database | [db-provider]://[username]:[password]@localhost:[db-port]/[db-name] | +| DB_PORT | the port used by the database instance | [db-provider-port] | +| DB_USER | the username used to connect to the database | [username] | +| DB_PASSWORD | the password used to connect to the database | [password] | +| DB_NAME | the name of the database | [service-name] / [project-name] | +| JWT_SECRET_KEY | the secret used to sign the json-web token | [secret] | +| JWT_EXPIRATION | the expiration time for the json-web token | 2d | + +> **Note** +> Amplication generates default values and stores them under the .env file. It is advised to use some form of secrets manager/vault solution when using in production. + +## Step 2.1: Scripts - pre-requisites + +After configuration of the server the next step would be to run the application. Before running the server side of the component, make sure that the different pre-requisites are met - i.e., node.js [^16.x], npm, docker. After the setup of the pre-requisites the server component can be started. + +```sh +# installation of the dependencies +$ npm install +``` +```sh +# generate the prisma client +$ npm run prisma:generate +``` +```sh +# start the database where the server component will connect to +$ npm run docker:db +``` +```sh +# initialize the database +$ npm run db:init +``` + +## Step 2.2: Scripts - local development + +```shell +# start the server component +$ npm run install +``` + +## Step 2.2: Scripts - container based development + +```shell +# start the server component as a docker container +$ npm run compose:up +``` diff --git a/packages/core/docker-compose.yml b/packages/core/docker-compose.yml index 4636550..06dfbf5 100644 --- a/packages/core/docker-compose.yml +++ b/packages/core/docker-compose.yml @@ -11,7 +11,7 @@ services: BCRYPT_SALT: ${BCRYPT_SALT} JWT_SECRET_KEY: ${JWT_SECRET_KEY} JWT_EXPIRATION: ${JWT_EXPIRATION} - DB_URL: postgres://${DB_USER}:${DB_PASSWORD}@db:5433 + DB_URL: postgres://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME} depends_on: - migrate migrate: @@ -23,7 +23,7 @@ services: working_dir: /app/server environment: BCRYPT_SALT: ${BCRYPT_SALT} - DB_URL: postgres://${DB_USER}:${DB_PASSWORD}@db:5432 + DB_URL: postgres://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME} depends_on: db: condition: service_healthy @@ -34,17 +34,13 @@ services: environment: POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_DB: ${DB_NAME} volumes: - postgres:/var/lib/postgresql/data healthcheck: test: - - CMD - - pg_isready - - -q - - -d - - ${DB_DB_NAME} - - -U - - ${DB_USER} + - CMD-SHELL + - pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER} timeout: 45s interval: 10s retries: 10 diff --git a/packages/core/package.json b/packages/core/package.json index c2173a3..e428602 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -23,8 +23,6 @@ "@nestjs/config": "1.1.5", "@nestjs/core": "8.4.7", "@nestjs/graphql": "9.1.2", - "@nestjs/jwt": "8.0.0", - "@nestjs/passport": "8.2.2", "@nestjs/platform-express": "8.4.7", "@nestjs/serve-static": "2.2.2", "@nestjs/swagger": "5.1.5", @@ -39,12 +37,15 @@ "nest-morgan": "1.0.1", "nestjs-prisma": "0.19.0", "npm-run-all": "4.1.5", - "passport": "0.6.0", - "passport-http": "0.3.0", - "passport-jwt": "4.0.0", "reflect-metadata": "0.1.13", "swagger-ui-express": "4.3.0", - "ts-node": "9.1.1", + "ts-node": "10.9.1", + "validator": "^13.9.0", + "@nestjs/jwt": "^10.0.2", + "@nestjs/passport": "^9.0.0", + "passport": "0.6.0", + "passport-http": "0.3.0", + "passport-jwt": "4.0.1", "@nestjs/microservices": "8.2.3", "kafkajs": "2.2.0" }, @@ -56,16 +57,17 @@ "@types/graphql-type-json": "0.3.2", "@types/jest": "26.0.19", "@types/normalize-path": "3.0.0", - "@types/passport-http": "0.3.9", - "@types/passport-jwt": "3.0.6", "@types/supertest": "2.0.11", + "@types/validator": "^13.7.15", "jest": "27.0.6", "jest-mock-extended": "^2.0.4", "prisma": "4.6.1", "supertest": "4.0.2", "ts-jest": "27.0.3", "type-fest": "0.11.0", - "typescript": "4.2.3" + "typescript": "4.2.3", + "@types/passport-http": "0.3.9", + "@types/passport-jwt": "3.0.8" }, "jest": { "preset": "ts-jest", diff --git a/packages/core/prisma/schema.prisma b/packages/core/prisma/schema.prisma index fcca5f2..3a223f9 100644 --- a/packages/core/prisma/schema.prisma +++ b/packages/core/prisma/schema.prisma @@ -8,20 +8,16 @@ generator client { } model User { - createdAt DateTime @default(now()) - firstName String? - friendRelationships FriendRelationship[] @relation(name: "acceptor") - id String @id @default(cuid()) - invites FriendRelationship[] @relation(name: "inviter") - lastName String? - password String - privateMessages PrivateMessage[] @relation(name: "privateMessages") - receivedMessges PrivateMessage[] @relation(name: "receivedMessges") - roles Json - roomMessages RoomMessage[] - status EnumUserStatus? - updatedAt DateTime @updatedAt - username String @unique + createdAt DateTime @default(now()) + firstName String? + id String @id @default(cuid()) + lastName String? + password String + roles Json + roomMessages RoomMessage[] + status EnumUserStatus? + updatedAt DateTime @updatedAt + username String @unique } model Room { @@ -40,27 +36,6 @@ model RoomMessage { updatedAt DateTime @updatedAt } -model PrivateMessage { - content String? - createdAt DateTime @default(now()) - id String @id @default(cuid()) - receiver User? @relation(name: "receivedMessges", fields: [receiverId], references: [id]) - receiverId String? - sender User? @relation(name: "privateMessages", fields: [senderId], references: [id]) - senderId String? - updatedAt DateTime @updatedAt -} - -model FriendRelationship { - acceptor User? @relation(name: "acceptor", fields: [acceptorId], references: [id]) - acceptorId String? - createdAt DateTime @default(now()) - id String @id @default(cuid()) - inviter User? @relation(name: "inviter", fields: [inviterId], references: [id]) - inviterId String? - updatedAt DateTime @updatedAt -} - model ArcadeGame { commands Int? createdAt DateTime @default(now()) diff --git a/packages/core/scripts/seed.ts b/packages/core/scripts/seed.ts index 3bb4d3a..272dddd 100644 --- a/packages/core/scripts/seed.ts +++ b/packages/core/scripts/seed.ts @@ -1,8 +1,8 @@ import * as dotenv from "dotenv"; import { PrismaClient } from "@prisma/client"; +import { customSeed } from "./customSeed"; import { Salt, parseSalt } from "../src/auth/password.service"; import { hash } from "bcrypt"; -import { customSeed } from "./customSeed"; if (require.main === module) { dotenv.config(); @@ -12,7 +12,6 @@ if (require.main === module) { if (!BCRYPT_SALT) { throw new Error("BCRYPT_SALT environment variable must be defined"); } - const salt = parseSalt(BCRYPT_SALT); seed(salt).catch((error) => { @@ -25,16 +24,22 @@ async function seed(bcryptSalt: Salt) { console.info("Seeding database..."); const client = new PrismaClient(); + const data = { username: "admin", password: await hash("admin", bcryptSalt), roles: ["user"], }; + await client.user.upsert({ - where: { username: data.username }, + where: { + username: data.username, + }, + update: {}, create: data, }); + void client.$disconnect(); console.info("Seeding database with custom seed..."); diff --git a/packages/core/src/app.module.ts b/packages/core/src/app.module.ts index 0578bd5..d2d6d25 100644 --- a/packages/core/src/app.module.ts +++ b/packages/core/src/app.module.ts @@ -4,12 +4,9 @@ import { MorganInterceptor, MorganModule } from "nest-morgan"; import { UserModule } from "./user/user.module"; import { RoomModule } from "./room/room.module"; import { RoomMessageModule } from "./roomMessage/roomMessage.module"; -import { PrivateMessageModule } from "./privateMessage/privateMessage.module"; -import { FriendRelationshipModule } from "./friendRelationship/friendRelationship.module"; import { ArcadeGameModule } from "./arcadeGame/arcadeGame.module"; -import { ACLModule } from "./auth/acl.module"; -import { AuthModule } from "./auth/auth.module"; import { HealthModule } from "./health/health.module"; +import { PrismaModule } from "./prisma/prisma.module"; import { SecretsManagerModule } from "./providers/secrets/secretsManager.module"; import { KafkaModule } from "./kafka/kafka.module"; import { ConfigModule, ConfigService } from "@nestjs/config"; @@ -17,20 +14,21 @@ import { ServeStaticModule } from "@nestjs/serve-static"; import { ServeStaticOptionsService } from "./serveStaticOptions.service"; import { GraphQLModule } from "@nestjs/graphql"; +import { ACLModule } from "./auth/acl.module"; +import { AuthModule } from "./auth/auth.module"; + @Module({ controllers: [], imports: [ + ACLModule, + AuthModule, UserModule, RoomModule, RoomMessageModule, - PrivateMessageModule, - FriendRelationshipModule, ArcadeGameModule, - ACLModule, - AuthModule, HealthModule, + PrismaModule, SecretsManagerModule, - KafkaModule, MorganModule, ConfigModule.forRoot({ isGlobal: true }), ServeStaticModule.forRootAsync({ diff --git a/packages/core/src/arcadeGame/base/ArcadeGame.ts b/packages/core/src/arcadeGame/base/ArcadeGame.ts index c52333c..ddf3900 100644 --- a/packages/core/src/arcadeGame/base/ArcadeGame.ts +++ b/packages/core/src/arcadeGame/base/ArcadeGame.ts @@ -11,10 +11,12 @@ https://docs.amplication.com/how-to/custom-code */ import { ObjectType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; -import { IsInt, IsOptional, IsDate, IsString, IsJSON } from "class-validator"; +import { IsInt, IsOptional, IsDate, IsString } from "class-validator"; import { Type } from "class-transformer"; +import { IsJSONValue } from "@app/custom-validators"; import { GraphQLJSON } from "graphql-type-json"; import { JsonValue } from "type-fest"; + @ObjectType() class ArcadeGame { @ApiProperty({ @@ -50,7 +52,7 @@ class ArcadeGame { @ApiProperty({ required: false, }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -112,7 +114,7 @@ class ArcadeGame { @ApiProperty({ required: false, }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -122,7 +124,7 @@ class ArcadeGame { @ApiProperty({ required: false, }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -148,4 +150,5 @@ class ArcadeGame { @Field(() => Date) updatedAt!: Date; } -export { ArcadeGame }; + +export { ArcadeGame as ArcadeGame }; diff --git a/packages/core/src/arcadeGame/base/ArcadeGameCreateInput.ts b/packages/core/src/arcadeGame/base/ArcadeGameCreateInput.ts index b604dfe..e8e11bc 100644 --- a/packages/core/src/arcadeGame/base/ArcadeGameCreateInput.ts +++ b/packages/core/src/arcadeGame/base/ArcadeGameCreateInput.ts @@ -11,9 +11,11 @@ https://docs.amplication.com/how-to/custom-code */ import { InputType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; -import { IsInt, IsOptional, IsString, IsJSON } from "class-validator"; +import { IsInt, IsOptional, IsString } from "class-validator"; +import { IsJSONValue } from "@app/custom-validators"; import { GraphQLJSON } from "graphql-type-json"; import { InputJsonValue } from "../../types"; + @InputType() class ArcadeGameCreateInput { @ApiProperty({ @@ -41,7 +43,7 @@ class ArcadeGameCreateInput { @ApiProperty({ required: false, }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -95,7 +97,7 @@ class ArcadeGameCreateInput { @ApiProperty({ required: false, }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -105,7 +107,7 @@ class ArcadeGameCreateInput { @ApiProperty({ required: false, }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -123,4 +125,5 @@ class ArcadeGameCreateInput { }) sceneFish?: number | null; } -export { ArcadeGameCreateInput }; + +export { ArcadeGameCreateInput as ArcadeGameCreateInput }; diff --git a/packages/core/src/arcadeGame/base/ArcadeGameFindManyArgs.ts b/packages/core/src/arcadeGame/base/ArcadeGameFindManyArgs.ts index 8d90f36..2ee4e51 100644 --- a/packages/core/src/arcadeGame/base/ArcadeGameFindManyArgs.ts +++ b/packages/core/src/arcadeGame/base/ArcadeGameFindManyArgs.ts @@ -50,4 +50,4 @@ class ArcadeGameFindManyArgs { take?: number; } -export { ArcadeGameFindManyArgs }; +export { ArcadeGameFindManyArgs as ArcadeGameFindManyArgs }; diff --git a/packages/core/src/arcadeGame/base/ArcadeGameFindUniqueArgs.ts b/packages/core/src/arcadeGame/base/ArcadeGameFindUniqueArgs.ts index 86f6d7f..c1c1b64 100644 --- a/packages/core/src/arcadeGame/base/ArcadeGameFindUniqueArgs.ts +++ b/packages/core/src/arcadeGame/base/ArcadeGameFindUniqueArgs.ts @@ -18,4 +18,4 @@ class ArcadeGameFindUniqueArgs { where!: ArcadeGameWhereUniqueInput; } -export { ArcadeGameFindUniqueArgs }; +export { ArcadeGameFindUniqueArgs as ArcadeGameFindUniqueArgs }; diff --git a/packages/core/src/arcadeGame/base/ArcadeGameListRelationFilter.ts b/packages/core/src/arcadeGame/base/ArcadeGameListRelationFilter.ts index 18b22b1..d95da5c 100644 --- a/packages/core/src/arcadeGame/base/ArcadeGameListRelationFilter.ts +++ b/packages/core/src/arcadeGame/base/ArcadeGameListRelationFilter.ts @@ -53,4 +53,4 @@ class ArcadeGameListRelationFilter { }) none?: ArcadeGameWhereInput; } -export { ArcadeGameListRelationFilter }; +export { ArcadeGameListRelationFilter as ArcadeGameListRelationFilter }; diff --git a/packages/core/src/arcadeGame/base/ArcadeGameOrderByInput.ts b/packages/core/src/arcadeGame/base/ArcadeGameOrderByInput.ts index dbfb427..3a1450a 100644 --- a/packages/core/src/arcadeGame/base/ArcadeGameOrderByInput.ts +++ b/packages/core/src/arcadeGame/base/ArcadeGameOrderByInput.ts @@ -136,4 +136,4 @@ class ArcadeGameOrderByInput { updatedAt?: SortOrder; } -export { ArcadeGameOrderByInput }; +export { ArcadeGameOrderByInput as ArcadeGameOrderByInput }; diff --git a/packages/core/src/arcadeGame/base/ArcadeGameUpdateInput.ts b/packages/core/src/arcadeGame/base/ArcadeGameUpdateInput.ts index f395ebc..979c193 100644 --- a/packages/core/src/arcadeGame/base/ArcadeGameUpdateInput.ts +++ b/packages/core/src/arcadeGame/base/ArcadeGameUpdateInput.ts @@ -11,9 +11,11 @@ https://docs.amplication.com/how-to/custom-code */ import { InputType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; -import { IsInt, IsOptional, IsString, IsJSON } from "class-validator"; +import { IsInt, IsOptional, IsString } from "class-validator"; +import { IsJSONValue } from "@app/custom-validators"; import { GraphQLJSON } from "graphql-type-json"; import { InputJsonValue } from "../../types"; + @InputType() class ArcadeGameUpdateInput { @ApiProperty({ @@ -41,7 +43,7 @@ class ArcadeGameUpdateInput { @ApiProperty({ required: false, }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -95,7 +97,7 @@ class ArcadeGameUpdateInput { @ApiProperty({ required: false, }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -105,7 +107,7 @@ class ArcadeGameUpdateInput { @ApiProperty({ required: false, }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -123,4 +125,5 @@ class ArcadeGameUpdateInput { }) sceneFish?: number | null; } -export { ArcadeGameUpdateInput }; + +export { ArcadeGameUpdateInput as ArcadeGameUpdateInput }; diff --git a/packages/core/src/arcadeGame/base/ArcadeGameWhereInput.ts b/packages/core/src/arcadeGame/base/ArcadeGameWhereInput.ts index bdb5e99..9db9729 100644 --- a/packages/core/src/arcadeGame/base/ArcadeGameWhereInput.ts +++ b/packages/core/src/arcadeGame/base/ArcadeGameWhereInput.ts @@ -17,6 +17,7 @@ import { IsOptional } from "class-validator"; import { StringNullableFilter } from "../../util/StringNullableFilter"; import { JsonFilter } from "../../util/JsonFilter"; import { StringFilter } from "../../util/StringFilter"; + @InputType() class ArcadeGameWhereInput { @ApiProperty({ @@ -140,4 +141,5 @@ class ArcadeGameWhereInput { }) sceneFish?: IntNullableFilter; } -export { ArcadeGameWhereInput }; + +export { ArcadeGameWhereInput as ArcadeGameWhereInput }; diff --git a/packages/core/src/arcadeGame/base/ArcadeGameWhereUniqueInput.ts b/packages/core/src/arcadeGame/base/ArcadeGameWhereUniqueInput.ts index ec3060b..085a367 100644 --- a/packages/core/src/arcadeGame/base/ArcadeGameWhereUniqueInput.ts +++ b/packages/core/src/arcadeGame/base/ArcadeGameWhereUniqueInput.ts @@ -12,6 +12,7 @@ https://docs.amplication.com/how-to/custom-code import { InputType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; import { IsString } from "class-validator"; + @InputType() class ArcadeGameWhereUniqueInput { @ApiProperty({ @@ -22,4 +23,5 @@ class ArcadeGameWhereUniqueInput { @Field(() => String) id!: string; } -export { ArcadeGameWhereUniqueInput }; + +export { ArcadeGameWhereUniqueInput as ArcadeGameWhereUniqueInput }; diff --git a/packages/core/src/arcadeGame/base/CreateArcadeGameArgs.ts b/packages/core/src/arcadeGame/base/CreateArcadeGameArgs.ts index a29f213..4adaabe 100644 --- a/packages/core/src/arcadeGame/base/CreateArcadeGameArgs.ts +++ b/packages/core/src/arcadeGame/base/CreateArcadeGameArgs.ts @@ -18,4 +18,4 @@ class CreateArcadeGameArgs { data!: ArcadeGameCreateInput; } -export { CreateArcadeGameArgs }; +export { CreateArcadeGameArgs as CreateArcadeGameArgs }; diff --git a/packages/core/src/arcadeGame/base/DeleteArcadeGameArgs.ts b/packages/core/src/arcadeGame/base/DeleteArcadeGameArgs.ts index 9efcc9d..d1da07e 100644 --- a/packages/core/src/arcadeGame/base/DeleteArcadeGameArgs.ts +++ b/packages/core/src/arcadeGame/base/DeleteArcadeGameArgs.ts @@ -18,4 +18,4 @@ class DeleteArcadeGameArgs { where!: ArcadeGameWhereUniqueInput; } -export { DeleteArcadeGameArgs }; +export { DeleteArcadeGameArgs as DeleteArcadeGameArgs }; diff --git a/packages/core/src/arcadeGame/base/UpdateArcadeGameArgs.ts b/packages/core/src/arcadeGame/base/UpdateArcadeGameArgs.ts index e751371..2fb642e 100644 --- a/packages/core/src/arcadeGame/base/UpdateArcadeGameArgs.ts +++ b/packages/core/src/arcadeGame/base/UpdateArcadeGameArgs.ts @@ -21,4 +21,4 @@ class UpdateArcadeGameArgs { data!: ArcadeGameUpdateInput; } -export { UpdateArcadeGameArgs }; +export { UpdateArcadeGameArgs as UpdateArcadeGameArgs }; diff --git a/packages/core/src/arcadeGame/base/arcadeGame.controller.base.ts b/packages/core/src/arcadeGame/base/arcadeGame.controller.base.ts index 61d5d26..f648b63 100644 --- a/packages/core/src/arcadeGame/base/arcadeGame.controller.base.ts +++ b/packages/core/src/arcadeGame/base/arcadeGame.controller.base.ts @@ -11,13 +11,13 @@ https://docs.amplication.com/how-to/custom-code */ import * as common from "@nestjs/common"; import * as swagger from "@nestjs/swagger"; -import * as nestAccessControl from "nest-access-control"; -import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; import { isRecordNotFoundError } from "../../prisma.util"; import * as errors from "../../errors"; import { Request } from "express"; import { plainToClass } from "class-transformer"; import { ApiNestedQuery } from "../../decorators/api-nested-query.decorator"; +import * as nestAccessControl from "nest-access-control"; +import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; import { ArcadeGameService } from "../arcadeGame.service"; import { AclValidateRequestInterceptor } from "../../interceptors/aclValidateRequest.interceptor"; import { AclFilterResponseInterceptor } from "../../interceptors/aclFilterResponse.interceptor"; @@ -27,6 +27,7 @@ import { ArcadeGameWhereUniqueInput } from "./ArcadeGameWhereUniqueInput"; import { ArcadeGameFindManyArgs } from "./ArcadeGameFindManyArgs"; import { ArcadeGameUpdateInput } from "./ArcadeGameUpdateInput"; import { ArcadeGame } from "./ArcadeGame"; + @swagger.ApiBearerAuth() @common.UseGuards(defaultAuthGuard.DefaultAuthGuard, nestAccessControl.ACGuard) export class ArcadeGameControllerBase { @@ -34,16 +35,17 @@ export class ArcadeGameControllerBase { protected readonly service: ArcadeGameService, protected readonly rolesBuilder: nestAccessControl.RolesBuilder ) {} - @common.UseInterceptors(AclValidateRequestInterceptor) + @common.Post() + @swagger.ApiCreatedResponse({ type: ArcadeGame }) @nestAccessControl.UseRoles({ resource: "ArcadeGame", action: "create", possession: "any", }) - @common.Post() - @swagger.ApiCreatedResponse({ type: ArcadeGame }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async create( @common.Body() data: ArcadeGameCreateInput ): Promise { @@ -68,15 +70,17 @@ export class ArcadeGameControllerBase { } @common.UseInterceptors(AclFilterResponseInterceptor) + @common.Get() + @swagger.ApiOkResponse({ type: [ArcadeGame] }) + @ApiNestedQuery(ArcadeGameFindManyArgs) @nestAccessControl.UseRoles({ resource: "ArcadeGame", action: "read", possession: "any", }) - @common.Get() - @swagger.ApiOkResponse({ type: [ArcadeGame] }) - @swagger.ApiForbiddenResponse() - @ApiNestedQuery(ArcadeGameFindManyArgs) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async findMany(@common.Req() request: Request): Promise { const args = plainToClass(ArcadeGameFindManyArgs, request.query); return this.service.findMany({ @@ -100,15 +104,17 @@ export class ArcadeGameControllerBase { } @common.UseInterceptors(AclFilterResponseInterceptor) + @common.Get("/:id") + @swagger.ApiOkResponse({ type: ArcadeGame }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "ArcadeGame", action: "read", possession: "own", }) - @common.Get("/:id") - @swagger.ApiOkResponse({ type: ArcadeGame }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async findOne( @common.Param() params: ArcadeGameWhereUniqueInput ): Promise { @@ -139,15 +145,17 @@ export class ArcadeGameControllerBase { } @common.UseInterceptors(AclValidateRequestInterceptor) + @common.Patch("/:id") + @swagger.ApiOkResponse({ type: ArcadeGame }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "ArcadeGame", action: "update", possession: "any", }) - @common.Patch("/:id") - @swagger.ApiOkResponse({ type: ArcadeGame }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async update( @common.Param() params: ArcadeGameWhereUniqueInput, @common.Body() data: ArcadeGameUpdateInput @@ -182,15 +190,17 @@ export class ArcadeGameControllerBase { } } + @common.Delete("/:id") + @swagger.ApiOkResponse({ type: ArcadeGame }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "ArcadeGame", action: "delete", possession: "any", }) - @common.Delete("/:id") - @swagger.ApiOkResponse({ type: ArcadeGame }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async delete( @common.Param() params: ArcadeGameWhereUniqueInput ): Promise { diff --git a/packages/core/src/arcadeGame/base/arcadeGame.module.base.ts b/packages/core/src/arcadeGame/base/arcadeGame.module.base.ts index 2725fee..63fcfa5 100644 --- a/packages/core/src/arcadeGame/base/arcadeGame.module.base.ts +++ b/packages/core/src/arcadeGame/base/arcadeGame.module.base.ts @@ -11,18 +11,10 @@ https://docs.amplication.com/how-to/custom-code */ import { Module, forwardRef } from "@nestjs/common"; import { MorganModule } from "nest-morgan"; -import { PrismaModule } from "nestjs-prisma"; import { ACLModule } from "../../auth/acl.module"; import { AuthModule } from "../../auth/auth.module"; - @Module({ - imports: [ - ACLModule, - forwardRef(() => AuthModule), - MorganModule, - PrismaModule, - ], - - exports: [ACLModule, AuthModule, MorganModule, PrismaModule], + imports: [ACLModule, forwardRef(() => AuthModule), MorganModule], + exports: [ACLModule, AuthModule, MorganModule], }) export class ArcadeGameModuleBase {} diff --git a/packages/core/src/arcadeGame/base/arcadeGame.service.base.ts b/packages/core/src/arcadeGame/base/arcadeGame.service.base.ts index 5cbad32..386fc01 100644 --- a/packages/core/src/arcadeGame/base/arcadeGame.service.base.ts +++ b/packages/core/src/arcadeGame/base/arcadeGame.service.base.ts @@ -9,7 +9,7 @@ https://docs.amplication.com/how-to/custom-code ------------------------------------------------------------------------------ */ -import { PrismaService } from "nestjs-prisma"; +import { PrismaService } from "../../prisma/prisma.service"; import { Prisma, ArcadeGame } from "@prisma/client"; export class ArcadeGameServiceBase { diff --git a/packages/core/src/auth/UserInfo.ts b/packages/core/src/auth/UserInfo.ts index f1b1d3c..ef61dc4 100644 --- a/packages/core/src/auth/UserInfo.ts +++ b/packages/core/src/auth/UserInfo.ts @@ -1,5 +1,5 @@ import { Field, ObjectType } from "@nestjs/graphql"; -import { User } from "../user/base/user"; +import { User } from "../user/base/User"; @ObjectType() export class UserInfo implements Partial { diff --git a/packages/core/src/auth/auth.service.spec.ts b/packages/core/src/auth/auth.service.spec.ts new file mode 100644 index 0000000..aaa68e4 --- /dev/null +++ b/packages/core/src/auth/auth.service.spec.ts @@ -0,0 +1,118 @@ +import { Test, TestingModule } from "@nestjs/testing"; +// @ts-ignore +// eslint-disable-next-line +import { UserService } from "../user/user.service"; +import { AuthService } from "./auth.service"; +import { Credentials } from "./Credentials"; +import { PasswordService } from "./password.service"; +// @ts-ignore +// eslint-disable-next-line +import { TokenService } from "./token.service"; +import { VALID_ID } from "../tests/auth/constants"; + +const VALID_CREDENTIALS: Credentials = { + username: "Valid User", + password: "Valid User Password", +}; +const INVALID_CREDENTIALS: Credentials = { + username: "Invalid User", + password: "Invalid User Password", +}; +const USER: any = { + ...VALID_CREDENTIALS, + createdAt: new Date(), + firstName: "ofek", + id: VALID_ID, + lastName: "gabay", + roles: ["admin"], + updatedAt: new Date(), +}; + +const SIGN_TOKEN = "SIGN_TOKEN"; + +const userService = { + findOne(args: { where: { username: string } }): any | null { + if (args.where.username === VALID_CREDENTIALS.username) { + return USER; + } + return null; + }, +}; + +const passwordService = { + compare(password: string, encrypted: string) { + return true; + }, +}; + +const tokenService = { + createToken(username: string, password: string) { + return SIGN_TOKEN; + }, +}; + +describe("AuthService", () => { + //ARRANGE + let service: AuthService; + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + { + provide: UserService, + useValue: userService, + }, + { + provide: PasswordService, + useValue: passwordService, + }, + { + provide: TokenService, + useValue: tokenService, + }, + AuthService, + ], + }).compile(); + + service = module.get(AuthService); + }); + + it("should be defined", () => { + expect(service).toBeDefined(); + }); + + describe("Testing the authService.validateUser()", () => { + it("should validate a valid user", async () => { + await expect( + service.validateUser( + VALID_CREDENTIALS.username, + VALID_CREDENTIALS.password + ) + ).resolves.toEqual({ + username: USER.username, + roles: USER.roles, + id: USER.id, + }); + }); + + it("should not validate a invalid user", async () => { + await expect( + service.validateUser( + INVALID_CREDENTIALS.username, + INVALID_CREDENTIALS.password + ) + ).resolves.toBe(null); + }); + }); + + describe("Testing the authService.login()", () => { + it("should return userInfo object for correct username and password", async () => { + const loginResult = await service.login(VALID_CREDENTIALS); + expect(loginResult).toEqual({ + username: USER.username, + roles: USER.roles, + accessToken: SIGN_TOKEN, + id: USER.id, + }); + }); + }); +}); diff --git a/packages/core/src/auth/basic/base/basic.strategy.base.ts b/packages/core/src/auth/basic/base/basic.strategy.base.ts deleted file mode 100644 index e138356..0000000 --- a/packages/core/src/auth/basic/base/basic.strategy.base.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UnauthorizedException } from "@nestjs/common"; -import { PassportStrategy } from "@nestjs/passport"; -import { BasicStrategy as Strategy } from "passport-http"; -import { AuthService } from "../../auth.service"; -import { IAuthStrategy } from "../../IAuthStrategy"; -import { UserInfo } from "../../UserInfo"; - -export class BasicStrategyBase - extends PassportStrategy(Strategy) - implements IAuthStrategy -{ - constructor(protected readonly authService: AuthService) { - super(); - } - - async validate(username: string, password: string): Promise { - const user = await this.authService.validateUser(username, password); - if (!user) { - throw new UnauthorizedException(); - } - return user; - } -} diff --git a/packages/core/src/auth/basic/basic.strategy.ts b/packages/core/src/auth/basic/basic.strategy.ts deleted file mode 100644 index f087795..0000000 --- a/packages/core/src/auth/basic/basic.strategy.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from "@nestjs/common"; -import { AuthService } from "../auth.service"; -import { BasicStrategyBase } from "./base/basic.strategy.base"; - -@Injectable() -export class BasicStrategy extends BasicStrategyBase { - constructor(protected readonly authService: AuthService) { - super(authService); - } -} diff --git a/packages/core/src/auth/basic/basicAuth.guard.ts b/packages/core/src/auth/basic/basicAuth.guard.ts deleted file mode 100644 index 9c92fdd..0000000 --- a/packages/core/src/auth/basic/basicAuth.guard.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { AuthGuard } from "@nestjs/passport"; - -export class BasicAuthGuard extends AuthGuard("basic") {} diff --git a/packages/core/src/auth/jwt/jwt.strategy.ts b/packages/core/src/auth/jwt/jwt.strategy.ts index 0de5def..0794650 100644 --- a/packages/core/src/auth/jwt/jwt.strategy.ts +++ b/packages/core/src/auth/jwt/jwt.strategy.ts @@ -2,6 +2,7 @@ import { Inject, Injectable } from "@nestjs/common"; import { JWT_SECRET_KEY } from "../../constants"; import { UserService } from "../../user/user.service"; import { JwtStrategyBase } from "./base/jwt.strategy.base"; + @Injectable() export class JwtStrategy extends JwtStrategyBase { constructor( diff --git a/packages/core/src/auth/password.service.spec.ts b/packages/core/src/auth/password.service.spec.ts new file mode 100644 index 0000000..309c8c0 --- /dev/null +++ b/packages/core/src/auth/password.service.spec.ts @@ -0,0 +1,69 @@ +import { ConfigService } from "@nestjs/config"; +import { Test, TestingModule } from "@nestjs/testing"; +import { PasswordService } from "./password.service"; + +const EXAMPLE_PASSWORD = "examplePassword"; +const EXAMPLE_HASHED_PASSWORD = "exampleHashedPassword"; + +const EXAMPLE_SALT_OR_ROUNDS = 1; + +const configServiceGetMock = jest.fn(() => { + return EXAMPLE_SALT_OR_ROUNDS; +}); + +jest.mock("bcrypt", () => ({ + hash: jest.fn(), + compare: jest.fn(), +})); + +const { hash, compare } = jest.requireMock("bcrypt"); + +hash.mockImplementation(async () => EXAMPLE_HASHED_PASSWORD); + +compare.mockImplementation(async () => true); + +describe("PasswordService", () => { + let service: PasswordService; + + beforeEach(async () => { + jest.clearAllMocks(); + const module: TestingModule = await Test.createTestingModule({ + providers: [ + PasswordService, + { + provide: ConfigService, + useClass: jest.fn(() => ({ + get: configServiceGetMock, + })), + }, + ], + imports: [], + }).compile(); + + service = module.get(PasswordService); + }); + + it("should be defined", () => { + expect(service).toBeDefined(); + }); + + it("should have salt defined", () => { + expect(service.salt).toEqual(EXAMPLE_SALT_OR_ROUNDS); + }); + + it("should compare a password", async () => { + const args = { + password: EXAMPLE_PASSWORD, + hashedPassword: EXAMPLE_HASHED_PASSWORD, + }; + await expect( + service.compare(args.password, args.hashedPassword) + ).resolves.toEqual(true); + }); + + it("should hash a password", async () => { + await expect(service.hash(EXAMPLE_PASSWORD)).resolves.toEqual( + EXAMPLE_HASHED_PASSWORD + ); + }); +}); diff --git a/packages/core/src/auth/userData.decorator.ts b/packages/core/src/auth/userData.decorator.ts index 240c7d9..6a40ad1 100644 --- a/packages/core/src/auth/userData.decorator.ts +++ b/packages/core/src/auth/userData.decorator.ts @@ -1,6 +1,5 @@ import { createParamDecorator, ExecutionContext } from "@nestjs/common"; import { GqlContextType, GqlExecutionContext } from "@nestjs/graphql"; -//@ts-ignore import { User } from "@prisma/client"; /** diff --git a/packages/core/src/friendRelationship/base/CreateFriendRelationshipArgs.ts b/packages/core/src/friendRelationship/base/CreateFriendRelationshipArgs.ts deleted file mode 100644 index 176080a..0000000 --- a/packages/core/src/friendRelationship/base/CreateFriendRelationshipArgs.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { FriendRelationshipCreateInput } from "./FriendRelationshipCreateInput"; - -@ArgsType() -class CreateFriendRelationshipArgs { - @Field(() => FriendRelationshipCreateInput, { nullable: false }) - data!: FriendRelationshipCreateInput; -} - -export { CreateFriendRelationshipArgs }; diff --git a/packages/core/src/friendRelationship/base/DeleteFriendRelationshipArgs.ts b/packages/core/src/friendRelationship/base/DeleteFriendRelationshipArgs.ts deleted file mode 100644 index 8198189..0000000 --- a/packages/core/src/friendRelationship/base/DeleteFriendRelationshipArgs.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { FriendRelationshipWhereUniqueInput } from "./FriendRelationshipWhereUniqueInput"; - -@ArgsType() -class DeleteFriendRelationshipArgs { - @Field(() => FriendRelationshipWhereUniqueInput, { nullable: false }) - where!: FriendRelationshipWhereUniqueInput; -} - -export { DeleteFriendRelationshipArgs }; diff --git a/packages/core/src/friendRelationship/base/FriendRelationship.ts b/packages/core/src/friendRelationship/base/FriendRelationship.ts deleted file mode 100644 index 55b04d7..0000000 --- a/packages/core/src/friendRelationship/base/FriendRelationship.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ObjectType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { User } from "../../user/base/User"; -import { ValidateNested, IsOptional, IsDate, IsString } from "class-validator"; -import { Type } from "class-transformer"; -@ObjectType() -class FriendRelationship { - @ApiProperty({ - required: false, - type: () => User, - }) - @ValidateNested() - @Type(() => User) - @IsOptional() - acceptor?: User | null; - - @ApiProperty({ - required: true, - }) - @IsDate() - @Type(() => Date) - @Field(() => Date) - createdAt!: Date; - - @ApiProperty({ - required: true, - type: String, - }) - @IsString() - @Field(() => String) - id!: string; - - @ApiProperty({ - required: false, - type: () => User, - }) - @ValidateNested() - @Type(() => User) - @IsOptional() - inviter?: User | null; - - @ApiProperty({ - required: true, - }) - @IsDate() - @Type(() => Date) - @Field(() => Date) - updatedAt!: Date; -} -export { FriendRelationship }; diff --git a/packages/core/src/friendRelationship/base/FriendRelationshipCreateInput.ts b/packages/core/src/friendRelationship/base/FriendRelationshipCreateInput.ts deleted file mode 100644 index 6ba434a..0000000 --- a/packages/core/src/friendRelationship/base/FriendRelationshipCreateInput.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { UserWhereUniqueInput } from "../../user/base/UserWhereUniqueInput"; -import { ValidateNested, IsOptional } from "class-validator"; -import { Type } from "class-transformer"; -@InputType() -class FriendRelationshipCreateInput { - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - acceptor?: UserWhereUniqueInput | null; - - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - inviter?: UserWhereUniqueInput | null; -} -export { FriendRelationshipCreateInput }; diff --git a/packages/core/src/friendRelationship/base/FriendRelationshipFindManyArgs.ts b/packages/core/src/friendRelationship/base/FriendRelationshipFindManyArgs.ts deleted file mode 100644 index cbfd042..0000000 --- a/packages/core/src/friendRelationship/base/FriendRelationshipFindManyArgs.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { FriendRelationshipWhereInput } from "./FriendRelationshipWhereInput"; -import { Type } from "class-transformer"; -import { FriendRelationshipOrderByInput } from "./FriendRelationshipOrderByInput"; - -@ArgsType() -class FriendRelationshipFindManyArgs { - @ApiProperty({ - required: false, - type: () => FriendRelationshipWhereInput, - }) - @Field(() => FriendRelationshipWhereInput, { nullable: true }) - @Type(() => FriendRelationshipWhereInput) - where?: FriendRelationshipWhereInput; - - @ApiProperty({ - required: false, - type: [FriendRelationshipOrderByInput], - }) - @Field(() => [FriendRelationshipOrderByInput], { nullable: true }) - @Type(() => FriendRelationshipOrderByInput) - orderBy?: Array; - - @ApiProperty({ - required: false, - type: Number, - }) - @Field(() => Number, { nullable: true }) - @Type(() => Number) - skip?: number; - - @ApiProperty({ - required: false, - type: Number, - }) - @Field(() => Number, { nullable: true }) - @Type(() => Number) - take?: number; -} - -export { FriendRelationshipFindManyArgs }; diff --git a/packages/core/src/friendRelationship/base/FriendRelationshipFindUniqueArgs.ts b/packages/core/src/friendRelationship/base/FriendRelationshipFindUniqueArgs.ts deleted file mode 100644 index bbb14a8..0000000 --- a/packages/core/src/friendRelationship/base/FriendRelationshipFindUniqueArgs.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { FriendRelationshipWhereUniqueInput } from "./FriendRelationshipWhereUniqueInput"; - -@ArgsType() -class FriendRelationshipFindUniqueArgs { - @Field(() => FriendRelationshipWhereUniqueInput, { nullable: false }) - where!: FriendRelationshipWhereUniqueInput; -} - -export { FriendRelationshipFindUniqueArgs }; diff --git a/packages/core/src/friendRelationship/base/FriendRelationshipListRelationFilter.ts b/packages/core/src/friendRelationship/base/FriendRelationshipListRelationFilter.ts deleted file mode 100644 index 0053f41..0000000 --- a/packages/core/src/friendRelationship/base/FriendRelationshipListRelationFilter.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { FriendRelationshipWhereInput } from "./FriendRelationshipWhereInput"; -import { ValidateNested, IsOptional } from "class-validator"; -import { Type } from "class-transformer"; - -@InputType() -class FriendRelationshipListRelationFilter { - @ApiProperty({ - required: false, - type: () => FriendRelationshipWhereInput, - }) - @ValidateNested() - @Type(() => FriendRelationshipWhereInput) - @IsOptional() - @Field(() => FriendRelationshipWhereInput, { - nullable: true, - }) - every?: FriendRelationshipWhereInput; - - @ApiProperty({ - required: false, - type: () => FriendRelationshipWhereInput, - }) - @ValidateNested() - @Type(() => FriendRelationshipWhereInput) - @IsOptional() - @Field(() => FriendRelationshipWhereInput, { - nullable: true, - }) - some?: FriendRelationshipWhereInput; - - @ApiProperty({ - required: false, - type: () => FriendRelationshipWhereInput, - }) - @ValidateNested() - @Type(() => FriendRelationshipWhereInput) - @IsOptional() - @Field(() => FriendRelationshipWhereInput, { - nullable: true, - }) - none?: FriendRelationshipWhereInput; -} -export { FriendRelationshipListRelationFilter }; diff --git a/packages/core/src/friendRelationship/base/FriendRelationshipOrderByInput.ts b/packages/core/src/friendRelationship/base/FriendRelationshipOrderByInput.ts deleted file mode 100644 index 10a92db..0000000 --- a/packages/core/src/friendRelationship/base/FriendRelationshipOrderByInput.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { SortOrder } from "../../util/SortOrder"; - -@InputType({ - isAbstract: true, - description: undefined, -}) -class FriendRelationshipOrderByInput { - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - acceptorId?: SortOrder; - - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - createdAt?: SortOrder; - - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - id?: SortOrder; - - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - inviterId?: SortOrder; - - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - updatedAt?: SortOrder; -} - -export { FriendRelationshipOrderByInput }; diff --git a/packages/core/src/friendRelationship/base/FriendRelationshipUpdateInput.ts b/packages/core/src/friendRelationship/base/FriendRelationshipUpdateInput.ts deleted file mode 100644 index ea1d7af..0000000 --- a/packages/core/src/friendRelationship/base/FriendRelationshipUpdateInput.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { UserWhereUniqueInput } from "../../user/base/UserWhereUniqueInput"; -import { ValidateNested, IsOptional } from "class-validator"; -import { Type } from "class-transformer"; -@InputType() -class FriendRelationshipUpdateInput { - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - acceptor?: UserWhereUniqueInput | null; - - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - inviter?: UserWhereUniqueInput | null; -} -export { FriendRelationshipUpdateInput }; diff --git a/packages/core/src/friendRelationship/base/FriendRelationshipWhereInput.ts b/packages/core/src/friendRelationship/base/FriendRelationshipWhereInput.ts deleted file mode 100644 index 8960b60..0000000 --- a/packages/core/src/friendRelationship/base/FriendRelationshipWhereInput.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { UserWhereUniqueInput } from "../../user/base/UserWhereUniqueInput"; -import { ValidateNested, IsOptional } from "class-validator"; -import { Type } from "class-transformer"; -import { StringFilter } from "../../util/StringFilter"; -@InputType() -class FriendRelationshipWhereInput { - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - acceptor?: UserWhereUniqueInput; - - @ApiProperty({ - required: false, - type: StringFilter, - }) - @Type(() => StringFilter) - @IsOptional() - @Field(() => StringFilter, { - nullable: true, - }) - id?: StringFilter; - - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - inviter?: UserWhereUniqueInput; -} -export { FriendRelationshipWhereInput }; diff --git a/packages/core/src/friendRelationship/base/FriendRelationshipWhereUniqueInput.ts b/packages/core/src/friendRelationship/base/FriendRelationshipWhereUniqueInput.ts deleted file mode 100644 index 090a1f4..0000000 --- a/packages/core/src/friendRelationship/base/FriendRelationshipWhereUniqueInput.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { IsString } from "class-validator"; -@InputType() -class FriendRelationshipWhereUniqueInput { - @ApiProperty({ - required: true, - type: String, - }) - @IsString() - @Field(() => String) - id!: string; -} -export { FriendRelationshipWhereUniqueInput }; diff --git a/packages/core/src/friendRelationship/base/UpdateFriendRelationshipArgs.ts b/packages/core/src/friendRelationship/base/UpdateFriendRelationshipArgs.ts deleted file mode 100644 index cbec3b5..0000000 --- a/packages/core/src/friendRelationship/base/UpdateFriendRelationshipArgs.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { FriendRelationshipWhereUniqueInput } from "./FriendRelationshipWhereUniqueInput"; -import { FriendRelationshipUpdateInput } from "./FriendRelationshipUpdateInput"; - -@ArgsType() -class UpdateFriendRelationshipArgs { - @Field(() => FriendRelationshipWhereUniqueInput, { nullable: false }) - where!: FriendRelationshipWhereUniqueInput; - @Field(() => FriendRelationshipUpdateInput, { nullable: false }) - data!: FriendRelationshipUpdateInput; -} - -export { UpdateFriendRelationshipArgs }; diff --git a/packages/core/src/friendRelationship/base/friendRelationship.controller.base.spec.ts b/packages/core/src/friendRelationship/base/friendRelationship.controller.base.spec.ts deleted file mode 100644 index 0a07542..0000000 --- a/packages/core/src/friendRelationship/base/friendRelationship.controller.base.spec.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { Test } from "@nestjs/testing"; -import { - INestApplication, - HttpStatus, - ExecutionContext, - CallHandler, -} from "@nestjs/common"; -import request from "supertest"; -import { MorganModule } from "nest-morgan"; -import { ACGuard } from "nest-access-control"; -import { DefaultAuthGuard } from "../../auth/defaultAuth.guard"; -import { ACLModule } from "../../auth/acl.module"; -import { AclFilterResponseInterceptor } from "../../interceptors/aclFilterResponse.interceptor"; -import { AclValidateRequestInterceptor } from "../../interceptors/aclValidateRequest.interceptor"; -import { map } from "rxjs"; -import { FriendRelationshipController } from "../friendRelationship.controller"; -import { FriendRelationshipService } from "../friendRelationship.service"; - -const nonExistingId = "nonExistingId"; -const existingId = "existingId"; -const CREATE_INPUT = { - createdAt: new Date(), - id: "exampleId", - updatedAt: new Date(), -}; -const CREATE_RESULT = { - createdAt: new Date(), - id: "exampleId", - updatedAt: new Date(), -}; -const FIND_MANY_RESULT = [ - { - createdAt: new Date(), - id: "exampleId", - updatedAt: new Date(), - }, -]; -const FIND_ONE_RESULT = { - createdAt: new Date(), - id: "exampleId", - updatedAt: new Date(), -}; - -const service = { - create() { - return CREATE_RESULT; - }, - findMany: () => FIND_MANY_RESULT, - findOne: ({ where }: { where: { id: string } }) => { - switch (where.id) { - case existingId: - return FIND_ONE_RESULT; - case nonExistingId: - return null; - } - }, -}; - -const basicAuthGuard = { - canActivate: (context: ExecutionContext) => { - const argumentHost = context.switchToHttp(); - const request = argumentHost.getRequest(); - request.user = { - roles: ["user"], - }; - return true; - }, -}; - -const acGuard = { - canActivate: () => { - return true; - }, -}; - -const aclFilterResponseInterceptor = { - intercept: (context: ExecutionContext, next: CallHandler) => { - return next.handle().pipe( - map((data) => { - return data; - }) - ); - }, -}; -const aclValidateRequestInterceptor = { - intercept: (context: ExecutionContext, next: CallHandler) => { - return next.handle(); - }, -}; - -describe("FriendRelationship", () => { - let app: INestApplication; - - beforeAll(async () => { - const moduleRef = await Test.createTestingModule({ - providers: [ - { - provide: FriendRelationshipService, - useValue: service, - }, - ], - controllers: [FriendRelationshipController], - imports: [MorganModule.forRoot(), ACLModule], - }) - .overrideGuard(DefaultAuthGuard) - .useValue(basicAuthGuard) - .overrideGuard(ACGuard) - .useValue(acGuard) - .overrideInterceptor(AclFilterResponseInterceptor) - .useValue(aclFilterResponseInterceptor) - .overrideInterceptor(AclValidateRequestInterceptor) - .useValue(aclValidateRequestInterceptor) - .compile(); - - app = moduleRef.createNestApplication(); - await app.init(); - }); - - test("POST /friendRelationships", async () => { - await request(app.getHttpServer()) - .post("/friendRelationships") - .send(CREATE_INPUT) - .expect(HttpStatus.CREATED) - .expect({ - ...CREATE_RESULT, - createdAt: CREATE_RESULT.createdAt.toISOString(), - updatedAt: CREATE_RESULT.updatedAt.toISOString(), - }); - }); - - test("GET /friendRelationships", async () => { - await request(app.getHttpServer()) - .get("/friendRelationships") - .expect(HttpStatus.OK) - .expect([ - { - ...FIND_MANY_RESULT[0], - createdAt: FIND_MANY_RESULT[0].createdAt.toISOString(), - updatedAt: FIND_MANY_RESULT[0].updatedAt.toISOString(), - }, - ]); - }); - - test("GET /friendRelationships/:id non existing", async () => { - await request(app.getHttpServer()) - .get(`${"/friendRelationships"}/${nonExistingId}`) - .expect(HttpStatus.NOT_FOUND) - .expect({ - statusCode: HttpStatus.NOT_FOUND, - message: `No resource was found for {"${"id"}":"${nonExistingId}"}`, - error: "Not Found", - }); - }); - - test("GET /friendRelationships/:id existing", async () => { - await request(app.getHttpServer()) - .get(`${"/friendRelationships"}/${existingId}`) - .expect(HttpStatus.OK) - .expect({ - ...FIND_ONE_RESULT, - createdAt: FIND_ONE_RESULT.createdAt.toISOString(), - updatedAt: FIND_ONE_RESULT.updatedAt.toISOString(), - }); - }); - - test("POST /friendRelationships existing resource", async () => { - let agent = request(app.getHttpServer()); - await agent - .post("/friendRelationships") - .send(CREATE_INPUT) - .expect(HttpStatus.CREATED) - .expect({ - ...CREATE_RESULT, - createdAt: CREATE_RESULT.createdAt.toISOString(), - updatedAt: CREATE_RESULT.updatedAt.toISOString(), - }) - .then(function () { - agent - .post("/friendRelationships") - .send(CREATE_INPUT) - .expect(HttpStatus.CONFLICT) - .expect({ - statusCode: HttpStatus.CONFLICT, - }); - }); - }); - - afterAll(async () => { - await app.close(); - }); -}); diff --git a/packages/core/src/friendRelationship/base/friendRelationship.controller.base.ts b/packages/core/src/friendRelationship/base/friendRelationship.controller.base.ts deleted file mode 100644 index e3bf358..0000000 --- a/packages/core/src/friendRelationship/base/friendRelationship.controller.base.ts +++ /dev/null @@ -1,270 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import * as common from "@nestjs/common"; -import * as swagger from "@nestjs/swagger"; -import * as nestAccessControl from "nest-access-control"; -import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; -import { isRecordNotFoundError } from "../../prisma.util"; -import * as errors from "../../errors"; -import { Request } from "express"; -import { plainToClass } from "class-transformer"; -import { ApiNestedQuery } from "../../decorators/api-nested-query.decorator"; -import { FriendRelationshipService } from "../friendRelationship.service"; -import { AclValidateRequestInterceptor } from "../../interceptors/aclValidateRequest.interceptor"; -import { AclFilterResponseInterceptor } from "../../interceptors/aclFilterResponse.interceptor"; -import { FriendRelationshipCreateInput } from "./FriendRelationshipCreateInput"; -import { FriendRelationshipWhereInput } from "./FriendRelationshipWhereInput"; -import { FriendRelationshipWhereUniqueInput } from "./FriendRelationshipWhereUniqueInput"; -import { FriendRelationshipFindManyArgs } from "./FriendRelationshipFindManyArgs"; -import { FriendRelationshipUpdateInput } from "./FriendRelationshipUpdateInput"; -import { FriendRelationship } from "./FriendRelationship"; -@swagger.ApiBearerAuth() -@common.UseGuards(defaultAuthGuard.DefaultAuthGuard, nestAccessControl.ACGuard) -export class FriendRelationshipControllerBase { - constructor( - protected readonly service: FriendRelationshipService, - protected readonly rolesBuilder: nestAccessControl.RolesBuilder - ) {} - - @common.UseInterceptors(AclValidateRequestInterceptor) - @nestAccessControl.UseRoles({ - resource: "FriendRelationship", - action: "create", - possession: "any", - }) - @common.Post() - @swagger.ApiCreatedResponse({ type: FriendRelationship }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) - async create( - @common.Body() data: FriendRelationshipCreateInput - ): Promise { - return await this.service.create({ - data: { - ...data, - - acceptor: data.acceptor - ? { - connect: data.acceptor, - } - : undefined, - - inviter: data.inviter - ? { - connect: data.inviter, - } - : undefined, - }, - select: { - acceptor: { - select: { - id: true, - }, - }, - - createdAt: true, - id: true, - - inviter: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - } - - @common.UseInterceptors(AclFilterResponseInterceptor) - @nestAccessControl.UseRoles({ - resource: "FriendRelationship", - action: "read", - possession: "any", - }) - @common.Get() - @swagger.ApiOkResponse({ type: [FriendRelationship] }) - @swagger.ApiForbiddenResponse() - @ApiNestedQuery(FriendRelationshipFindManyArgs) - async findMany( - @common.Req() request: Request - ): Promise { - const args = plainToClass(FriendRelationshipFindManyArgs, request.query); - return this.service.findMany({ - ...args, - select: { - acceptor: { - select: { - id: true, - }, - }, - - createdAt: true, - id: true, - - inviter: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - } - - @common.UseInterceptors(AclFilterResponseInterceptor) - @nestAccessControl.UseRoles({ - resource: "FriendRelationship", - action: "read", - possession: "own", - }) - @common.Get("/:id") - @swagger.ApiOkResponse({ type: FriendRelationship }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) - async findOne( - @common.Param() params: FriendRelationshipWhereUniqueInput - ): Promise { - const result = await this.service.findOne({ - where: params, - select: { - acceptor: { - select: { - id: true, - }, - }, - - createdAt: true, - id: true, - - inviter: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - if (result === null) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - return result; - } - - @common.UseInterceptors(AclValidateRequestInterceptor) - @nestAccessControl.UseRoles({ - resource: "FriendRelationship", - action: "update", - possession: "any", - }) - @common.Patch("/:id") - @swagger.ApiOkResponse({ type: FriendRelationship }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) - async update( - @common.Param() params: FriendRelationshipWhereUniqueInput, - @common.Body() data: FriendRelationshipUpdateInput - ): Promise { - try { - return await this.service.update({ - where: params, - data: { - ...data, - - acceptor: data.acceptor - ? { - connect: data.acceptor, - } - : undefined, - - inviter: data.inviter - ? { - connect: data.inviter, - } - : undefined, - }, - select: { - acceptor: { - select: { - id: true, - }, - }, - - createdAt: true, - id: true, - - inviter: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - } catch (error) { - if (isRecordNotFoundError(error)) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - throw error; - } - } - - @nestAccessControl.UseRoles({ - resource: "FriendRelationship", - action: "delete", - possession: "any", - }) - @common.Delete("/:id") - @swagger.ApiOkResponse({ type: FriendRelationship }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) - async delete( - @common.Param() params: FriendRelationshipWhereUniqueInput - ): Promise { - try { - return await this.service.delete({ - where: params, - select: { - acceptor: { - select: { - id: true, - }, - }, - - createdAt: true, - id: true, - - inviter: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - } catch (error) { - if (isRecordNotFoundError(error)) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - throw error; - } - } -} diff --git a/packages/core/src/friendRelationship/base/friendRelationship.module.base.ts b/packages/core/src/friendRelationship/base/friendRelationship.module.base.ts deleted file mode 100644 index 5ba0ae1..0000000 --- a/packages/core/src/friendRelationship/base/friendRelationship.module.base.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { Module, forwardRef } from "@nestjs/common"; -import { MorganModule } from "nest-morgan"; -import { PrismaModule } from "nestjs-prisma"; -import { ACLModule } from "../../auth/acl.module"; -import { AuthModule } from "../../auth/auth.module"; - -@Module({ - imports: [ - ACLModule, - forwardRef(() => AuthModule), - MorganModule, - PrismaModule, - ], - - exports: [ACLModule, AuthModule, MorganModule, PrismaModule], -}) -export class FriendRelationshipModuleBase {} diff --git a/packages/core/src/friendRelationship/base/friendRelationship.service.base.ts b/packages/core/src/friendRelationship/base/friendRelationship.service.base.ts deleted file mode 100644 index 448909f..0000000 --- a/packages/core/src/friendRelationship/base/friendRelationship.service.base.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { PrismaService } from "nestjs-prisma"; -import { Prisma, FriendRelationship, User } from "@prisma/client"; - -export class FriendRelationshipServiceBase { - constructor(protected readonly prisma: PrismaService) {} - - async count( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.friendRelationship.count(args); - } - - async findMany( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.friendRelationship.findMany(args); - } - async findOne( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.friendRelationship.findUnique(args); - } - async create( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.friendRelationship.create(args); - } - async update( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.friendRelationship.update(args); - } - async delete( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.friendRelationship.delete(args); - } - - async getAcceptor(parentId: string): Promise { - return this.prisma.friendRelationship - .findUnique({ - where: { id: parentId }, - }) - .acceptor(); - } - - async getInviter(parentId: string): Promise { - return this.prisma.friendRelationship - .findUnique({ - where: { id: parentId }, - }) - .inviter(); - } -} diff --git a/packages/core/src/friendRelationship/friendRelationship.controller.ts b/packages/core/src/friendRelationship/friendRelationship.controller.ts deleted file mode 100644 index f4b5abc..0000000 --- a/packages/core/src/friendRelationship/friendRelationship.controller.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as common from "@nestjs/common"; -import * as swagger from "@nestjs/swagger"; -import * as nestAccessControl from "nest-access-control"; -import { FriendRelationshipService } from "./friendRelationship.service"; -import { FriendRelationshipControllerBase } from "./base/friendRelationship.controller.base"; - -@swagger.ApiTags("friendRelationships") -@common.Controller("friendRelationships") -export class FriendRelationshipController extends FriendRelationshipControllerBase { - constructor( - protected readonly service: FriendRelationshipService, - @nestAccessControl.InjectRolesBuilder() - protected readonly rolesBuilder: nestAccessControl.RolesBuilder - ) { - super(service, rolesBuilder); - } -} diff --git a/packages/core/src/friendRelationship/friendRelationship.module.ts b/packages/core/src/friendRelationship/friendRelationship.module.ts deleted file mode 100644 index da706ad..0000000 --- a/packages/core/src/friendRelationship/friendRelationship.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from "@nestjs/common"; -import { FriendRelationshipModuleBase } from "./base/friendRelationship.module.base"; -import { FriendRelationshipService } from "./friendRelationship.service"; -import { FriendRelationshipController } from "./friendRelationship.controller"; - -@Module({ - imports: [FriendRelationshipModuleBase], - controllers: [FriendRelationshipController], - providers: [FriendRelationshipService], - exports: [FriendRelationshipService], -}) -export class FriendRelationshipModule {} diff --git a/packages/core/src/friendRelationship/friendRelationship.service.ts b/packages/core/src/friendRelationship/friendRelationship.service.ts deleted file mode 100644 index b5d7337..0000000 --- a/packages/core/src/friendRelationship/friendRelationship.service.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from "@nestjs/common"; -import { PrismaService } from "nestjs-prisma"; -import { FriendRelationshipServiceBase } from "./base/friendRelationship.service.base"; - -@Injectable() -export class FriendRelationshipService extends FriendRelationshipServiceBase { - constructor(protected readonly prisma: PrismaService) { - super(prisma); - } -} diff --git a/packages/core/src/grants.json b/packages/core/src/grants.json index 4f208b9..d8f8dba 100644 --- a/packages/core/src/grants.json +++ b/packages/core/src/grants.json @@ -89,66 +89,6 @@ "action": "read:any", "attributes": "*" }, - { - "role": "user", - "resource": "PrivateMessage", - "action": "read:own", - "attributes": "*" - }, - { - "role": "user", - "resource": "PrivateMessage", - "action": "create:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "PrivateMessage", - "action": "update:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "PrivateMessage", - "action": "delete:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "PrivateMessage", - "action": "read:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "FriendRelationship", - "action": "read:own", - "attributes": "*" - }, - { - "role": "user", - "resource": "FriendRelationship", - "action": "create:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "FriendRelationship", - "action": "update:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "FriendRelationship", - "action": "delete:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "FriendRelationship", - "action": "read:any", - "attributes": "*" - }, { "role": "user", "resource": "ArcadeGame", @@ -179,4 +119,4 @@ "action": "read:any", "attributes": "*" } -] \ No newline at end of file +] diff --git a/packages/core/src/health/base/health.service.base.ts b/packages/core/src/health/base/health.service.base.ts index 0db85da..49a93a5 100644 --- a/packages/core/src/health/base/health.service.base.ts +++ b/packages/core/src/health/base/health.service.base.ts @@ -1,5 +1,5 @@ import { Injectable } from "@nestjs/common"; -import { PrismaService } from "nestjs-prisma"; +import { PrismaService } from "../../prisma/prisma.service"; @Injectable() export class HealthServiceBase { diff --git a/packages/core/src/prisma.util.spec.ts b/packages/core/src/prisma.util.spec.ts new file mode 100644 index 0000000..0aa308e --- /dev/null +++ b/packages/core/src/prisma.util.spec.ts @@ -0,0 +1,23 @@ +import { + isRecordNotFoundError, + PRISMA_QUERY_INTERPRETATION_ERROR, +} from "./prisma.util"; + +describe("isRecordNotFoundError", () => { + test("returns true for record not found error", () => { + expect( + isRecordNotFoundError( + Object.assign( + new Error(`Error occurred during query execution: + InterpretationError("Error for binding '0': RecordNotFound("Record to update not found.")")`), + { + code: PRISMA_QUERY_INTERPRETATION_ERROR, + } + ) + ) + ).toBe(true); + }); + test("returns false for any other error", () => { + expect(isRecordNotFoundError(new Error())).toBe(false); + }); +}); diff --git a/packages/core/src/prisma/prisma.module.ts b/packages/core/src/prisma/prisma.module.ts new file mode 100644 index 0000000..1edbf95 --- /dev/null +++ b/packages/core/src/prisma/prisma.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from "@nestjs/common"; +import { PrismaService } from "./prisma.service"; + +@Global() +@Module({ + providers: [PrismaService], + exports: [PrismaService], +}) +export class PrismaModule {} diff --git a/packages/core/src/prisma/prisma.service.ts b/packages/core/src/prisma/prisma.service.ts new file mode 100644 index 0000000..3fb4081 --- /dev/null +++ b/packages/core/src/prisma/prisma.service.ts @@ -0,0 +1,15 @@ +import { Injectable, OnModuleInit, INestApplication } from "@nestjs/common"; +import { PrismaClient } from "@prisma/client"; + +@Injectable() +export class PrismaService extends PrismaClient implements OnModuleInit { + async onModuleInit() { + await this.$connect(); + } + + async enableShutdownHooks(app: INestApplication) { + this.$on("beforeExit", async () => { + await app.close(); + }); + } +} diff --git a/packages/core/src/privateMessage/base/CreatePrivateMessageArgs.ts b/packages/core/src/privateMessage/base/CreatePrivateMessageArgs.ts deleted file mode 100644 index 2946cc9..0000000 --- a/packages/core/src/privateMessage/base/CreatePrivateMessageArgs.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { PrivateMessageCreateInput } from "./PrivateMessageCreateInput"; - -@ArgsType() -class CreatePrivateMessageArgs { - @Field(() => PrivateMessageCreateInput, { nullable: false }) - data!: PrivateMessageCreateInput; -} - -export { CreatePrivateMessageArgs }; diff --git a/packages/core/src/privateMessage/base/DeletePrivateMessageArgs.ts b/packages/core/src/privateMessage/base/DeletePrivateMessageArgs.ts deleted file mode 100644 index 0113db5..0000000 --- a/packages/core/src/privateMessage/base/DeletePrivateMessageArgs.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { PrivateMessageWhereUniqueInput } from "./PrivateMessageWhereUniqueInput"; - -@ArgsType() -class DeletePrivateMessageArgs { - @Field(() => PrivateMessageWhereUniqueInput, { nullable: false }) - where!: PrivateMessageWhereUniqueInput; -} - -export { DeletePrivateMessageArgs }; diff --git a/packages/core/src/privateMessage/base/PrivateMessage.ts b/packages/core/src/privateMessage/base/PrivateMessage.ts deleted file mode 100644 index 59311c3..0000000 --- a/packages/core/src/privateMessage/base/PrivateMessage.ts +++ /dev/null @@ -1,72 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ObjectType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { IsString, IsOptional, IsDate, ValidateNested } from "class-validator"; -import { Type } from "class-transformer"; -import { User } from "../../user/base/User"; -@ObjectType() -class PrivateMessage { - @ApiProperty({ - required: false, - type: String, - }) - @IsString() - @IsOptional() - @Field(() => String, { - nullable: true, - }) - content!: string | null; - - @ApiProperty({ - required: true, - }) - @IsDate() - @Type(() => Date) - @Field(() => Date) - createdAt!: Date; - - @ApiProperty({ - required: true, - type: String, - }) - @IsString() - @Field(() => String) - id!: string; - - @ApiProperty({ - required: false, - type: () => User, - }) - @ValidateNested() - @Type(() => User) - @IsOptional() - receiver?: User | null; - - @ApiProperty({ - required: false, - type: () => User, - }) - @ValidateNested() - @Type(() => User) - @IsOptional() - sender?: User | null; - - @ApiProperty({ - required: true, - }) - @IsDate() - @Type(() => Date) - @Field(() => Date) - updatedAt!: Date; -} -export { PrivateMessage }; diff --git a/packages/core/src/privateMessage/base/PrivateMessageCreateInput.ts b/packages/core/src/privateMessage/base/PrivateMessageCreateInput.ts deleted file mode 100644 index 6d5980d..0000000 --- a/packages/core/src/privateMessage/base/PrivateMessageCreateInput.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { IsString, IsOptional, ValidateNested } from "class-validator"; -import { UserWhereUniqueInput } from "../../user/base/UserWhereUniqueInput"; -import { Type } from "class-transformer"; -@InputType() -class PrivateMessageCreateInput { - @ApiProperty({ - required: false, - type: String, - }) - @IsString() - @IsOptional() - @Field(() => String, { - nullable: true, - }) - content?: string | null; - - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - receiver?: UserWhereUniqueInput | null; - - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - sender?: UserWhereUniqueInput | null; -} -export { PrivateMessageCreateInput }; diff --git a/packages/core/src/privateMessage/base/PrivateMessageFindManyArgs.ts b/packages/core/src/privateMessage/base/PrivateMessageFindManyArgs.ts deleted file mode 100644 index 84327db..0000000 --- a/packages/core/src/privateMessage/base/PrivateMessageFindManyArgs.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { PrivateMessageWhereInput } from "./PrivateMessageWhereInput"; -import { Type } from "class-transformer"; -import { PrivateMessageOrderByInput } from "./PrivateMessageOrderByInput"; - -@ArgsType() -class PrivateMessageFindManyArgs { - @ApiProperty({ - required: false, - type: () => PrivateMessageWhereInput, - }) - @Field(() => PrivateMessageWhereInput, { nullable: true }) - @Type(() => PrivateMessageWhereInput) - where?: PrivateMessageWhereInput; - - @ApiProperty({ - required: false, - type: [PrivateMessageOrderByInput], - }) - @Field(() => [PrivateMessageOrderByInput], { nullable: true }) - @Type(() => PrivateMessageOrderByInput) - orderBy?: Array; - - @ApiProperty({ - required: false, - type: Number, - }) - @Field(() => Number, { nullable: true }) - @Type(() => Number) - skip?: number; - - @ApiProperty({ - required: false, - type: Number, - }) - @Field(() => Number, { nullable: true }) - @Type(() => Number) - take?: number; -} - -export { PrivateMessageFindManyArgs }; diff --git a/packages/core/src/privateMessage/base/PrivateMessageFindUniqueArgs.ts b/packages/core/src/privateMessage/base/PrivateMessageFindUniqueArgs.ts deleted file mode 100644 index 3a7229f..0000000 --- a/packages/core/src/privateMessage/base/PrivateMessageFindUniqueArgs.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { PrivateMessageWhereUniqueInput } from "./PrivateMessageWhereUniqueInput"; - -@ArgsType() -class PrivateMessageFindUniqueArgs { - @Field(() => PrivateMessageWhereUniqueInput, { nullable: false }) - where!: PrivateMessageWhereUniqueInput; -} - -export { PrivateMessageFindUniqueArgs }; diff --git a/packages/core/src/privateMessage/base/PrivateMessageListRelationFilter.ts b/packages/core/src/privateMessage/base/PrivateMessageListRelationFilter.ts deleted file mode 100644 index 5a8166f..0000000 --- a/packages/core/src/privateMessage/base/PrivateMessageListRelationFilter.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { PrivateMessageWhereInput } from "./PrivateMessageWhereInput"; -import { ValidateNested, IsOptional } from "class-validator"; -import { Type } from "class-transformer"; - -@InputType() -class PrivateMessageListRelationFilter { - @ApiProperty({ - required: false, - type: () => PrivateMessageWhereInput, - }) - @ValidateNested() - @Type(() => PrivateMessageWhereInput) - @IsOptional() - @Field(() => PrivateMessageWhereInput, { - nullable: true, - }) - every?: PrivateMessageWhereInput; - - @ApiProperty({ - required: false, - type: () => PrivateMessageWhereInput, - }) - @ValidateNested() - @Type(() => PrivateMessageWhereInput) - @IsOptional() - @Field(() => PrivateMessageWhereInput, { - nullable: true, - }) - some?: PrivateMessageWhereInput; - - @ApiProperty({ - required: false, - type: () => PrivateMessageWhereInput, - }) - @ValidateNested() - @Type(() => PrivateMessageWhereInput) - @IsOptional() - @Field(() => PrivateMessageWhereInput, { - nullable: true, - }) - none?: PrivateMessageWhereInput; -} -export { PrivateMessageListRelationFilter }; diff --git a/packages/core/src/privateMessage/base/PrivateMessageOrderByInput.ts b/packages/core/src/privateMessage/base/PrivateMessageOrderByInput.ts deleted file mode 100644 index 03c3820..0000000 --- a/packages/core/src/privateMessage/base/PrivateMessageOrderByInput.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { SortOrder } from "../../util/SortOrder"; - -@InputType({ - isAbstract: true, - description: undefined, -}) -class PrivateMessageOrderByInput { - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - content?: SortOrder; - - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - createdAt?: SortOrder; - - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - id?: SortOrder; - - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - receiverId?: SortOrder; - - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - senderId?: SortOrder; - - @ApiProperty({ - required: false, - enum: ["asc", "desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - updatedAt?: SortOrder; -} - -export { PrivateMessageOrderByInput }; diff --git a/packages/core/src/privateMessage/base/PrivateMessageUpdateInput.ts b/packages/core/src/privateMessage/base/PrivateMessageUpdateInput.ts deleted file mode 100644 index 9136be5..0000000 --- a/packages/core/src/privateMessage/base/PrivateMessageUpdateInput.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { IsString, IsOptional, ValidateNested } from "class-validator"; -import { UserWhereUniqueInput } from "../../user/base/UserWhereUniqueInput"; -import { Type } from "class-transformer"; -@InputType() -class PrivateMessageUpdateInput { - @ApiProperty({ - required: false, - type: String, - }) - @IsString() - @IsOptional() - @Field(() => String, { - nullable: true, - }) - content?: string | null; - - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - receiver?: UserWhereUniqueInput | null; - - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - sender?: UserWhereUniqueInput | null; -} -export { PrivateMessageUpdateInput }; diff --git a/packages/core/src/privateMessage/base/PrivateMessageWhereInput.ts b/packages/core/src/privateMessage/base/PrivateMessageWhereInput.ts deleted file mode 100644 index 9f132da..0000000 --- a/packages/core/src/privateMessage/base/PrivateMessageWhereInput.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { StringNullableFilter } from "../../util/StringNullableFilter"; -import { Type } from "class-transformer"; -import { IsOptional, ValidateNested } from "class-validator"; -import { StringFilter } from "../../util/StringFilter"; -import { UserWhereUniqueInput } from "../../user/base/UserWhereUniqueInput"; -@InputType() -class PrivateMessageWhereInput { - @ApiProperty({ - required: false, - type: StringNullableFilter, - }) - @Type(() => StringNullableFilter) - @IsOptional() - @Field(() => StringNullableFilter, { - nullable: true, - }) - content?: StringNullableFilter; - - @ApiProperty({ - required: false, - type: StringFilter, - }) - @Type(() => StringFilter) - @IsOptional() - @Field(() => StringFilter, { - nullable: true, - }) - id?: StringFilter; - - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - receiver?: UserWhereUniqueInput; - - @ApiProperty({ - required: false, - type: () => UserWhereUniqueInput, - }) - @ValidateNested() - @Type(() => UserWhereUniqueInput) - @IsOptional() - @Field(() => UserWhereUniqueInput, { - nullable: true, - }) - sender?: UserWhereUniqueInput; -} -export { PrivateMessageWhereInput }; diff --git a/packages/core/src/privateMessage/base/PrivateMessageWhereUniqueInput.ts b/packages/core/src/privateMessage/base/PrivateMessageWhereUniqueInput.ts deleted file mode 100644 index 76c0e0a..0000000 --- a/packages/core/src/privateMessage/base/PrivateMessageWhereUniqueInput.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { ApiProperty } from "@nestjs/swagger"; -import { IsString } from "class-validator"; -@InputType() -class PrivateMessageWhereUniqueInput { - @ApiProperty({ - required: true, - type: String, - }) - @IsString() - @Field(() => String) - id!: string; -} -export { PrivateMessageWhereUniqueInput }; diff --git a/packages/core/src/privateMessage/base/UpdatePrivateMessageArgs.ts b/packages/core/src/privateMessage/base/UpdatePrivateMessageArgs.ts deleted file mode 100644 index d0de5c8..0000000 --- a/packages/core/src/privateMessage/base/UpdatePrivateMessageArgs.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { ArgsType, Field } from "@nestjs/graphql"; -import { PrivateMessageWhereUniqueInput } from "./PrivateMessageWhereUniqueInput"; -import { PrivateMessageUpdateInput } from "./PrivateMessageUpdateInput"; - -@ArgsType() -class UpdatePrivateMessageArgs { - @Field(() => PrivateMessageWhereUniqueInput, { nullable: false }) - where!: PrivateMessageWhereUniqueInput; - @Field(() => PrivateMessageUpdateInput, { nullable: false }) - data!: PrivateMessageUpdateInput; -} - -export { UpdatePrivateMessageArgs }; diff --git a/packages/core/src/privateMessage/base/privateMessage.controller.base.spec.ts b/packages/core/src/privateMessage/base/privateMessage.controller.base.spec.ts deleted file mode 100644 index 36daafe..0000000 --- a/packages/core/src/privateMessage/base/privateMessage.controller.base.spec.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { Test } from "@nestjs/testing"; -import { - INestApplication, - HttpStatus, - ExecutionContext, - CallHandler, -} from "@nestjs/common"; -import request from "supertest"; -import { MorganModule } from "nest-morgan"; -import { ACGuard } from "nest-access-control"; -import { DefaultAuthGuard } from "../../auth/defaultAuth.guard"; -import { ACLModule } from "../../auth/acl.module"; -import { AclFilterResponseInterceptor } from "../../interceptors/aclFilterResponse.interceptor"; -import { AclValidateRequestInterceptor } from "../../interceptors/aclValidateRequest.interceptor"; -import { map } from "rxjs"; -import { PrivateMessageController } from "../privateMessage.controller"; -import { PrivateMessageService } from "../privateMessage.service"; - -const nonExistingId = "nonExistingId"; -const existingId = "existingId"; -const CREATE_INPUT = { - content: "exampleContent", - createdAt: new Date(), - id: "exampleId", - updatedAt: new Date(), -}; -const CREATE_RESULT = { - content: "exampleContent", - createdAt: new Date(), - id: "exampleId", - updatedAt: new Date(), -}; -const FIND_MANY_RESULT = [ - { - content: "exampleContent", - createdAt: new Date(), - id: "exampleId", - updatedAt: new Date(), - }, -]; -const FIND_ONE_RESULT = { - content: "exampleContent", - createdAt: new Date(), - id: "exampleId", - updatedAt: new Date(), -}; - -const service = { - create() { - return CREATE_RESULT; - }, - findMany: () => FIND_MANY_RESULT, - findOne: ({ where }: { where: { id: string } }) => { - switch (where.id) { - case existingId: - return FIND_ONE_RESULT; - case nonExistingId: - return null; - } - }, -}; - -const basicAuthGuard = { - canActivate: (context: ExecutionContext) => { - const argumentHost = context.switchToHttp(); - const request = argumentHost.getRequest(); - request.user = { - roles: ["user"], - }; - return true; - }, -}; - -const acGuard = { - canActivate: () => { - return true; - }, -}; - -const aclFilterResponseInterceptor = { - intercept: (context: ExecutionContext, next: CallHandler) => { - return next.handle().pipe( - map((data) => { - return data; - }) - ); - }, -}; -const aclValidateRequestInterceptor = { - intercept: (context: ExecutionContext, next: CallHandler) => { - return next.handle(); - }, -}; - -describe("PrivateMessage", () => { - let app: INestApplication; - - beforeAll(async () => { - const moduleRef = await Test.createTestingModule({ - providers: [ - { - provide: PrivateMessageService, - useValue: service, - }, - ], - controllers: [PrivateMessageController], - imports: [MorganModule.forRoot(), ACLModule], - }) - .overrideGuard(DefaultAuthGuard) - .useValue(basicAuthGuard) - .overrideGuard(ACGuard) - .useValue(acGuard) - .overrideInterceptor(AclFilterResponseInterceptor) - .useValue(aclFilterResponseInterceptor) - .overrideInterceptor(AclValidateRequestInterceptor) - .useValue(aclValidateRequestInterceptor) - .compile(); - - app = moduleRef.createNestApplication(); - await app.init(); - }); - - test("POST /privateMessages", async () => { - await request(app.getHttpServer()) - .post("/privateMessages") - .send(CREATE_INPUT) - .expect(HttpStatus.CREATED) - .expect({ - ...CREATE_RESULT, - createdAt: CREATE_RESULT.createdAt.toISOString(), - updatedAt: CREATE_RESULT.updatedAt.toISOString(), - }); - }); - - test("GET /privateMessages", async () => { - await request(app.getHttpServer()) - .get("/privateMessages") - .expect(HttpStatus.OK) - .expect([ - { - ...FIND_MANY_RESULT[0], - createdAt: FIND_MANY_RESULT[0].createdAt.toISOString(), - updatedAt: FIND_MANY_RESULT[0].updatedAt.toISOString(), - }, - ]); - }); - - test("GET /privateMessages/:id non existing", async () => { - await request(app.getHttpServer()) - .get(`${"/privateMessages"}/${nonExistingId}`) - .expect(HttpStatus.NOT_FOUND) - .expect({ - statusCode: HttpStatus.NOT_FOUND, - message: `No resource was found for {"${"id"}":"${nonExistingId}"}`, - error: "Not Found", - }); - }); - - test("GET /privateMessages/:id existing", async () => { - await request(app.getHttpServer()) - .get(`${"/privateMessages"}/${existingId}`) - .expect(HttpStatus.OK) - .expect({ - ...FIND_ONE_RESULT, - createdAt: FIND_ONE_RESULT.createdAt.toISOString(), - updatedAt: FIND_ONE_RESULT.updatedAt.toISOString(), - }); - }); - - test("POST /privateMessages existing resource", async () => { - let agent = request(app.getHttpServer()); - await agent - .post("/privateMessages") - .send(CREATE_INPUT) - .expect(HttpStatus.CREATED) - .expect({ - ...CREATE_RESULT, - createdAt: CREATE_RESULT.createdAt.toISOString(), - updatedAt: CREATE_RESULT.updatedAt.toISOString(), - }) - .then(function () { - agent - .post("/privateMessages") - .send(CREATE_INPUT) - .expect(HttpStatus.CONFLICT) - .expect({ - statusCode: HttpStatus.CONFLICT, - }); - }); - }); - - afterAll(async () => { - await app.close(); - }); -}); diff --git a/packages/core/src/privateMessage/base/privateMessage.controller.base.ts b/packages/core/src/privateMessage/base/privateMessage.controller.base.ts deleted file mode 100644 index ede558f..0000000 --- a/packages/core/src/privateMessage/base/privateMessage.controller.base.ts +++ /dev/null @@ -1,273 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import * as common from "@nestjs/common"; -import * as swagger from "@nestjs/swagger"; -import * as nestAccessControl from "nest-access-control"; -import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; -import { isRecordNotFoundError } from "../../prisma.util"; -import * as errors from "../../errors"; -import { Request } from "express"; -import { plainToClass } from "class-transformer"; -import { ApiNestedQuery } from "../../decorators/api-nested-query.decorator"; -import { PrivateMessageService } from "../privateMessage.service"; -import { AclValidateRequestInterceptor } from "../../interceptors/aclValidateRequest.interceptor"; -import { AclFilterResponseInterceptor } from "../../interceptors/aclFilterResponse.interceptor"; -import { PrivateMessageCreateInput } from "./PrivateMessageCreateInput"; -import { PrivateMessageWhereInput } from "./PrivateMessageWhereInput"; -import { PrivateMessageWhereUniqueInput } from "./PrivateMessageWhereUniqueInput"; -import { PrivateMessageFindManyArgs } from "./PrivateMessageFindManyArgs"; -import { PrivateMessageUpdateInput } from "./PrivateMessageUpdateInput"; -import { PrivateMessage } from "./PrivateMessage"; -@swagger.ApiBearerAuth() -@common.UseGuards(defaultAuthGuard.DefaultAuthGuard, nestAccessControl.ACGuard) -export class PrivateMessageControllerBase { - constructor( - protected readonly service: PrivateMessageService, - protected readonly rolesBuilder: nestAccessControl.RolesBuilder - ) {} - - @common.UseInterceptors(AclValidateRequestInterceptor) - @nestAccessControl.UseRoles({ - resource: "PrivateMessage", - action: "create", - possession: "any", - }) - @common.Post() - @swagger.ApiCreatedResponse({ type: PrivateMessage }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) - async create( - @common.Body() data: PrivateMessageCreateInput - ): Promise { - return await this.service.create({ - data: { - ...data, - - receiver: data.receiver - ? { - connect: data.receiver, - } - : undefined, - - sender: data.sender - ? { - connect: data.sender, - } - : undefined, - }, - select: { - content: true, - createdAt: true, - id: true, - - receiver: { - select: { - id: true, - }, - }, - - sender: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - } - - @common.UseInterceptors(AclFilterResponseInterceptor) - @nestAccessControl.UseRoles({ - resource: "PrivateMessage", - action: "read", - possession: "any", - }) - @common.Get() - @swagger.ApiOkResponse({ type: [PrivateMessage] }) - @swagger.ApiForbiddenResponse() - @ApiNestedQuery(PrivateMessageFindManyArgs) - async findMany(@common.Req() request: Request): Promise { - const args = plainToClass(PrivateMessageFindManyArgs, request.query); - return this.service.findMany({ - ...args, - select: { - content: true, - createdAt: true, - id: true, - - receiver: { - select: { - id: true, - }, - }, - - sender: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - } - - @common.UseInterceptors(AclFilterResponseInterceptor) - @nestAccessControl.UseRoles({ - resource: "PrivateMessage", - action: "read", - possession: "own", - }) - @common.Get("/:id") - @swagger.ApiOkResponse({ type: PrivateMessage }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) - async findOne( - @common.Param() params: PrivateMessageWhereUniqueInput - ): Promise { - const result = await this.service.findOne({ - where: params, - select: { - content: true, - createdAt: true, - id: true, - - receiver: { - select: { - id: true, - }, - }, - - sender: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - if (result === null) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - return result; - } - - @common.UseInterceptors(AclValidateRequestInterceptor) - @nestAccessControl.UseRoles({ - resource: "PrivateMessage", - action: "update", - possession: "any", - }) - @common.Patch("/:id") - @swagger.ApiOkResponse({ type: PrivateMessage }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) - async update( - @common.Param() params: PrivateMessageWhereUniqueInput, - @common.Body() data: PrivateMessageUpdateInput - ): Promise { - try { - return await this.service.update({ - where: params, - data: { - ...data, - - receiver: data.receiver - ? { - connect: data.receiver, - } - : undefined, - - sender: data.sender - ? { - connect: data.sender, - } - : undefined, - }, - select: { - content: true, - createdAt: true, - id: true, - - receiver: { - select: { - id: true, - }, - }, - - sender: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - } catch (error) { - if (isRecordNotFoundError(error)) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - throw error; - } - } - - @nestAccessControl.UseRoles({ - resource: "PrivateMessage", - action: "delete", - possession: "any", - }) - @common.Delete("/:id") - @swagger.ApiOkResponse({ type: PrivateMessage }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) - async delete( - @common.Param() params: PrivateMessageWhereUniqueInput - ): Promise { - try { - return await this.service.delete({ - where: params, - select: { - content: true, - createdAt: true, - id: true, - - receiver: { - select: { - id: true, - }, - }, - - sender: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - } catch (error) { - if (isRecordNotFoundError(error)) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - throw error; - } - } -} diff --git a/packages/core/src/privateMessage/base/privateMessage.module.base.ts b/packages/core/src/privateMessage/base/privateMessage.module.base.ts deleted file mode 100644 index bea2e7e..0000000 --- a/packages/core/src/privateMessage/base/privateMessage.module.base.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { Module, forwardRef } from "@nestjs/common"; -import { MorganModule } from "nest-morgan"; -import { PrismaModule } from "nestjs-prisma"; -import { ACLModule } from "../../auth/acl.module"; -import { AuthModule } from "../../auth/auth.module"; - -@Module({ - imports: [ - ACLModule, - forwardRef(() => AuthModule), - MorganModule, - PrismaModule, - ], - - exports: [ACLModule, AuthModule, MorganModule, PrismaModule], -}) -export class PrivateMessageModuleBase {} diff --git a/packages/core/src/privateMessage/base/privateMessage.service.base.ts b/packages/core/src/privateMessage/base/privateMessage.service.base.ts deleted file mode 100644 index 2f5b67f..0000000 --- a/packages/core/src/privateMessage/base/privateMessage.service.base.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { PrismaService } from "nestjs-prisma"; -import { Prisma, PrivateMessage, User } from "@prisma/client"; - -export class PrivateMessageServiceBase { - constructor(protected readonly prisma: PrismaService) {} - - async count( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.privateMessage.count(args); - } - - async findMany( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.privateMessage.findMany(args); - } - async findOne( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.privateMessage.findUnique(args); - } - async create( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.privateMessage.create(args); - } - async update( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.privateMessage.update(args); - } - async delete( - args: Prisma.SelectSubset - ): Promise { - return this.prisma.privateMessage.delete(args); - } - - async getReceiver(parentId: string): Promise { - return this.prisma.privateMessage - .findUnique({ - where: { id: parentId }, - }) - .receiver(); - } - - async getSender(parentId: string): Promise { - return this.prisma.privateMessage - .findUnique({ - where: { id: parentId }, - }) - .sender(); - } -} diff --git a/packages/core/src/privateMessage/privateMessage.controller.ts b/packages/core/src/privateMessage/privateMessage.controller.ts deleted file mode 100644 index d03b24b..0000000 --- a/packages/core/src/privateMessage/privateMessage.controller.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as common from "@nestjs/common"; -import * as swagger from "@nestjs/swagger"; -import * as nestAccessControl from "nest-access-control"; -import { PrivateMessageService } from "./privateMessage.service"; -import { PrivateMessageControllerBase } from "./base/privateMessage.controller.base"; - -@swagger.ApiTags("privateMessages") -@common.Controller("privateMessages") -export class PrivateMessageController extends PrivateMessageControllerBase { - constructor( - protected readonly service: PrivateMessageService, - @nestAccessControl.InjectRolesBuilder() - protected readonly rolesBuilder: nestAccessControl.RolesBuilder - ) { - super(service, rolesBuilder); - } -} diff --git a/packages/core/src/privateMessage/privateMessage.module.ts b/packages/core/src/privateMessage/privateMessage.module.ts deleted file mode 100644 index 6fd0719..0000000 --- a/packages/core/src/privateMessage/privateMessage.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from "@nestjs/common"; -import { PrivateMessageModuleBase } from "./base/privateMessage.module.base"; -import { PrivateMessageService } from "./privateMessage.service"; -import { PrivateMessageController } from "./privateMessage.controller"; - -@Module({ - imports: [PrivateMessageModuleBase], - controllers: [PrivateMessageController], - providers: [PrivateMessageService], - exports: [PrivateMessageService], -}) -export class PrivateMessageModule {} diff --git a/packages/core/src/privateMessage/privateMessage.service.ts b/packages/core/src/privateMessage/privateMessage.service.ts deleted file mode 100644 index df574be..0000000 --- a/packages/core/src/privateMessage/privateMessage.service.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from "@nestjs/common"; -import { PrismaService } from "nestjs-prisma"; -import { PrivateMessageServiceBase } from "./base/privateMessage.service.base"; - -@Injectable() -export class PrivateMessageService extends PrivateMessageServiceBase { - constructor(protected readonly prisma: PrismaService) { - super(prisma); - } -} diff --git a/packages/core/src/providers/secrets/base/secretsManager.service.base.spec.ts b/packages/core/src/providers/secrets/base/secretsManager.service.base.spec.ts new file mode 100644 index 0000000..0b5a709 --- /dev/null +++ b/packages/core/src/providers/secrets/base/secretsManager.service.base.spec.ts @@ -0,0 +1,39 @@ +import { ConfigService } from "@nestjs/config"; +import { mock } from "jest-mock-extended"; +import { SecretsManagerServiceBase } from "./secretsManager.service.base"; + +describe("Testing the secrets manager base class", () => { + const SECRET_KEY = "SECRET_KEY"; + const SECRET_VALUE = "SECRET_VALUE"; + const configService = mock(); + const secretsManagerServiceBase = new SecretsManagerServiceBase( + configService + ); + beforeEach(() => { + configService.get.mockClear(); + }); + it("should return value from env", async () => { + //ARRANGE + configService.get.mockReturnValue(SECRET_VALUE); + //ACT + const result = await secretsManagerServiceBase.getSecret(SECRET_KEY); + //ASSERT + expect(result).toBe(SECRET_VALUE); + }); + it("should return null for unknown keys", async () => { + //ARRANGE + configService.get.mockReturnValue(undefined); + //ACT + const result = await secretsManagerServiceBase.getSecret(SECRET_KEY); + //ASSERT + expect(result).toBeNull(); + }); + it("should throw error if dont get key", () => { + //@ts-ignore + return expect(secretsManagerServiceBase.getSecret()).rejects.toThrow(); + }); + it("should throw an exeption if getting null key", () => { + //@ts-ignore + return expect(secretsManagerServiceBase.getSecret(null)).rejects.toThrow(); + }); +}); diff --git a/packages/core/src/room/base/DeleteRoomArgs.ts b/packages/core/src/room/base/DeleteRoomArgs.ts index 5043cf6..e256f41 100644 --- a/packages/core/src/room/base/DeleteRoomArgs.ts +++ b/packages/core/src/room/base/DeleteRoomArgs.ts @@ -18,4 +18,4 @@ class DeleteRoomArgs { where!: RoomWhereUniqueInput; } -export { DeleteRoomArgs }; +export { DeleteRoomArgs as DeleteRoomArgs }; diff --git a/packages/core/src/room/base/Room.ts b/packages/core/src/room/base/Room.ts index 61b13d4..421f414 100644 --- a/packages/core/src/room/base/Room.ts +++ b/packages/core/src/room/base/Room.ts @@ -13,6 +13,7 @@ import { ObjectType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; import { IsDate, IsString } from "class-validator"; import { Type } from "class-transformer"; + @ObjectType() class Room { @ApiProperty({ @@ -39,4 +40,5 @@ class Room { @Field(() => Date) updatedAt!: Date; } -export { Room }; + +export { Room as Room }; diff --git a/packages/core/src/room/base/RoomCreateInput.ts b/packages/core/src/room/base/RoomCreateInput.ts index f9ea0e3..4ee4ee7 100644 --- a/packages/core/src/room/base/RoomCreateInput.ts +++ b/packages/core/src/room/base/RoomCreateInput.ts @@ -10,4 +10,4 @@ https://docs.amplication.com/how-to/custom-code ------------------------------------------------------------------------------ */ class RoomCreateInput {} -export { RoomCreateInput }; +export { RoomCreateInput as RoomCreateInput }; diff --git a/packages/core/src/room/base/RoomFindManyArgs.ts b/packages/core/src/room/base/RoomFindManyArgs.ts index 118f928..e9b4a5c 100644 --- a/packages/core/src/room/base/RoomFindManyArgs.ts +++ b/packages/core/src/room/base/RoomFindManyArgs.ts @@ -50,4 +50,4 @@ class RoomFindManyArgs { take?: number; } -export { RoomFindManyArgs }; +export { RoomFindManyArgs as RoomFindManyArgs }; diff --git a/packages/core/src/room/base/RoomFindUniqueArgs.ts b/packages/core/src/room/base/RoomFindUniqueArgs.ts index e242a4e..544fe46 100644 --- a/packages/core/src/room/base/RoomFindUniqueArgs.ts +++ b/packages/core/src/room/base/RoomFindUniqueArgs.ts @@ -18,4 +18,4 @@ class RoomFindUniqueArgs { where!: RoomWhereUniqueInput; } -export { RoomFindUniqueArgs }; +export { RoomFindUniqueArgs as RoomFindUniqueArgs }; diff --git a/packages/core/src/room/base/RoomListRelationFilter.ts b/packages/core/src/room/base/RoomListRelationFilter.ts index d934523..9a0f00e 100644 --- a/packages/core/src/room/base/RoomListRelationFilter.ts +++ b/packages/core/src/room/base/RoomListRelationFilter.ts @@ -53,4 +53,4 @@ class RoomListRelationFilter { }) none?: RoomWhereInput; } -export { RoomListRelationFilter }; +export { RoomListRelationFilter as RoomListRelationFilter }; diff --git a/packages/core/src/room/base/RoomOrderByInput.ts b/packages/core/src/room/base/RoomOrderByInput.ts index 37e1cdc..716e054 100644 --- a/packages/core/src/room/base/RoomOrderByInput.ts +++ b/packages/core/src/room/base/RoomOrderByInput.ts @@ -46,4 +46,4 @@ class RoomOrderByInput { updatedAt?: SortOrder; } -export { RoomOrderByInput }; +export { RoomOrderByInput as RoomOrderByInput }; diff --git a/packages/core/src/room/base/RoomUpdateInput.ts b/packages/core/src/room/base/RoomUpdateInput.ts index 7b74e0d..94d85ec 100644 --- a/packages/core/src/room/base/RoomUpdateInput.ts +++ b/packages/core/src/room/base/RoomUpdateInput.ts @@ -10,4 +10,4 @@ https://docs.amplication.com/how-to/custom-code ------------------------------------------------------------------------------ */ class RoomUpdateInput {} -export { RoomUpdateInput }; +export { RoomUpdateInput as RoomUpdateInput }; diff --git a/packages/core/src/room/base/RoomWhereInput.ts b/packages/core/src/room/base/RoomWhereInput.ts index f63d0c0..6302412 100644 --- a/packages/core/src/room/base/RoomWhereInput.ts +++ b/packages/core/src/room/base/RoomWhereInput.ts @@ -14,6 +14,7 @@ import { ApiProperty } from "@nestjs/swagger"; import { StringFilter } from "../../util/StringFilter"; import { Type } from "class-transformer"; import { IsOptional } from "class-validator"; + @InputType() class RoomWhereInput { @ApiProperty({ @@ -27,4 +28,5 @@ class RoomWhereInput { }) id?: StringFilter; } -export { RoomWhereInput }; + +export { RoomWhereInput as RoomWhereInput }; diff --git a/packages/core/src/room/base/RoomWhereUniqueInput.ts b/packages/core/src/room/base/RoomWhereUniqueInput.ts index c16ea38..ec164b6 100644 --- a/packages/core/src/room/base/RoomWhereUniqueInput.ts +++ b/packages/core/src/room/base/RoomWhereUniqueInput.ts @@ -12,6 +12,7 @@ https://docs.amplication.com/how-to/custom-code import { InputType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; import { IsString } from "class-validator"; + @InputType() class RoomWhereUniqueInput { @ApiProperty({ @@ -22,4 +23,5 @@ class RoomWhereUniqueInput { @Field(() => String) id!: string; } -export { RoomWhereUniqueInput }; + +export { RoomWhereUniqueInput as RoomWhereUniqueInput }; diff --git a/packages/core/src/room/base/room.controller.base.ts b/packages/core/src/room/base/room.controller.base.ts index d60e3af..12ecafd 100644 --- a/packages/core/src/room/base/room.controller.base.ts +++ b/packages/core/src/room/base/room.controller.base.ts @@ -11,13 +11,13 @@ https://docs.amplication.com/how-to/custom-code */ import * as common from "@nestjs/common"; import * as swagger from "@nestjs/swagger"; -import * as nestAccessControl from "nest-access-control"; -import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; import { isRecordNotFoundError } from "../../prisma.util"; import * as errors from "../../errors"; import { Request } from "express"; import { plainToClass } from "class-transformer"; import { ApiNestedQuery } from "../../decorators/api-nested-query.decorator"; +import * as nestAccessControl from "nest-access-control"; +import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; import { RoomService } from "../room.service"; import { AclValidateRequestInterceptor } from "../../interceptors/aclValidateRequest.interceptor"; import { AclFilterResponseInterceptor } from "../../interceptors/aclFilterResponse.interceptor"; @@ -27,6 +27,7 @@ import { RoomWhereUniqueInput } from "./RoomWhereUniqueInput"; import { RoomFindManyArgs } from "./RoomFindManyArgs"; import { RoomUpdateInput } from "./RoomUpdateInput"; import { Room } from "./Room"; + @swagger.ApiBearerAuth() @common.UseGuards(defaultAuthGuard.DefaultAuthGuard, nestAccessControl.ACGuard) export class RoomControllerBase { @@ -34,16 +35,17 @@ export class RoomControllerBase { protected readonly service: RoomService, protected readonly rolesBuilder: nestAccessControl.RolesBuilder ) {} - @common.UseInterceptors(AclValidateRequestInterceptor) + @common.Post() + @swagger.ApiCreatedResponse({ type: Room }) @nestAccessControl.UseRoles({ resource: "Room", action: "create", possession: "any", }) - @common.Post() - @swagger.ApiCreatedResponse({ type: Room }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async create(@common.Body() data: RoomCreateInput): Promise { return await this.service.create({ data: data, @@ -56,15 +58,17 @@ export class RoomControllerBase { } @common.UseInterceptors(AclFilterResponseInterceptor) + @common.Get() + @swagger.ApiOkResponse({ type: [Room] }) + @ApiNestedQuery(RoomFindManyArgs) @nestAccessControl.UseRoles({ resource: "Room", action: "read", possession: "any", }) - @common.Get() - @swagger.ApiOkResponse({ type: [Room] }) - @swagger.ApiForbiddenResponse() - @ApiNestedQuery(RoomFindManyArgs) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async findMany(@common.Req() request: Request): Promise { const args = plainToClass(RoomFindManyArgs, request.query); return this.service.findMany({ @@ -78,15 +82,17 @@ export class RoomControllerBase { } @common.UseInterceptors(AclFilterResponseInterceptor) + @common.Get("/:id") + @swagger.ApiOkResponse({ type: Room }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "Room", action: "read", possession: "own", }) - @common.Get("/:id") - @swagger.ApiOkResponse({ type: Room }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async findOne( @common.Param() params: RoomWhereUniqueInput ): Promise { @@ -107,15 +113,17 @@ export class RoomControllerBase { } @common.UseInterceptors(AclValidateRequestInterceptor) + @common.Patch("/:id") + @swagger.ApiOkResponse({ type: Room }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "Room", action: "update", possession: "any", }) - @common.Patch("/:id") - @swagger.ApiOkResponse({ type: Room }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async update( @common.Param() params: RoomWhereUniqueInput, @common.Body() data: RoomUpdateInput @@ -140,15 +148,17 @@ export class RoomControllerBase { } } + @common.Delete("/:id") + @swagger.ApiOkResponse({ type: Room }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "Room", action: "delete", possession: "any", }) - @common.Delete("/:id") - @swagger.ApiOkResponse({ type: Room }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async delete( @common.Param() params: RoomWhereUniqueInput ): Promise { diff --git a/packages/core/src/room/base/room.module.base.ts b/packages/core/src/room/base/room.module.base.ts index 02bbc09..50f12b1 100644 --- a/packages/core/src/room/base/room.module.base.ts +++ b/packages/core/src/room/base/room.module.base.ts @@ -11,18 +11,10 @@ https://docs.amplication.com/how-to/custom-code */ import { Module, forwardRef } from "@nestjs/common"; import { MorganModule } from "nest-morgan"; -import { PrismaModule } from "nestjs-prisma"; import { ACLModule } from "../../auth/acl.module"; import { AuthModule } from "../../auth/auth.module"; - @Module({ - imports: [ - ACLModule, - forwardRef(() => AuthModule), - MorganModule, - PrismaModule, - ], - - exports: [ACLModule, AuthModule, MorganModule, PrismaModule], + imports: [ACLModule, forwardRef(() => AuthModule), MorganModule], + exports: [ACLModule, AuthModule, MorganModule], }) export class RoomModuleBase {} diff --git a/packages/core/src/room/base/room.service.base.ts b/packages/core/src/room/base/room.service.base.ts index dc76aed..9599044 100644 --- a/packages/core/src/room/base/room.service.base.ts +++ b/packages/core/src/room/base/room.service.base.ts @@ -9,7 +9,7 @@ https://docs.amplication.com/how-to/custom-code ------------------------------------------------------------------------------ */ -import { PrismaService } from "nestjs-prisma"; +import { PrismaService } from "../../prisma/prisma.service"; import { Prisma, Room } from "@prisma/client"; export class RoomServiceBase { diff --git a/packages/core/src/roomMessage/base/CreateRoomMessageArgs.ts b/packages/core/src/roomMessage/base/CreateRoomMessageArgs.ts index 400d8b7..54920d4 100644 --- a/packages/core/src/roomMessage/base/CreateRoomMessageArgs.ts +++ b/packages/core/src/roomMessage/base/CreateRoomMessageArgs.ts @@ -18,4 +18,4 @@ class CreateRoomMessageArgs { data!: RoomMessageCreateInput; } -export { CreateRoomMessageArgs }; +export { CreateRoomMessageArgs as CreateRoomMessageArgs }; diff --git a/packages/core/src/roomMessage/base/DeleteRoomMessageArgs.ts b/packages/core/src/roomMessage/base/DeleteRoomMessageArgs.ts index 338f2e3..e08abd4 100644 --- a/packages/core/src/roomMessage/base/DeleteRoomMessageArgs.ts +++ b/packages/core/src/roomMessage/base/DeleteRoomMessageArgs.ts @@ -18,4 +18,4 @@ class DeleteRoomMessageArgs { where!: RoomMessageWhereUniqueInput; } -export { DeleteRoomMessageArgs }; +export { DeleteRoomMessageArgs as DeleteRoomMessageArgs }; diff --git a/packages/core/src/roomMessage/base/RoomMessage.ts b/packages/core/src/roomMessage/base/RoomMessage.ts index ffcf261..da16615 100644 --- a/packages/core/src/roomMessage/base/RoomMessage.ts +++ b/packages/core/src/roomMessage/base/RoomMessage.ts @@ -14,6 +14,7 @@ import { ApiProperty } from "@nestjs/swagger"; import { IsString, IsOptional, IsDate, ValidateNested } from "class-validator"; import { Type } from "class-transformer"; import { User } from "../../user/base/User"; + @ObjectType() class RoomMessage { @ApiProperty({ @@ -71,4 +72,5 @@ class RoomMessage { @Field(() => Date) updatedAt!: Date; } -export { RoomMessage }; + +export { RoomMessage as RoomMessage }; diff --git a/packages/core/src/roomMessage/base/RoomMessageCreateInput.ts b/packages/core/src/roomMessage/base/RoomMessageCreateInput.ts index d4c0929..65e3f17 100644 --- a/packages/core/src/roomMessage/base/RoomMessageCreateInput.ts +++ b/packages/core/src/roomMessage/base/RoomMessageCreateInput.ts @@ -14,6 +14,7 @@ import { ApiProperty } from "@nestjs/swagger"; import { IsString, IsOptional, ValidateNested } from "class-validator"; import { UserWhereUniqueInput } from "../../user/base/UserWhereUniqueInput"; import { Type } from "class-transformer"; + @InputType() class RoomMessageCreateInput { @ApiProperty({ @@ -50,4 +51,5 @@ class RoomMessageCreateInput { }) sender?: UserWhereUniqueInput | null; } -export { RoomMessageCreateInput }; + +export { RoomMessageCreateInput as RoomMessageCreateInput }; diff --git a/packages/core/src/roomMessage/base/RoomMessageFindManyArgs.ts b/packages/core/src/roomMessage/base/RoomMessageFindManyArgs.ts index 93f9a48..f8a53b1 100644 --- a/packages/core/src/roomMessage/base/RoomMessageFindManyArgs.ts +++ b/packages/core/src/roomMessage/base/RoomMessageFindManyArgs.ts @@ -50,4 +50,4 @@ class RoomMessageFindManyArgs { take?: number; } -export { RoomMessageFindManyArgs }; +export { RoomMessageFindManyArgs as RoomMessageFindManyArgs }; diff --git a/packages/core/src/roomMessage/base/RoomMessageFindUniqueArgs.ts b/packages/core/src/roomMessage/base/RoomMessageFindUniqueArgs.ts index 6cc1618..59123f9 100644 --- a/packages/core/src/roomMessage/base/RoomMessageFindUniqueArgs.ts +++ b/packages/core/src/roomMessage/base/RoomMessageFindUniqueArgs.ts @@ -18,4 +18,4 @@ class RoomMessageFindUniqueArgs { where!: RoomMessageWhereUniqueInput; } -export { RoomMessageFindUniqueArgs }; +export { RoomMessageFindUniqueArgs as RoomMessageFindUniqueArgs }; diff --git a/packages/core/src/roomMessage/base/RoomMessageListRelationFilter.ts b/packages/core/src/roomMessage/base/RoomMessageListRelationFilter.ts index 89ca0b9..782af87 100644 --- a/packages/core/src/roomMessage/base/RoomMessageListRelationFilter.ts +++ b/packages/core/src/roomMessage/base/RoomMessageListRelationFilter.ts @@ -53,4 +53,4 @@ class RoomMessageListRelationFilter { }) none?: RoomMessageWhereInput; } -export { RoomMessageListRelationFilter }; +export { RoomMessageListRelationFilter as RoomMessageListRelationFilter }; diff --git a/packages/core/src/roomMessage/base/RoomMessageOrderByInput.ts b/packages/core/src/roomMessage/base/RoomMessageOrderByInput.ts index e90ca6a..24ef8de 100644 --- a/packages/core/src/roomMessage/base/RoomMessageOrderByInput.ts +++ b/packages/core/src/roomMessage/base/RoomMessageOrderByInput.ts @@ -73,4 +73,4 @@ class RoomMessageOrderByInput { updatedAt?: SortOrder; } -export { RoomMessageOrderByInput }; +export { RoomMessageOrderByInput as RoomMessageOrderByInput }; diff --git a/packages/core/src/roomMessage/base/RoomMessageUpdateInput.ts b/packages/core/src/roomMessage/base/RoomMessageUpdateInput.ts index d98f651..1567812 100644 --- a/packages/core/src/roomMessage/base/RoomMessageUpdateInput.ts +++ b/packages/core/src/roomMessage/base/RoomMessageUpdateInput.ts @@ -14,6 +14,7 @@ import { ApiProperty } from "@nestjs/swagger"; import { IsString, IsOptional, ValidateNested } from "class-validator"; import { UserWhereUniqueInput } from "../../user/base/UserWhereUniqueInput"; import { Type } from "class-transformer"; + @InputType() class RoomMessageUpdateInput { @ApiProperty({ @@ -50,4 +51,5 @@ class RoomMessageUpdateInput { }) sender?: UserWhereUniqueInput | null; } -export { RoomMessageUpdateInput }; + +export { RoomMessageUpdateInput as RoomMessageUpdateInput }; diff --git a/packages/core/src/roomMessage/base/RoomMessageWhereInput.ts b/packages/core/src/roomMessage/base/RoomMessageWhereInput.ts index 38b0d37..8042607 100644 --- a/packages/core/src/roomMessage/base/RoomMessageWhereInput.ts +++ b/packages/core/src/roomMessage/base/RoomMessageWhereInput.ts @@ -16,6 +16,7 @@ import { Type } from "class-transformer"; import { IsOptional, ValidateNested } from "class-validator"; import { StringFilter } from "../../util/StringFilter"; import { UserWhereUniqueInput } from "../../user/base/UserWhereUniqueInput"; + @InputType() class RoomMessageWhereInput { @ApiProperty({ @@ -63,4 +64,5 @@ class RoomMessageWhereInput { }) sender?: UserWhereUniqueInput; } -export { RoomMessageWhereInput }; + +export { RoomMessageWhereInput as RoomMessageWhereInput }; diff --git a/packages/core/src/roomMessage/base/RoomMessageWhereUniqueInput.ts b/packages/core/src/roomMessage/base/RoomMessageWhereUniqueInput.ts index 306cf5b..8f36595 100644 --- a/packages/core/src/roomMessage/base/RoomMessageWhereUniqueInput.ts +++ b/packages/core/src/roomMessage/base/RoomMessageWhereUniqueInput.ts @@ -12,6 +12,7 @@ https://docs.amplication.com/how-to/custom-code import { InputType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; import { IsString } from "class-validator"; + @InputType() class RoomMessageWhereUniqueInput { @ApiProperty({ @@ -22,4 +23,5 @@ class RoomMessageWhereUniqueInput { @Field(() => String) id!: string; } -export { RoomMessageWhereUniqueInput }; + +export { RoomMessageWhereUniqueInput as RoomMessageWhereUniqueInput }; diff --git a/packages/core/src/roomMessage/base/UpdateRoomMessageArgs.ts b/packages/core/src/roomMessage/base/UpdateRoomMessageArgs.ts index 4b87247..9e26793 100644 --- a/packages/core/src/roomMessage/base/UpdateRoomMessageArgs.ts +++ b/packages/core/src/roomMessage/base/UpdateRoomMessageArgs.ts @@ -21,4 +21,4 @@ class UpdateRoomMessageArgs { data!: RoomMessageUpdateInput; } -export { UpdateRoomMessageArgs }; +export { UpdateRoomMessageArgs as UpdateRoomMessageArgs }; diff --git a/packages/core/src/roomMessage/base/roomMessage.controller.base.ts b/packages/core/src/roomMessage/base/roomMessage.controller.base.ts index 0c76074..3db2712 100644 --- a/packages/core/src/roomMessage/base/roomMessage.controller.base.ts +++ b/packages/core/src/roomMessage/base/roomMessage.controller.base.ts @@ -11,13 +11,13 @@ https://docs.amplication.com/how-to/custom-code */ import * as common from "@nestjs/common"; import * as swagger from "@nestjs/swagger"; -import * as nestAccessControl from "nest-access-control"; -import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; import { isRecordNotFoundError } from "../../prisma.util"; import * as errors from "../../errors"; import { Request } from "express"; import { plainToClass } from "class-transformer"; import { ApiNestedQuery } from "../../decorators/api-nested-query.decorator"; +import * as nestAccessControl from "nest-access-control"; +import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; import { RoomMessageService } from "../roomMessage.service"; import { AclValidateRequestInterceptor } from "../../interceptors/aclValidateRequest.interceptor"; import { AclFilterResponseInterceptor } from "../../interceptors/aclFilterResponse.interceptor"; @@ -27,6 +27,7 @@ import { RoomMessageWhereUniqueInput } from "./RoomMessageWhereUniqueInput"; import { RoomMessageFindManyArgs } from "./RoomMessageFindManyArgs"; import { RoomMessageUpdateInput } from "./RoomMessageUpdateInput"; import { RoomMessage } from "./RoomMessage"; + @swagger.ApiBearerAuth() @common.UseGuards(defaultAuthGuard.DefaultAuthGuard, nestAccessControl.ACGuard) export class RoomMessageControllerBase { @@ -34,16 +35,17 @@ export class RoomMessageControllerBase { protected readonly service: RoomMessageService, protected readonly rolesBuilder: nestAccessControl.RolesBuilder ) {} - @common.UseInterceptors(AclValidateRequestInterceptor) + @common.Post() + @swagger.ApiCreatedResponse({ type: RoomMessage }) @nestAccessControl.UseRoles({ resource: "RoomMessage", action: "create", possession: "any", }) - @common.Post() - @swagger.ApiCreatedResponse({ type: RoomMessage }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async create( @common.Body() data: RoomMessageCreateInput ): Promise { @@ -75,15 +77,17 @@ export class RoomMessageControllerBase { } @common.UseInterceptors(AclFilterResponseInterceptor) + @common.Get() + @swagger.ApiOkResponse({ type: [RoomMessage] }) + @ApiNestedQuery(RoomMessageFindManyArgs) @nestAccessControl.UseRoles({ resource: "RoomMessage", action: "read", possession: "any", }) - @common.Get() - @swagger.ApiOkResponse({ type: [RoomMessage] }) - @swagger.ApiForbiddenResponse() - @ApiNestedQuery(RoomMessageFindManyArgs) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async findMany(@common.Req() request: Request): Promise { const args = plainToClass(RoomMessageFindManyArgs, request.query); return this.service.findMany({ @@ -106,15 +110,17 @@ export class RoomMessageControllerBase { } @common.UseInterceptors(AclFilterResponseInterceptor) + @common.Get("/:id") + @swagger.ApiOkResponse({ type: RoomMessage }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "RoomMessage", action: "read", possession: "own", }) - @common.Get("/:id") - @swagger.ApiOkResponse({ type: RoomMessage }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async findOne( @common.Param() params: RoomMessageWhereUniqueInput ): Promise { @@ -144,15 +150,17 @@ export class RoomMessageControllerBase { } @common.UseInterceptors(AclValidateRequestInterceptor) + @common.Patch("/:id") + @swagger.ApiOkResponse({ type: RoomMessage }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "RoomMessage", action: "update", possession: "any", }) - @common.Patch("/:id") - @swagger.ApiOkResponse({ type: RoomMessage }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async update( @common.Param() params: RoomMessageWhereUniqueInput, @common.Body() data: RoomMessageUpdateInput @@ -194,15 +202,17 @@ export class RoomMessageControllerBase { } } + @common.Delete("/:id") + @swagger.ApiOkResponse({ type: RoomMessage }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "RoomMessage", action: "delete", possession: "any", }) - @common.Delete("/:id") - @swagger.ApiOkResponse({ type: RoomMessage }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async delete( @common.Param() params: RoomMessageWhereUniqueInput ): Promise { diff --git a/packages/core/src/roomMessage/base/roomMessage.module.base.ts b/packages/core/src/roomMessage/base/roomMessage.module.base.ts index 9a1e1a5..58526c9 100644 --- a/packages/core/src/roomMessage/base/roomMessage.module.base.ts +++ b/packages/core/src/roomMessage/base/roomMessage.module.base.ts @@ -11,18 +11,10 @@ https://docs.amplication.com/how-to/custom-code */ import { Module, forwardRef } from "@nestjs/common"; import { MorganModule } from "nest-morgan"; -import { PrismaModule } from "nestjs-prisma"; import { ACLModule } from "../../auth/acl.module"; import { AuthModule } from "../../auth/auth.module"; - @Module({ - imports: [ - ACLModule, - forwardRef(() => AuthModule), - MorganModule, - PrismaModule, - ], - - exports: [ACLModule, AuthModule, MorganModule, PrismaModule], + imports: [ACLModule, forwardRef(() => AuthModule), MorganModule], + exports: [ACLModule, AuthModule, MorganModule], }) export class RoomMessageModuleBase {} diff --git a/packages/core/src/roomMessage/base/roomMessage.service.base.ts b/packages/core/src/roomMessage/base/roomMessage.service.base.ts index 6f0b7ba..6ba0b3d 100644 --- a/packages/core/src/roomMessage/base/roomMessage.service.base.ts +++ b/packages/core/src/roomMessage/base/roomMessage.service.base.ts @@ -9,7 +9,7 @@ https://docs.amplication.com/how-to/custom-code ------------------------------------------------------------------------------ */ -import { PrismaService } from "nestjs-prisma"; +import { PrismaService } from "../../prisma/prisma.service"; import { Prisma, RoomMessage, User } from "@prisma/client"; export class RoomMessageServiceBase { diff --git a/packages/core/src/swagger.ts b/packages/core/src/swagger.ts index f0fb17c..ac12cea 100644 --- a/packages/core/src/swagger.ts +++ b/packages/core/src/swagger.ts @@ -7,7 +7,7 @@ export const swaggerDocumentOptions = new DocumentBuilder() .setDescription( '\n\n## Congratulations! Your service resource is ready.\n \nPlease note that all endpoints are secured with JWT Bearer authentication.\nBy default, your service resource comes with one user with the username "admin" and password "admin".\nLearn more in [our docs](https://docs.amplication.com)' ) - .setVersion("jro00nvp") + .setVersion("5gsfs2xq") .addBearerAuth() .build(); diff --git a/packages/core/src/tests/health/health.service.spec.ts b/packages/core/src/tests/health/health.service.spec.ts new file mode 100644 index 0000000..f7cd00b --- /dev/null +++ b/packages/core/src/tests/health/health.service.spec.ts @@ -0,0 +1,36 @@ +import { mock } from "jest-mock-extended"; +import { PrismaService } from "nestjs-prisma"; +import { HealthServiceBase } from "../../health/base/health.service.base"; + +describe("Testing the HealthServiceBase", () => { + //ARRANGE + let prismaService: PrismaService; + let healthServiceBase: HealthServiceBase; + + describe("Testing the isDbReady function in HealthServiceBase class", () => { + beforeEach(() => { + prismaService = mock(); + healthServiceBase = new HealthServiceBase(prismaService); + }); + it("should return true if allow connection to db", async () => { + //ARRANGE + prismaService.$queryRaw + //@ts-ignore + .mockReturnValue(Promise.resolve(true)); + //ACT + const response = await healthServiceBase.isDbReady(); + //ASSERT + expect(response).toBe(true); + }); + it("should return false if db is not available", async () => { + //ARRANGE + prismaService.$queryRaw + //@ts-ignore + .mockReturnValue(Promise.reject(false)); + //ACT + const response = await healthServiceBase.isDbReady(); + //ASSERT + expect(response).toBe(false); + }); + }); +}); diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 16a8bd9..f762a5d 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,3 +1,3 @@ -import { JsonValue } from "type-fest"; +import type { JsonValue } from "type-fest"; export type InputJsonValue = Omit; diff --git a/packages/core/src/user/base/CreateUserArgs.ts b/packages/core/src/user/base/CreateUserArgs.ts index 4a1e644..24817ac 100644 --- a/packages/core/src/user/base/CreateUserArgs.ts +++ b/packages/core/src/user/base/CreateUserArgs.ts @@ -18,4 +18,4 @@ class CreateUserArgs { data!: UserCreateInput; } -export { CreateUserArgs }; +export { CreateUserArgs as CreateUserArgs }; diff --git a/packages/core/src/user/base/DeleteUserArgs.ts b/packages/core/src/user/base/DeleteUserArgs.ts index ec845b0..3649def 100644 --- a/packages/core/src/user/base/DeleteUserArgs.ts +++ b/packages/core/src/user/base/DeleteUserArgs.ts @@ -18,4 +18,4 @@ class DeleteUserArgs { where!: UserWhereUniqueInput; } -export { DeleteUserArgs }; +export { DeleteUserArgs as DeleteUserArgs }; diff --git a/packages/core/src/user/base/FriendRelationshipCreateNestedManyWithoutUsersInput.ts b/packages/core/src/user/base/FriendRelationshipCreateNestedManyWithoutUsersInput.ts deleted file mode 100644 index ca16310..0000000 --- a/packages/core/src/user/base/FriendRelationshipCreateNestedManyWithoutUsersInput.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { FriendRelationshipWhereUniqueInput } from "../../friendRelationship/base/FriendRelationshipWhereUniqueInput"; -import { ApiProperty } from "@nestjs/swagger"; -@InputType() -class FriendRelationshipCreateNestedManyWithoutUsersInput { - @Field(() => [FriendRelationshipWhereUniqueInput], { - nullable: true, - }) - @ApiProperty({ - required: false, - type: () => [FriendRelationshipWhereUniqueInput], - }) - connect?: Array; -} -export { FriendRelationshipCreateNestedManyWithoutUsersInput }; diff --git a/packages/core/src/user/base/FriendRelationshipUpdateManyWithoutUsersInput.ts b/packages/core/src/user/base/FriendRelationshipUpdateManyWithoutUsersInput.ts deleted file mode 100644 index 58b2eca..0000000 --- a/packages/core/src/user/base/FriendRelationshipUpdateManyWithoutUsersInput.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { FriendRelationshipWhereUniqueInput } from "../../friendRelationship/base/FriendRelationshipWhereUniqueInput"; -import { ApiProperty } from "@nestjs/swagger"; -@InputType() -class FriendRelationshipUpdateManyWithoutUsersInput { - @Field(() => [FriendRelationshipWhereUniqueInput], { - nullable: true, - }) - @ApiProperty({ - required: false, - type: () => [FriendRelationshipWhereUniqueInput], - }) - connect?: Array; - - @Field(() => [FriendRelationshipWhereUniqueInput], { - nullable: true, - }) - @ApiProperty({ - required: false, - type: () => [FriendRelationshipWhereUniqueInput], - }) - disconnect?: Array; - - @Field(() => [FriendRelationshipWhereUniqueInput], { - nullable: true, - }) - @ApiProperty({ - required: false, - type: () => [FriendRelationshipWhereUniqueInput], - }) - set?: Array; -} -export { FriendRelationshipUpdateManyWithoutUsersInput }; diff --git a/packages/core/src/user/base/PrivateMessageCreateNestedManyWithoutUsersInput.ts b/packages/core/src/user/base/PrivateMessageCreateNestedManyWithoutUsersInput.ts deleted file mode 100644 index 07c6344..0000000 --- a/packages/core/src/user/base/PrivateMessageCreateNestedManyWithoutUsersInput.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { PrivateMessageWhereUniqueInput } from "../../privateMessage/base/PrivateMessageWhereUniqueInput"; -import { ApiProperty } from "@nestjs/swagger"; -@InputType() -class PrivateMessageCreateNestedManyWithoutUsersInput { - @Field(() => [PrivateMessageWhereUniqueInput], { - nullable: true, - }) - @ApiProperty({ - required: false, - type: () => [PrivateMessageWhereUniqueInput], - }) - connect?: Array; -} -export { PrivateMessageCreateNestedManyWithoutUsersInput }; diff --git a/packages/core/src/user/base/PrivateMessageUpdateManyWithoutUsersInput.ts b/packages/core/src/user/base/PrivateMessageUpdateManyWithoutUsersInput.ts deleted file mode 100644 index df18178..0000000 --- a/packages/core/src/user/base/PrivateMessageUpdateManyWithoutUsersInput.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* ------------------------------------------------------------------------------- -This code was generated by Amplication. - -Changes to this file will be lost if the code is regenerated. - -There are other ways to to customize your code, see this doc to learn more -https://docs.amplication.com/how-to/custom-code - ------------------------------------------------------------------------------- - */ -import { InputType, Field } from "@nestjs/graphql"; -import { PrivateMessageWhereUniqueInput } from "../../privateMessage/base/PrivateMessageWhereUniqueInput"; -import { ApiProperty } from "@nestjs/swagger"; -@InputType() -class PrivateMessageUpdateManyWithoutUsersInput { - @Field(() => [PrivateMessageWhereUniqueInput], { - nullable: true, - }) - @ApiProperty({ - required: false, - type: () => [PrivateMessageWhereUniqueInput], - }) - connect?: Array; - - @Field(() => [PrivateMessageWhereUniqueInput], { - nullable: true, - }) - @ApiProperty({ - required: false, - type: () => [PrivateMessageWhereUniqueInput], - }) - disconnect?: Array; - - @Field(() => [PrivateMessageWhereUniqueInput], { - nullable: true, - }) - @ApiProperty({ - required: false, - type: () => [PrivateMessageWhereUniqueInput], - }) - set?: Array; -} -export { PrivateMessageUpdateManyWithoutUsersInput }; diff --git a/packages/core/src/user/base/RoomMessageCreateNestedManyWithoutUsersInput.ts b/packages/core/src/user/base/RoomMessageCreateNestedManyWithoutUsersInput.ts index 6fc0527..2713cee 100644 --- a/packages/core/src/user/base/RoomMessageCreateNestedManyWithoutUsersInput.ts +++ b/packages/core/src/user/base/RoomMessageCreateNestedManyWithoutUsersInput.ts @@ -12,6 +12,7 @@ https://docs.amplication.com/how-to/custom-code import { InputType, Field } from "@nestjs/graphql"; import { RoomMessageWhereUniqueInput } from "../../roomMessage/base/RoomMessageWhereUniqueInput"; import { ApiProperty } from "@nestjs/swagger"; + @InputType() class RoomMessageCreateNestedManyWithoutUsersInput { @Field(() => [RoomMessageWhereUniqueInput], { @@ -23,4 +24,5 @@ class RoomMessageCreateNestedManyWithoutUsersInput { }) connect?: Array; } -export { RoomMessageCreateNestedManyWithoutUsersInput }; + +export { RoomMessageCreateNestedManyWithoutUsersInput as RoomMessageCreateNestedManyWithoutUsersInput }; diff --git a/packages/core/src/user/base/RoomMessageUpdateManyWithoutUsersInput.ts b/packages/core/src/user/base/RoomMessageUpdateManyWithoutUsersInput.ts index 7d6a990..bf274ea 100644 --- a/packages/core/src/user/base/RoomMessageUpdateManyWithoutUsersInput.ts +++ b/packages/core/src/user/base/RoomMessageUpdateManyWithoutUsersInput.ts @@ -12,6 +12,7 @@ https://docs.amplication.com/how-to/custom-code import { InputType, Field } from "@nestjs/graphql"; import { RoomMessageWhereUniqueInput } from "../../roomMessage/base/RoomMessageWhereUniqueInput"; import { ApiProperty } from "@nestjs/swagger"; + @InputType() class RoomMessageUpdateManyWithoutUsersInput { @Field(() => [RoomMessageWhereUniqueInput], { @@ -41,4 +42,5 @@ class RoomMessageUpdateManyWithoutUsersInput { }) set?: Array; } -export { RoomMessageUpdateManyWithoutUsersInput }; + +export { RoomMessageUpdateManyWithoutUsersInput as RoomMessageUpdateManyWithoutUsersInput }; diff --git a/packages/core/src/user/base/UpdateUserArgs.ts b/packages/core/src/user/base/UpdateUserArgs.ts index d2f133f..342f128 100644 --- a/packages/core/src/user/base/UpdateUserArgs.ts +++ b/packages/core/src/user/base/UpdateUserArgs.ts @@ -21,4 +21,4 @@ class UpdateUserArgs { data!: UserUpdateInput; } -export { UpdateUserArgs }; +export { UpdateUserArgs as UpdateUserArgs }; diff --git a/packages/core/src/user/base/User.ts b/packages/core/src/user/base/User.ts index d1d13ce..f2cda84 100644 --- a/packages/core/src/user/base/User.ts +++ b/packages/core/src/user/base/User.ts @@ -16,16 +16,15 @@ import { IsString, IsOptional, ValidateNested, - IsJSON, IsEnum, } from "class-validator"; import { Type } from "class-transformer"; -import { FriendRelationship } from "../../friendRelationship/base/FriendRelationship"; -import { PrivateMessage } from "../../privateMessage/base/PrivateMessage"; +import { IsJSONValue } from "@app/custom-validators"; import { GraphQLJSON } from "graphql-type-json"; import { JsonValue } from "type-fest"; import { RoomMessage } from "../../roomMessage/base/RoomMessage"; import { EnumUserStatus } from "./EnumUserStatus"; + @ObjectType() class User { @ApiProperty({ @@ -47,15 +46,6 @@ class User { }) firstName!: string | null; - @ApiProperty({ - required: false, - type: () => [FriendRelationship], - }) - @ValidateNested() - @Type(() => FriendRelationship) - @IsOptional() - friendRelationships?: Array; - @ApiProperty({ required: true, type: String, @@ -64,15 +54,6 @@ class User { @Field(() => String) id!: string; - @ApiProperty({ - required: false, - type: () => [FriendRelationship], - }) - @ValidateNested() - @Type(() => FriendRelationship) - @IsOptional() - invites?: Array; - @ApiProperty({ required: false, type: String, @@ -84,28 +65,10 @@ class User { }) lastName!: string | null; - @ApiProperty({ - required: false, - type: () => [PrivateMessage], - }) - @ValidateNested() - @Type(() => PrivateMessage) - @IsOptional() - privateMessages?: Array; - - @ApiProperty({ - required: false, - type: () => [PrivateMessage], - }) - @ValidateNested() - @Type(() => PrivateMessage) - @IsOptional() - receivedMessges?: Array; - @ApiProperty({ required: true, }) - @IsJSON() + @IsJSONValue() @Field(() => GraphQLJSON) roles!: JsonValue; @@ -145,4 +108,5 @@ class User { @Field(() => String) username!: string; } -export { User }; + +export { User as User }; diff --git a/packages/core/src/user/base/UserCreateInput.ts b/packages/core/src/user/base/UserCreateInput.ts index 7b10b30..4accd55 100644 --- a/packages/core/src/user/base/UserCreateInput.ts +++ b/packages/core/src/user/base/UserCreateInput.ts @@ -11,20 +11,14 @@ https://docs.amplication.com/how-to/custom-code */ import { InputType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; -import { - IsString, - IsOptional, - ValidateNested, - IsJSON, - IsEnum, -} from "class-validator"; -import { FriendRelationshipCreateNestedManyWithoutUsersInput } from "./FriendRelationshipCreateNestedManyWithoutUsersInput"; -import { Type } from "class-transformer"; -import { PrivateMessageCreateNestedManyWithoutUsersInput } from "./PrivateMessageCreateNestedManyWithoutUsersInput"; +import { IsString, IsOptional, ValidateNested, IsEnum } from "class-validator"; +import { IsJSONValue } from "@app/custom-validators"; import { GraphQLJSON } from "graphql-type-json"; import { InputJsonValue } from "../../types"; import { RoomMessageCreateNestedManyWithoutUsersInput } from "./RoomMessageCreateNestedManyWithoutUsersInput"; +import { Type } from "class-transformer"; import { EnumUserStatus } from "./EnumUserStatus"; + @InputType() class UserCreateInput { @ApiProperty({ @@ -38,30 +32,6 @@ class UserCreateInput { }) firstName?: string | null; - @ApiProperty({ - required: false, - type: () => FriendRelationshipCreateNestedManyWithoutUsersInput, - }) - @ValidateNested() - @Type(() => FriendRelationshipCreateNestedManyWithoutUsersInput) - @IsOptional() - @Field(() => FriendRelationshipCreateNestedManyWithoutUsersInput, { - nullable: true, - }) - friendRelationships?: FriendRelationshipCreateNestedManyWithoutUsersInput; - - @ApiProperty({ - required: false, - type: () => FriendRelationshipCreateNestedManyWithoutUsersInput, - }) - @ValidateNested() - @Type(() => FriendRelationshipCreateNestedManyWithoutUsersInput) - @IsOptional() - @Field(() => FriendRelationshipCreateNestedManyWithoutUsersInput, { - nullable: true, - }) - invites?: FriendRelationshipCreateNestedManyWithoutUsersInput; - @ApiProperty({ required: false, type: String, @@ -81,34 +51,10 @@ class UserCreateInput { @Field(() => String) password!: string; - @ApiProperty({ - required: false, - type: () => PrivateMessageCreateNestedManyWithoutUsersInput, - }) - @ValidateNested() - @Type(() => PrivateMessageCreateNestedManyWithoutUsersInput) - @IsOptional() - @Field(() => PrivateMessageCreateNestedManyWithoutUsersInput, { - nullable: true, - }) - privateMessages?: PrivateMessageCreateNestedManyWithoutUsersInput; - - @ApiProperty({ - required: false, - type: () => PrivateMessageCreateNestedManyWithoutUsersInput, - }) - @ValidateNested() - @Type(() => PrivateMessageCreateNestedManyWithoutUsersInput) - @IsOptional() - @Field(() => PrivateMessageCreateNestedManyWithoutUsersInput, { - nullable: true, - }) - receivedMessges?: PrivateMessageCreateNestedManyWithoutUsersInput; - @ApiProperty({ required: true, }) - @IsJSON() + @IsJSONValue() @Field(() => GraphQLJSON) roles!: InputJsonValue; @@ -143,4 +89,5 @@ class UserCreateInput { @Field(() => String) username!: string; } -export { UserCreateInput }; + +export { UserCreateInput as UserCreateInput }; diff --git a/packages/core/src/user/base/UserFindManyArgs.ts b/packages/core/src/user/base/UserFindManyArgs.ts index 07ffdab..11525da 100644 --- a/packages/core/src/user/base/UserFindManyArgs.ts +++ b/packages/core/src/user/base/UserFindManyArgs.ts @@ -50,4 +50,4 @@ class UserFindManyArgs { take?: number; } -export { UserFindManyArgs }; +export { UserFindManyArgs as UserFindManyArgs }; diff --git a/packages/core/src/user/base/UserFindUniqueArgs.ts b/packages/core/src/user/base/UserFindUniqueArgs.ts index 3767539..b7810d2 100644 --- a/packages/core/src/user/base/UserFindUniqueArgs.ts +++ b/packages/core/src/user/base/UserFindUniqueArgs.ts @@ -18,4 +18,4 @@ class UserFindUniqueArgs { where!: UserWhereUniqueInput; } -export { UserFindUniqueArgs }; +export { UserFindUniqueArgs as UserFindUniqueArgs }; diff --git a/packages/core/src/user/base/UserListRelationFilter.ts b/packages/core/src/user/base/UserListRelationFilter.ts index 4c57721..0ff7d94 100644 --- a/packages/core/src/user/base/UserListRelationFilter.ts +++ b/packages/core/src/user/base/UserListRelationFilter.ts @@ -53,4 +53,4 @@ class UserListRelationFilter { }) none?: UserWhereInput; } -export { UserListRelationFilter }; +export { UserListRelationFilter as UserListRelationFilter }; diff --git a/packages/core/src/user/base/UserOrderByInput.ts b/packages/core/src/user/base/UserOrderByInput.ts index 3cee515..f8f6d40 100644 --- a/packages/core/src/user/base/UserOrderByInput.ts +++ b/packages/core/src/user/base/UserOrderByInput.ts @@ -100,4 +100,4 @@ class UserOrderByInput { username?: SortOrder; } -export { UserOrderByInput }; +export { UserOrderByInput as UserOrderByInput }; diff --git a/packages/core/src/user/base/UserUpdateInput.ts b/packages/core/src/user/base/UserUpdateInput.ts index f9ba631..6fa17ee 100644 --- a/packages/core/src/user/base/UserUpdateInput.ts +++ b/packages/core/src/user/base/UserUpdateInput.ts @@ -11,20 +11,14 @@ https://docs.amplication.com/how-to/custom-code */ import { InputType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; -import { - IsString, - IsOptional, - ValidateNested, - IsJSON, - IsEnum, -} from "class-validator"; -import { FriendRelationshipUpdateManyWithoutUsersInput } from "./FriendRelationshipUpdateManyWithoutUsersInput"; -import { Type } from "class-transformer"; -import { PrivateMessageUpdateManyWithoutUsersInput } from "./PrivateMessageUpdateManyWithoutUsersInput"; +import { IsString, IsOptional, ValidateNested, IsEnum } from "class-validator"; +import { IsJSONValue } from "@app/custom-validators"; import { GraphQLJSON } from "graphql-type-json"; import { InputJsonValue } from "../../types"; import { RoomMessageUpdateManyWithoutUsersInput } from "./RoomMessageUpdateManyWithoutUsersInput"; +import { Type } from "class-transformer"; import { EnumUserStatus } from "./EnumUserStatus"; + @InputType() class UserUpdateInput { @ApiProperty({ @@ -38,30 +32,6 @@ class UserUpdateInput { }) firstName?: string | null; - @ApiProperty({ - required: false, - type: () => FriendRelationshipUpdateManyWithoutUsersInput, - }) - @ValidateNested() - @Type(() => FriendRelationshipUpdateManyWithoutUsersInput) - @IsOptional() - @Field(() => FriendRelationshipUpdateManyWithoutUsersInput, { - nullable: true, - }) - friendRelationships?: FriendRelationshipUpdateManyWithoutUsersInput; - - @ApiProperty({ - required: false, - type: () => FriendRelationshipUpdateManyWithoutUsersInput, - }) - @ValidateNested() - @Type(() => FriendRelationshipUpdateManyWithoutUsersInput) - @IsOptional() - @Field(() => FriendRelationshipUpdateManyWithoutUsersInput, { - nullable: true, - }) - invites?: FriendRelationshipUpdateManyWithoutUsersInput; - @ApiProperty({ required: false, type: String, @@ -86,32 +56,8 @@ class UserUpdateInput { @ApiProperty({ required: false, - type: () => PrivateMessageUpdateManyWithoutUsersInput, - }) - @ValidateNested() - @Type(() => PrivateMessageUpdateManyWithoutUsersInput) - @IsOptional() - @Field(() => PrivateMessageUpdateManyWithoutUsersInput, { - nullable: true, - }) - privateMessages?: PrivateMessageUpdateManyWithoutUsersInput; - - @ApiProperty({ - required: false, - type: () => PrivateMessageUpdateManyWithoutUsersInput, }) - @ValidateNested() - @Type(() => PrivateMessageUpdateManyWithoutUsersInput) - @IsOptional() - @Field(() => PrivateMessageUpdateManyWithoutUsersInput, { - nullable: true, - }) - receivedMessges?: PrivateMessageUpdateManyWithoutUsersInput; - - @ApiProperty({ - required: false, - }) - @IsJSON() + @IsJSONValue() @IsOptional() @Field(() => GraphQLJSON, { nullable: true, @@ -152,4 +98,5 @@ class UserUpdateInput { }) username?: string; } -export { UserUpdateInput }; + +export { UserUpdateInput as UserUpdateInput }; diff --git a/packages/core/src/user/base/UserWhereInput.ts b/packages/core/src/user/base/UserWhereInput.ts index 7c89936..97b4e4a 100644 --- a/packages/core/src/user/base/UserWhereInput.ts +++ b/packages/core/src/user/base/UserWhereInput.ts @@ -14,11 +14,10 @@ import { ApiProperty } from "@nestjs/swagger"; import { StringNullableFilter } from "../../util/StringNullableFilter"; import { Type } from "class-transformer"; import { IsOptional, ValidateNested, IsEnum } from "class-validator"; -import { FriendRelationshipListRelationFilter } from "../../friendRelationship/base/FriendRelationshipListRelationFilter"; import { StringFilter } from "../../util/StringFilter"; -import { PrivateMessageListRelationFilter } from "../../privateMessage/base/PrivateMessageListRelationFilter"; import { RoomMessageListRelationFilter } from "../../roomMessage/base/RoomMessageListRelationFilter"; import { EnumUserStatus } from "./EnumUserStatus"; + @InputType() class UserWhereInput { @ApiProperty({ @@ -32,18 +31,6 @@ class UserWhereInput { }) firstName?: StringNullableFilter; - @ApiProperty({ - required: false, - type: () => FriendRelationshipListRelationFilter, - }) - @ValidateNested() - @Type(() => FriendRelationshipListRelationFilter) - @IsOptional() - @Field(() => FriendRelationshipListRelationFilter, { - nullable: true, - }) - friendRelationships?: FriendRelationshipListRelationFilter; - @ApiProperty({ required: false, type: StringFilter, @@ -55,18 +42,6 @@ class UserWhereInput { }) id?: StringFilter; - @ApiProperty({ - required: false, - type: () => FriendRelationshipListRelationFilter, - }) - @ValidateNested() - @Type(() => FriendRelationshipListRelationFilter) - @IsOptional() - @Field(() => FriendRelationshipListRelationFilter, { - nullable: true, - }) - invites?: FriendRelationshipListRelationFilter; - @ApiProperty({ required: false, type: StringNullableFilter, @@ -78,30 +53,6 @@ class UserWhereInput { }) lastName?: StringNullableFilter; - @ApiProperty({ - required: false, - type: () => PrivateMessageListRelationFilter, - }) - @ValidateNested() - @Type(() => PrivateMessageListRelationFilter) - @IsOptional() - @Field(() => PrivateMessageListRelationFilter, { - nullable: true, - }) - privateMessages?: PrivateMessageListRelationFilter; - - @ApiProperty({ - required: false, - type: () => PrivateMessageListRelationFilter, - }) - @ValidateNested() - @Type(() => PrivateMessageListRelationFilter) - @IsOptional() - @Field(() => PrivateMessageListRelationFilter, { - nullable: true, - }) - receivedMessges?: PrivateMessageListRelationFilter; - @ApiProperty({ required: false, type: () => RoomMessageListRelationFilter, @@ -136,4 +87,5 @@ class UserWhereInput { }) username?: StringFilter; } -export { UserWhereInput }; + +export { UserWhereInput as UserWhereInput }; diff --git a/packages/core/src/user/base/UserWhereUniqueInput.ts b/packages/core/src/user/base/UserWhereUniqueInput.ts index 648452d..0bcea12 100644 --- a/packages/core/src/user/base/UserWhereUniqueInput.ts +++ b/packages/core/src/user/base/UserWhereUniqueInput.ts @@ -12,6 +12,7 @@ https://docs.amplication.com/how-to/custom-code import { InputType, Field } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; import { IsString } from "class-validator"; + @InputType() class UserWhereUniqueInput { @ApiProperty({ @@ -22,4 +23,5 @@ class UserWhereUniqueInput { @Field(() => String) id!: string; } -export { UserWhereUniqueInput }; + +export { UserWhereUniqueInput as UserWhereUniqueInput }; diff --git a/packages/core/src/user/base/user.controller.base.ts b/packages/core/src/user/base/user.controller.base.ts index a435f0a..739bb53 100644 --- a/packages/core/src/user/base/user.controller.base.ts +++ b/packages/core/src/user/base/user.controller.base.ts @@ -11,13 +11,13 @@ https://docs.amplication.com/how-to/custom-code */ import * as common from "@nestjs/common"; import * as swagger from "@nestjs/swagger"; -import * as nestAccessControl from "nest-access-control"; -import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; import { isRecordNotFoundError } from "../../prisma.util"; import * as errors from "../../errors"; import { Request } from "express"; import { plainToClass } from "class-transformer"; import { ApiNestedQuery } from "../../decorators/api-nested-query.decorator"; +import * as nestAccessControl from "nest-access-control"; +import * as defaultAuthGuard from "../../auth/defaultAuth.guard"; import { UserService } from "../user.service"; import { AclValidateRequestInterceptor } from "../../interceptors/aclValidateRequest.interceptor"; import { AclFilterResponseInterceptor } from "../../interceptors/aclFilterResponse.interceptor"; @@ -27,15 +27,10 @@ import { UserWhereUniqueInput } from "./UserWhereUniqueInput"; import { UserFindManyArgs } from "./UserFindManyArgs"; import { UserUpdateInput } from "./UserUpdateInput"; import { User } from "./User"; -import { FriendRelationshipFindManyArgs } from "../../friendRelationship/base/FriendRelationshipFindManyArgs"; -import { FriendRelationship } from "../../friendRelationship/base/FriendRelationship"; -import { FriendRelationshipWhereUniqueInput } from "../../friendRelationship/base/FriendRelationshipWhereUniqueInput"; -import { PrivateMessageFindManyArgs } from "../../privateMessage/base/PrivateMessageFindManyArgs"; -import { PrivateMessage } from "../../privateMessage/base/PrivateMessage"; -import { PrivateMessageWhereUniqueInput } from "../../privateMessage/base/PrivateMessageWhereUniqueInput"; import { RoomMessageFindManyArgs } from "../../roomMessage/base/RoomMessageFindManyArgs"; import { RoomMessage } from "../../roomMessage/base/RoomMessage"; import { RoomMessageWhereUniqueInput } from "../../roomMessage/base/RoomMessageWhereUniqueInput"; + @swagger.ApiBearerAuth() @common.UseGuards(defaultAuthGuard.DefaultAuthGuard, nestAccessControl.ACGuard) export class UserControllerBase { @@ -43,16 +38,17 @@ export class UserControllerBase { protected readonly service: UserService, protected readonly rolesBuilder: nestAccessControl.RolesBuilder ) {} - @common.UseInterceptors(AclValidateRequestInterceptor) + @common.Post() + @swagger.ApiCreatedResponse({ type: User }) @nestAccessControl.UseRoles({ resource: "User", action: "create", possession: "any", }) - @common.Post() - @swagger.ApiCreatedResponse({ type: User }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async create(@common.Body() data: UserCreateInput): Promise { return await this.service.create({ data: data, @@ -70,15 +66,17 @@ export class UserControllerBase { } @common.UseInterceptors(AclFilterResponseInterceptor) + @common.Get() + @swagger.ApiOkResponse({ type: [User] }) + @ApiNestedQuery(UserFindManyArgs) @nestAccessControl.UseRoles({ resource: "User", action: "read", possession: "any", }) - @common.Get() - @swagger.ApiOkResponse({ type: [User] }) - @swagger.ApiForbiddenResponse() - @ApiNestedQuery(UserFindManyArgs) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async findMany(@common.Req() request: Request): Promise { const args = plainToClass(UserFindManyArgs, request.query); return this.service.findMany({ @@ -97,15 +95,17 @@ export class UserControllerBase { } @common.UseInterceptors(AclFilterResponseInterceptor) + @common.Get("/:id") + @swagger.ApiOkResponse({ type: User }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "User", action: "read", possession: "own", }) - @common.Get("/:id") - @swagger.ApiOkResponse({ type: User }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async findOne( @common.Param() params: UserWhereUniqueInput ): Promise { @@ -131,15 +131,17 @@ export class UserControllerBase { } @common.UseInterceptors(AclValidateRequestInterceptor) + @common.Patch("/:id") + @swagger.ApiOkResponse({ type: User }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "User", action: "update", possession: "any", }) - @common.Patch("/:id") - @swagger.ApiOkResponse({ type: User }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async update( @common.Param() params: UserWhereUniqueInput, @common.Body() data: UserUpdateInput @@ -169,15 +171,17 @@ export class UserControllerBase { } } + @common.Delete("/:id") + @swagger.ApiOkResponse({ type: User }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) @nestAccessControl.UseRoles({ resource: "User", action: "delete", possession: "any", }) - @common.Delete("/:id") - @swagger.ApiOkResponse({ type: User }) - @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) - @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + @swagger.ApiForbiddenResponse({ + type: errors.ForbiddenException, + }) async delete( @common.Param() params: UserWhereUniqueInput ): Promise { @@ -206,447 +210,13 @@ export class UserControllerBase { } @common.UseInterceptors(AclFilterResponseInterceptor) - @nestAccessControl.UseRoles({ - resource: "FriendRelationship", - action: "read", - possession: "any", - }) - @common.Get("/:id/friendRelationships") - @ApiNestedQuery(FriendRelationshipFindManyArgs) - async findManyFriendRelationships( - @common.Req() request: Request, - @common.Param() params: UserWhereUniqueInput - ): Promise { - const query = plainToClass(FriendRelationshipFindManyArgs, request.query); - const results = await this.service.findFriendRelationships(params.id, { - ...query, - select: { - acceptor: { - select: { - id: true, - }, - }, - - createdAt: true, - id: true, - - inviter: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - if (results === null) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - return results; - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Post("/:id/friendRelationships") - async connectFriendRelationships( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: FriendRelationshipWhereUniqueInput[] - ): Promise { - const data = { - friendRelationships: { - connect: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Patch("/:id/friendRelationships") - async updateFriendRelationships( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: FriendRelationshipWhereUniqueInput[] - ): Promise { - const data = { - friendRelationships: { - set: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Delete("/:id/friendRelationships") - async disconnectFriendRelationships( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: FriendRelationshipWhereUniqueInput[] - ): Promise { - const data = { - friendRelationships: { - disconnect: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @common.UseInterceptors(AclFilterResponseInterceptor) - @nestAccessControl.UseRoles({ - resource: "FriendRelationship", - action: "read", - possession: "any", - }) - @common.Get("/:id/invites") - @ApiNestedQuery(FriendRelationshipFindManyArgs) - async findManyInvites( - @common.Req() request: Request, - @common.Param() params: UserWhereUniqueInput - ): Promise { - const query = plainToClass(FriendRelationshipFindManyArgs, request.query); - const results = await this.service.findInvites(params.id, { - ...query, - select: { - acceptor: { - select: { - id: true, - }, - }, - - createdAt: true, - id: true, - - inviter: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - if (results === null) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - return results; - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Post("/:id/invites") - async connectInvites( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: FriendRelationshipWhereUniqueInput[] - ): Promise { - const data = { - invites: { - connect: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Patch("/:id/invites") - async updateInvites( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: FriendRelationshipWhereUniqueInput[] - ): Promise { - const data = { - invites: { - set: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Delete("/:id/invites") - async disconnectInvites( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: FriendRelationshipWhereUniqueInput[] - ): Promise { - const data = { - invites: { - disconnect: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @common.UseInterceptors(AclFilterResponseInterceptor) - @nestAccessControl.UseRoles({ - resource: "PrivateMessage", - action: "read", - possession: "any", - }) - @common.Get("/:id/privateMessages") - @ApiNestedQuery(PrivateMessageFindManyArgs) - async findManyPrivateMessages( - @common.Req() request: Request, - @common.Param() params: UserWhereUniqueInput - ): Promise { - const query = plainToClass(PrivateMessageFindManyArgs, request.query); - const results = await this.service.findPrivateMessages(params.id, { - ...query, - select: { - content: true, - createdAt: true, - id: true, - - receiver: { - select: { - id: true, - }, - }, - - sender: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - if (results === null) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - return results; - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Post("/:id/privateMessages") - async connectPrivateMessages( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: PrivateMessageWhereUniqueInput[] - ): Promise { - const data = { - privateMessages: { - connect: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Patch("/:id/privateMessages") - async updatePrivateMessages( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: PrivateMessageWhereUniqueInput[] - ): Promise { - const data = { - privateMessages: { - set: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Delete("/:id/privateMessages") - async disconnectPrivateMessages( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: PrivateMessageWhereUniqueInput[] - ): Promise { - const data = { - privateMessages: { - disconnect: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @common.UseInterceptors(AclFilterResponseInterceptor) - @nestAccessControl.UseRoles({ - resource: "PrivateMessage", - action: "read", - possession: "any", - }) - @common.Get("/:id/receivedMessges") - @ApiNestedQuery(PrivateMessageFindManyArgs) - async findManyReceivedMessges( - @common.Req() request: Request, - @common.Param() params: UserWhereUniqueInput - ): Promise { - const query = plainToClass(PrivateMessageFindManyArgs, request.query); - const results = await this.service.findReceivedMessges(params.id, { - ...query, - select: { - content: true, - createdAt: true, - id: true, - - receiver: { - select: { - id: true, - }, - }, - - sender: { - select: { - id: true, - }, - }, - - updatedAt: true, - }, - }); - if (results === null) { - throw new errors.NotFoundException( - `No resource was found for ${JSON.stringify(params)}` - ); - } - return results; - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Post("/:id/receivedMessges") - async connectReceivedMessges( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: PrivateMessageWhereUniqueInput[] - ): Promise { - const data = { - receivedMessges: { - connect: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Patch("/:id/receivedMessges") - async updateReceivedMessges( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: PrivateMessageWhereUniqueInput[] - ): Promise { - const data = { - receivedMessges: { - set: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @nestAccessControl.UseRoles({ - resource: "User", - action: "update", - possession: "any", - }) - @common.Delete("/:id/receivedMessges") - async disconnectReceivedMessges( - @common.Param() params: UserWhereUniqueInput, - @common.Body() body: PrivateMessageWhereUniqueInput[] - ): Promise { - const data = { - receivedMessges: { - disconnect: body, - }, - }; - await this.service.update({ - where: params, - data, - select: { id: true }, - }); - } - - @common.UseInterceptors(AclFilterResponseInterceptor) + @common.Get("/:id/roomMessages") + @ApiNestedQuery(RoomMessageFindManyArgs) @nestAccessControl.UseRoles({ resource: "RoomMessage", action: "read", possession: "any", }) - @common.Get("/:id/roomMessages") - @ApiNestedQuery(RoomMessageFindManyArgs) async findManyRoomMessages( @common.Req() request: Request, @common.Param() params: UserWhereUniqueInput @@ -677,12 +247,12 @@ export class UserControllerBase { return results; } + @common.Post("/:id/roomMessages") @nestAccessControl.UseRoles({ resource: "User", action: "update", possession: "any", }) - @common.Post("/:id/roomMessages") async connectRoomMessages( @common.Param() params: UserWhereUniqueInput, @common.Body() body: RoomMessageWhereUniqueInput[] @@ -699,12 +269,12 @@ export class UserControllerBase { }); } + @common.Patch("/:id/roomMessages") @nestAccessControl.UseRoles({ resource: "User", action: "update", possession: "any", }) - @common.Patch("/:id/roomMessages") async updateRoomMessages( @common.Param() params: UserWhereUniqueInput, @common.Body() body: RoomMessageWhereUniqueInput[] @@ -721,12 +291,12 @@ export class UserControllerBase { }); } + @common.Delete("/:id/roomMessages") @nestAccessControl.UseRoles({ resource: "User", action: "update", possession: "any", }) - @common.Delete("/:id/roomMessages") async disconnectRoomMessages( @common.Param() params: UserWhereUniqueInput, @common.Body() body: RoomMessageWhereUniqueInput[] diff --git a/packages/core/src/user/base/user.module.base.ts b/packages/core/src/user/base/user.module.base.ts index 6dc8244..76d29fe 100644 --- a/packages/core/src/user/base/user.module.base.ts +++ b/packages/core/src/user/base/user.module.base.ts @@ -11,18 +11,10 @@ https://docs.amplication.com/how-to/custom-code */ import { Module, forwardRef } from "@nestjs/common"; import { MorganModule } from "nest-morgan"; -import { PrismaModule } from "nestjs-prisma"; import { ACLModule } from "../../auth/acl.module"; import { AuthModule } from "../../auth/auth.module"; - @Module({ - imports: [ - ACLModule, - forwardRef(() => AuthModule), - MorganModule, - PrismaModule, - ], - - exports: [ACLModule, AuthModule, MorganModule, PrismaModule], + imports: [ACLModule, forwardRef(() => AuthModule), MorganModule], + exports: [ACLModule, AuthModule, MorganModule], }) export class UserModuleBase {} diff --git a/packages/core/src/user/base/user.service.base.ts b/packages/core/src/user/base/user.service.base.ts index 29dbc9c..75bf3be 100644 --- a/packages/core/src/user/base/user.service.base.ts +++ b/packages/core/src/user/base/user.service.base.ts @@ -9,14 +9,8 @@ https://docs.amplication.com/how-to/custom-code ------------------------------------------------------------------------------ */ -import { PrismaService } from "nestjs-prisma"; -import { - Prisma, - User, - FriendRelationship, - PrivateMessage, - RoomMessage, -} from "@prisma/client"; +import { PrismaService } from "../../prisma/prisma.service"; +import { Prisma, User, RoomMessage } from "@prisma/client"; import { PasswordService } from "../../auth/password.service"; import { transformStringFieldUpdateInput } from "../../prisma.util"; @@ -78,50 +72,6 @@ export class UserServiceBase { return this.prisma.user.delete(args); } - async findFriendRelationships( - parentId: string, - args: Prisma.FriendRelationshipFindManyArgs - ): Promise { - return this.prisma.user - .findUniqueOrThrow({ - where: { id: parentId }, - }) - .friendRelationships(args); - } - - async findInvites( - parentId: string, - args: Prisma.FriendRelationshipFindManyArgs - ): Promise { - return this.prisma.user - .findUniqueOrThrow({ - where: { id: parentId }, - }) - .invites(args); - } - - async findPrivateMessages( - parentId: string, - args: Prisma.PrivateMessageFindManyArgs - ): Promise { - return this.prisma.user - .findUniqueOrThrow({ - where: { id: parentId }, - }) - .privateMessages(args); - } - - async findReceivedMessges( - parentId: string, - args: Prisma.PrivateMessageFindManyArgs - ): Promise { - return this.prisma.user - .findUniqueOrThrow({ - where: { id: parentId }, - }) - .receivedMessges(args); - } - async findRoomMessages( parentId: string, args: Prisma.RoomMessageFindManyArgs diff --git a/packages/core/src/util/JsonNullableFilter.ts b/packages/core/src/util/JsonNullableFilter.ts index 2750eaf..3381d52 100644 --- a/packages/core/src/util/JsonNullableFilter.ts +++ b/packages/core/src/util/JsonNullableFilter.ts @@ -1,4 +1,4 @@ -import { JsonValue } from "type-fest"; +import type { JsonValue } from "type-fest"; import { Field, InputType } from "@nestjs/graphql"; import { ApiProperty } from "@nestjs/swagger"; import { IsOptional } from "class-validator"; diff --git a/packages/core/src/validators/index.ts b/packages/core/src/validators/index.ts new file mode 100644 index 0000000..7f62d84 --- /dev/null +++ b/packages/core/src/validators/index.ts @@ -0,0 +1 @@ +export * from "./is-json-value-validator"; diff --git a/packages/core/src/validators/is-json-value-validator.spec.ts b/packages/core/src/validators/is-json-value-validator.spec.ts new file mode 100644 index 0000000..5a77824 --- /dev/null +++ b/packages/core/src/validators/is-json-value-validator.spec.ts @@ -0,0 +1,44 @@ +import { validate, ValidationError } from "class-validator"; +import { IsJSONValue } from "./is-json-value-validator"; + +class TestClass { + @IsJSONValue() + jsonProperty: unknown; +} + +describe("IsJSONValue", () => { + it("should validate a valid JSON string", async () => { + const testObj = new TestClass(); + testObj.jsonProperty = '{"name": "John", "age": 30}'; + const errors: ValidationError[] = await validate(testObj); + expect(errors.length).toBe(0); + }); + + it("should not validate an invalid JSON string", async () => { + const testObj = new TestClass(); + testObj.jsonProperty = '{name: "John", age: 30}'; + const errors: ValidationError[] = await validate(testObj); + expect(errors.length).toBe(1); + }); + + it("should not validate an invalid JSON string", async () => { + const testObj = new TestClass(); + testObj.jsonProperty = "John"; + const errors: ValidationError[] = await validate(testObj); + expect(errors.length).toBe(1); + }); + + it("should validate a valid JSON object", async () => { + const testObj = new TestClass(); + testObj.jsonProperty = { name: "John", age: 30 }; + const errors: ValidationError[] = await validate(testObj); + expect(errors.length).toBe(0); + }); + + it("should validate a valid JSON array", async () => { + const testObj = new TestClass(); + testObj.jsonProperty = ["John", "30"]; + const errors: ValidationError[] = await validate(testObj); + expect(errors.length).toBe(0); + }); +}); diff --git a/packages/core/src/validators/is-json-value-validator.ts b/packages/core/src/validators/is-json-value-validator.ts new file mode 100644 index 0000000..7b96b4a --- /dev/null +++ b/packages/core/src/validators/is-json-value-validator.ts @@ -0,0 +1,29 @@ +import { + ValidationArguments, + registerDecorator, + ValidationOptions, +} from "class-validator"; +import isJSONValidator from "validator/lib/isJSON"; + +export function IsJSONValue(validationOptions?: ValidationOptions) { + return function (object: Object, propertyName: string) { + registerDecorator({ + name: "IsJSONValue", + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + validator: { + validate(value: any, args: ValidationArguments) { + if (typeof value === "string") { + return isJSONValidator(value); + } + + return isJSONValidator(JSON.stringify(value)); + }, + defaultMessage(args: ValidationArguments): string { + return `${args.property} must be a valid json`; + }, + }, + }); + }; +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index ff90c46..f084cf7 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "baseUrl": "./", "module": "commonjs", "declaration": false, "removeComments": true, @@ -14,7 +15,10 @@ "allowSyntheticDefaultImports": true, "resolveJsonModule": true, "skipLibCheck": true, - "strict": true + "strict": true, + "paths": { + "@app/custom-validators": ["src/validators"] + } }, "include": ["src"] }