diff --git a/admin-ui/package-lock.json b/admin-ui/package-lock.json index 9457d6a..ad5e073 100644 --- a/admin-ui/package-lock.json +++ b/admin-ui/package-lock.json @@ -1,10 +1,10 @@ { - "name": "my-app-45-admin", + "name": "my-app-75-admin", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "my-app-45-admin", + "name": "my-app-75-admin", "dependencies": { "@apollo/client": "^3.3.18", "@material-ui/core": "^4.11.4", diff --git a/admin-ui/package.json b/admin-ui/package.json index 5ecaa81..43f0804 100644 --- a/admin-ui/package.json +++ b/admin-ui/package.json @@ -1,5 +1,5 @@ { - "name": "my-app-45-admin", + "name": "my-app-75-admin", "private": true, "dependencies": { "@apollo/client": "^3.3.18", diff --git a/admin-ui/public/index.html b/admin-ui/public/index.html index 896a28f..2712554 100644 --- a/admin-ui/public/index.html +++ b/admin-ui/public/index.html @@ -21,7 +21,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - My app-45 + My app-75 diff --git a/admin-ui/public/manifest.json b/admin-ui/public/manifest.json index 9f673bd..cdb3465 100644 --- a/admin-ui/public/manifest.json +++ b/admin-ui/public/manifest.json @@ -1,6 +1,6 @@ { - "short_name": "My app-45", - "name": "My app-45", + "short_name": "My app-75", + "name": "My app-75", "icons": [ { "src": "favicon.ico", diff --git a/admin-ui/src/App.tsx b/admin-ui/src/App.tsx index f7a147e..9734697 100644 --- a/admin-ui/src/App.tsx +++ b/admin-ui/src/App.tsx @@ -10,14 +10,10 @@ import { UserList } from "./user/UserList"; import { UserCreate } from "./user/UserCreate"; import { UserEdit } from "./user/UserEdit"; import { UserShow } from "./user/UserShow"; -import { CategoryList } from "./category/CategoryList"; -import { CategoryCreate } from "./category/CategoryCreate"; -import { CategoryEdit } from "./category/CategoryEdit"; -import { CategoryShow } from "./category/CategoryShow"; -import { ProductList } from "./product/ProductList"; -import { ProductCreate } from "./product/ProductCreate"; -import { ProductEdit } from "./product/ProductEdit"; -import { ProductShow } from "./product/ProductShow"; +import { SdfdsfList } from "./sdfdsf/SdfdsfList"; +import { SdfdsfCreate } from "./sdfdsf/SdfdsfCreate"; +import { SdfdsfEdit } from "./sdfdsf/SdfdsfEdit"; +import { SdfdsfShow } from "./sdfdsf/SdfdsfShow"; const App = (): React.ReactElement => { const [dataProvider, setDataProvider] = useState(null); @@ -36,7 +32,7 @@ const App = (): React.ReactElement => { return (
{ show={UserShow} /> -
diff --git a/admin-ui/src/Login.tsx b/admin-ui/src/Login.tsx index 05025cf..5d2a002 100644 --- a/admin-ui/src/Login.tsx +++ b/admin-ui/src/Login.tsx @@ -29,7 +29,7 @@ const Login = ({ theme }: { theme?: object }) => { src="https://amplication.com/assets/graphql.png" alt="GraphQL API" /> -

Connect via GrpahQL

+

Connect via GraphQL

Connect to the server using GraphQL API with a complete and understandable description of the data in your API diff --git a/admin-ui/src/api/sdfdsf/DeleteSdfdsfArgs.ts b/admin-ui/src/api/sdfdsf/DeleteSdfdsfArgs.ts new file mode 100644 index 0000000..5f8be0f --- /dev/null +++ b/admin-ui/src/api/sdfdsf/DeleteSdfdsfArgs.ts @@ -0,0 +1,5 @@ +import { SdfdsfWhereUniqueInput } from "./SdfdsfWhereUniqueInput"; + +export type DeleteSdfdsfArgs = { + where: SdfdsfWhereUniqueInput; +}; diff --git a/admin-ui/src/api/sdfdsf/Sdfdsf.ts b/admin-ui/src/api/sdfdsf/Sdfdsf.ts new file mode 100644 index 0000000..c42738d --- /dev/null +++ b/admin-ui/src/api/sdfdsf/Sdfdsf.ts @@ -0,0 +1,5 @@ +export type Sdfdsf = { + createdAt: Date; + id: string; + updatedAt: Date; +}; diff --git a/admin-ui/src/api/sdfdsf/SdfdsfCreateInput.ts b/admin-ui/src/api/sdfdsf/SdfdsfCreateInput.ts new file mode 100644 index 0000000..b452615 --- /dev/null +++ b/admin-ui/src/api/sdfdsf/SdfdsfCreateInput.ts @@ -0,0 +1 @@ +export type SdfdsfCreateInput = {}; diff --git a/admin-ui/src/api/sdfdsf/SdfdsfFindManyArgs.ts b/admin-ui/src/api/sdfdsf/SdfdsfFindManyArgs.ts new file mode 100644 index 0000000..75ebab0 --- /dev/null +++ b/admin-ui/src/api/sdfdsf/SdfdsfFindManyArgs.ts @@ -0,0 +1,9 @@ +import { SdfdsfWhereInput } from "./SdfdsfWhereInput"; +import { SdfdsfOrderByInput } from "./SdfdsfOrderByInput"; + +export type SdfdsfFindManyArgs = { + where?: SdfdsfWhereInput; + orderBy?: SdfdsfOrderByInput; + skip?: number; + take?: number; +}; diff --git a/admin-ui/src/api/sdfdsf/SdfdsfFindUniqueArgs.ts b/admin-ui/src/api/sdfdsf/SdfdsfFindUniqueArgs.ts new file mode 100644 index 0000000..cd44bb3 --- /dev/null +++ b/admin-ui/src/api/sdfdsf/SdfdsfFindUniqueArgs.ts @@ -0,0 +1,5 @@ +import { SdfdsfWhereUniqueInput } from "./SdfdsfWhereUniqueInput"; + +export type SdfdsfFindUniqueArgs = { + where: SdfdsfWhereUniqueInput; +}; diff --git a/admin-ui/src/api/sdfdsf/SdfdsfOrderByInput.ts b/admin-ui/src/api/sdfdsf/SdfdsfOrderByInput.ts new file mode 100644 index 0000000..fb45287 --- /dev/null +++ b/admin-ui/src/api/sdfdsf/SdfdsfOrderByInput.ts @@ -0,0 +1,7 @@ +import { SortOrder } from "../../util/SortOrder"; + +export type SdfdsfOrderByInput = { + createdAt?: SortOrder; + id?: SortOrder; + updatedAt?: SortOrder; +}; diff --git a/admin-ui/src/api/sdfdsf/SdfdsfUpdateInput.ts b/admin-ui/src/api/sdfdsf/SdfdsfUpdateInput.ts new file mode 100644 index 0000000..82278df --- /dev/null +++ b/admin-ui/src/api/sdfdsf/SdfdsfUpdateInput.ts @@ -0,0 +1 @@ +export type SdfdsfUpdateInput = {}; diff --git a/admin-ui/src/api/sdfdsf/SdfdsfWhereInput.ts b/admin-ui/src/api/sdfdsf/SdfdsfWhereInput.ts new file mode 100644 index 0000000..3911348 --- /dev/null +++ b/admin-ui/src/api/sdfdsf/SdfdsfWhereInput.ts @@ -0,0 +1,5 @@ +import { StringFilter } from "../../util/StringFilter"; + +export type SdfdsfWhereInput = { + id?: StringFilter; +}; diff --git a/admin-ui/src/api/sdfdsf/SdfdsfWhereUniqueInput.ts b/admin-ui/src/api/sdfdsf/SdfdsfWhereUniqueInput.ts new file mode 100644 index 0000000..45ee048 --- /dev/null +++ b/admin-ui/src/api/sdfdsf/SdfdsfWhereUniqueInput.ts @@ -0,0 +1,3 @@ +export type SdfdsfWhereUniqueInput = { + id: string; +}; diff --git a/admin-ui/src/api/user/User.ts b/admin-ui/src/api/user/User.ts index 208e9d6..798058f 100644 --- a/admin-ui/src/api/user/User.ts +++ b/admin-ui/src/api/user/User.ts @@ -1,10 +1,8 @@ export type User = { createdAt: Date; - email: string | null; firstName: string | null; id: string; lastName: string | null; - mobile: string; roles: Array; updatedAt: Date; username: string; diff --git a/admin-ui/src/api/user/UserCreateInput.ts b/admin-ui/src/api/user/UserCreateInput.ts index 432fdf9..2348030 100644 --- a/admin-ui/src/api/user/UserCreateInput.ts +++ b/admin-ui/src/api/user/UserCreateInput.ts @@ -1,8 +1,6 @@ export type UserCreateInput = { - email?: string | null; firstName?: string | null; lastName?: string | null; - mobile: string; password: string; roles: Array; username: string; diff --git a/admin-ui/src/api/user/UserOrderByInput.ts b/admin-ui/src/api/user/UserOrderByInput.ts index ed728eb..36cee1e 100644 --- a/admin-ui/src/api/user/UserOrderByInput.ts +++ b/admin-ui/src/api/user/UserOrderByInput.ts @@ -2,11 +2,9 @@ import { SortOrder } from "../../util/SortOrder"; export type UserOrderByInput = { createdAt?: SortOrder; - email?: SortOrder; firstName?: SortOrder; id?: SortOrder; lastName?: SortOrder; - mobile?: SortOrder; password?: SortOrder; roles?: SortOrder; updatedAt?: SortOrder; diff --git a/admin-ui/src/api/user/UserUpdateInput.ts b/admin-ui/src/api/user/UserUpdateInput.ts index f98e894..2ec7caf 100644 --- a/admin-ui/src/api/user/UserUpdateInput.ts +++ b/admin-ui/src/api/user/UserUpdateInput.ts @@ -1,8 +1,6 @@ export type UserUpdateInput = { - email?: string | null; firstName?: string | null; lastName?: string | null; - mobile?: string; password?: string; roles?: Array; username?: string; diff --git a/admin-ui/src/api/user/UserWhereInput.ts b/admin-ui/src/api/user/UserWhereInput.ts index 2624825..22c10cb 100644 --- a/admin-ui/src/api/user/UserWhereInput.ts +++ b/admin-ui/src/api/user/UserWhereInput.ts @@ -2,10 +2,8 @@ import { StringNullableFilter } from "../../util/StringNullableFilter"; import { StringFilter } from "../../util/StringFilter"; export type UserWhereInput = { - email?: StringNullableFilter; firstName?: StringNullableFilter; id?: StringFilter; lastName?: StringNullableFilter; - mobile?: StringFilter; username?: StringFilter; }; diff --git a/admin-ui/src/sdfdsf/SdfdsfCreate.tsx b/admin-ui/src/sdfdsf/SdfdsfCreate.tsx new file mode 100644 index 0000000..d8b870f --- /dev/null +++ b/admin-ui/src/sdfdsf/SdfdsfCreate.tsx @@ -0,0 +1,12 @@ +import * as React from "react"; +import { Create, SimpleForm, CreateProps } from "react-admin"; + +export const SdfdsfCreate = (props: CreateProps): React.ReactElement => { + return ( + + +
+ + + ); +}; diff --git a/admin-ui/src/sdfdsf/SdfdsfEdit.tsx b/admin-ui/src/sdfdsf/SdfdsfEdit.tsx new file mode 100644 index 0000000..79f77a1 --- /dev/null +++ b/admin-ui/src/sdfdsf/SdfdsfEdit.tsx @@ -0,0 +1,12 @@ +import * as React from "react"; +import { Edit, SimpleForm, EditProps } from "react-admin"; + +export const SdfdsfEdit = (props: EditProps): React.ReactElement => { + return ( + + +
+ + + ); +}; diff --git a/admin-ui/src/sdfdsf/SdfdsfList.tsx b/admin-ui/src/sdfdsf/SdfdsfList.tsx new file mode 100644 index 0000000..d796329 --- /dev/null +++ b/admin-ui/src/sdfdsf/SdfdsfList.tsx @@ -0,0 +1,21 @@ +import * as React from "react"; +import { List, Datagrid, ListProps, DateField, TextField } from "react-admin"; +import Pagination from "../Components/Pagination"; + +export const SdfdsfList = (props: ListProps): React.ReactElement => { + return ( + } + > + + + + + + + ); +}; diff --git a/admin-ui/src/sdfdsf/SdfdsfShow.tsx b/admin-ui/src/sdfdsf/SdfdsfShow.tsx new file mode 100644 index 0000000..27d8567 --- /dev/null +++ b/admin-ui/src/sdfdsf/SdfdsfShow.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; +import { + Show, + SimpleShowLayout, + ListProps, + DateField, + TextField, +} from "react-admin"; + +export const SdfdsfShow = (props: ListProps): React.ReactElement => { + return ( + + + + + + + + ); +}; diff --git a/admin-ui/src/sdfdsf/SdfdsfTitle.ts b/admin-ui/src/sdfdsf/SdfdsfTitle.ts new file mode 100644 index 0000000..61ec7f7 --- /dev/null +++ b/admin-ui/src/sdfdsf/SdfdsfTitle.ts @@ -0,0 +1,7 @@ +import { Sdfdsf as TSdfdsf } from "../api/sdfdsf/Sdfdsf"; + +export const SDFDSF_TITLE_FIELD = "id"; + +export const SdfdsfTitle = (record: TSdfdsf) => { + return record.id; +}; diff --git a/admin-ui/src/user/UserCreate.tsx b/admin-ui/src/user/UserCreate.tsx index 9fc4820..8dd276a 100644 --- a/admin-ui/src/user/UserCreate.tsx +++ b/admin-ui/src/user/UserCreate.tsx @@ -15,10 +15,8 @@ export const UserCreate = (props: CreateProps): React.ReactElement => { return ( - - { return ( - - { > - - diff --git a/admin-ui/src/user/UserShow.tsx b/admin-ui/src/user/UserShow.tsx index cc46b5f..dea7fef 100644 --- a/admin-ui/src/user/UserShow.tsx +++ b/admin-ui/src/user/UserShow.tsx @@ -12,11 +12,9 @@ export const UserShow = (props: ListProps): React.ReactElement => { - - diff --git a/ampconfig.json b/ampconfig.json index 5bc5f88..f6aff1c 100644 --- a/ampconfig.json +++ b/ampconfig.json @@ -1,10 +1,10 @@ { - "dataServiceGeneratorVersion": "0.6.1", + "dataServiceGeneratorVersion": "0.6.3", "appInfo": { - "name": "My app-45", + "name": "My app-75", "description": "", - "version": "qpq3cyhw", - "id": "ckp253vyk4601151bs6mjio6mex", - "url": "https://app.amplication.com/ckp253vyk4601151bs6mjio6mex" + "version": "e39oruad", + "id": "ckpf93fhx39741bs6ulyffgp6", + "url": "https://app.amplication.com/ckpf93fhx39741bs6ulyffgp6" } } diff --git a/server/package-lock.json b/server/package-lock.json index 85c512e..3bcadcc 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,10 +1,10 @@ { - "name": "my-app-45-server", + "name": "my-app-75-server", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "my-app-45-server", + "name": "my-app-75-server", "dependencies": { "@nestjs/common": "^7.3.2", "@nestjs/config": "^0.6.1", diff --git a/server/package.json b/server/package.json index f8219c7..ab24d34 100644 --- a/server/package.json +++ b/server/package.json @@ -1,5 +1,5 @@ { - "name": "my-app-45-server", + "name": "my-app-75-server", "private": true, "scripts": { "start": "nest start", diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index be7f93a..de2e62c 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -9,36 +9,17 @@ generator client { model User { createdAt DateTime @default(now()) - email String? firstName String? id String @id @default(cuid()) lastName String? - mobile String password String roles String[] updatedAt DateTime @updatedAt username String @unique } -model Category { - categories Category @relation(name: "categories") - createdAt DateTime @default(now()) - description String? - id String @id @default(cuid()) - image String? - parentId Category? @relation(name: "categories", fields: [parentIdId], references: [id]) - parentIdId String? - tile String? - updatedAt DateTime @updatedAt -} - -model Product { - categoryIds String? - createdAt DateTime @default(now()) - id String @id @default(cuid()) - image String? - name String? - size String? - sku String? - updatedAt DateTime @updatedAt +model Sdfdsf { + createdAt DateTime @default(now()) + id String @id @default(cuid()) + updatedAt DateTime @updatedAt } \ No newline at end of file diff --git a/server/scripts/seed.ts b/server/scripts/seed.ts index 6c9b662..fbc67c4 100644 --- a/server/scripts/seed.ts +++ b/server/scripts/seed.ts @@ -28,7 +28,6 @@ async function seed(bcryptSalt: Salt) { username: "admin", password: await hash("admin", bcryptSalt), roles: ["user"], - mobile: "", }; await client.user.upsert({ where: { username: data.username }, diff --git a/server/src/app.module.ts b/server/src/app.module.ts index f0f1f50..41785fb 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -1,7 +1,6 @@ import { Module } from "@nestjs/common"; import { UserModule } from "./user/user.module"; -import { CategoryModule } from "./category/category.module"; -import { ProductModule } from "./product/product.module"; +import { SdfdsfModule } from "./sdfdsf/sdfdsf.module"; import { ACLModule } from "./auth/acl.module"; import { AuthModule } from "./auth/auth.module"; import { MorganModule } from "nest-morgan"; @@ -14,8 +13,7 @@ import { GraphQLModule } from "@nestjs/graphql"; controllers: [], imports: [ UserModule, - CategoryModule, - ProductModule, + SdfdsfModule, ACLModule, AuthModule, MorganModule, diff --git a/server/src/auth/auth.resolver.ts b/server/src/auth/auth.resolver.ts index 05b3a0b..cc752d9 100644 --- a/server/src/auth/auth.resolver.ts +++ b/server/src/auth/auth.resolver.ts @@ -1,8 +1,12 @@ -import { Args, Mutation, Resolver } from "@nestjs/graphql"; +import * as common from "@nestjs/common"; +import * as gqlBasicAuthGuard from "../auth/gqlBasicAuth.guard"; +import * as gqlACGuard from "../auth/gqlAC.guard"; +import { Args, Mutation, Resolver, Query } from "@nestjs/graphql"; import { ApolloError } from "apollo-server-express"; import { AuthService } from "./auth.service"; import { UserInfo } from "./UserInfo"; import { LoginArgs } from "./LoginArgs"; +import { UserData } from "./gqlUserData.decorator"; @Resolver(UserInfo) export class AuthResolver { @@ -18,4 +22,10 @@ export class AuthResolver { } return user; } + + @Query(() => UserInfo) + @common.UseGuards(gqlBasicAuthGuard.GqlBasicAuthGuard, gqlACGuard.GqlACGuard) + async userInfo(@UserData() userInfo: UserInfo): Promise { + return userInfo; + } } diff --git a/server/src/auth/gqlUserData.decorator.ts b/server/src/auth/gqlUserData.decorator.ts new file mode 100644 index 0000000..4871099 --- /dev/null +++ b/server/src/auth/gqlUserData.decorator.ts @@ -0,0 +1,15 @@ +import { createParamDecorator, ExecutionContext } from "@nestjs/common"; +import { GqlExecutionContext } from "@nestjs/graphql"; +import { UserInfo } from "./UserInfo"; + +/** + * Access the user data from the request object i.e `req.user`. + */ +export function getUser(executionContext: ExecutionContext): UserInfo { + const gqlExecutionContext = GqlExecutionContext.create(executionContext); + return gqlExecutionContext.getContext().req.user; +} + +export const UserData = createParamDecorator((data, ctx: ExecutionContext) => + getUser(ctx) +); diff --git a/server/src/grants.json b/server/src/grants.json index 4d33df4..ba377e5 100644 --- a/server/src/grants.json +++ b/server/src/grants.json @@ -31,61 +31,31 @@ }, { "role": "user", - "resource": "Category", + "resource": "Sdfdsf", "action": "read:own", "attributes": "*" }, { "role": "user", - "resource": "Category", + "resource": "Sdfdsf", "action": "create:any", "attributes": "*" }, { "role": "user", - "resource": "Category", + "resource": "Sdfdsf", "action": "update:any", "attributes": "*" }, { "role": "user", - "resource": "Category", + "resource": "Sdfdsf", "action": "delete:any", "attributes": "*" }, { "role": "user", - "resource": "Category", - "action": "read:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "Product", - "action": "read:own", - "attributes": "*" - }, - { - "role": "user", - "resource": "Product", - "action": "create:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "Product", - "action": "update:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "Product", - "action": "delete:any", - "attributes": "*" - }, - { - "role": "user", - "resource": "Product", + "resource": "Sdfdsf", "action": "read:any", "attributes": "*" } diff --git a/server/src/sdfdsf/base/DeleteSdfdsfArgs.ts b/server/src/sdfdsf/base/DeleteSdfdsfArgs.ts new file mode 100644 index 0000000..39122f7 --- /dev/null +++ b/server/src/sdfdsf/base/DeleteSdfdsfArgs.ts @@ -0,0 +1,10 @@ +import { ArgsType, Field } from "@nestjs/graphql"; +import { SdfdsfWhereUniqueInput } from "./SdfdsfWhereUniqueInput"; + +@ArgsType() +class DeleteSdfdsfArgs { + @Field(() => SdfdsfWhereUniqueInput, { nullable: false }) + where!: SdfdsfWhereUniqueInput; +} + +export { DeleteSdfdsfArgs }; diff --git a/server/src/sdfdsf/base/Sdfdsf.ts b/server/src/sdfdsf/base/Sdfdsf.ts new file mode 100644 index 0000000..0ca3a43 --- /dev/null +++ b/server/src/sdfdsf/base/Sdfdsf.ts @@ -0,0 +1,31 @@ +import { ObjectType, Field } from "@nestjs/graphql"; +import { ApiProperty } from "@nestjs/swagger"; +import { IsDate, IsString } from "class-validator"; +import { Type } from "class-transformer"; +@ObjectType() +class Sdfdsf { + @ApiProperty({ + required: true, + }) + @IsDate() + @Type(() => Date) + @Field(() => Date) + createdAt!: Date; + + @ApiProperty({ + required: true, + type: String, + }) + @IsString() + @Field(() => String) + id!: string; + + @ApiProperty({ + required: true, + }) + @IsDate() + @Type(() => Date) + @Field(() => Date) + updatedAt!: Date; +} +export { Sdfdsf }; diff --git a/server/src/sdfdsf/base/SdfdsfCreateInput.ts b/server/src/sdfdsf/base/SdfdsfCreateInput.ts new file mode 100644 index 0000000..3b1959b --- /dev/null +++ b/server/src/sdfdsf/base/SdfdsfCreateInput.ts @@ -0,0 +1,2 @@ +class SdfdsfCreateInput {} +export { SdfdsfCreateInput }; diff --git a/server/src/sdfdsf/base/SdfdsfFindManyArgs.ts b/server/src/sdfdsf/base/SdfdsfFindManyArgs.ts new file mode 100644 index 0000000..567bee7 --- /dev/null +++ b/server/src/sdfdsf/base/SdfdsfFindManyArgs.ts @@ -0,0 +1,42 @@ +import { ArgsType, Field } from "@nestjs/graphql"; +import { ApiProperty } from "@nestjs/swagger"; +import { SdfdsfWhereInput } from "./SdfdsfWhereInput"; +import { Type } from "class-transformer"; +import { SdfdsfOrderByInput } from "./SdfdsfOrderByInput"; + +@ArgsType() +class SdfdsfFindManyArgs { + @ApiProperty({ + required: false, + type: () => SdfdsfWhereInput, + }) + @Field(() => SdfdsfWhereInput, { nullable: true }) + @Type(() => SdfdsfWhereInput) + where?: SdfdsfWhereInput; + + @ApiProperty({ + required: false, + type: SdfdsfOrderByInput, + }) + @Field(() => SdfdsfOrderByInput, { nullable: true }) + @Type(() => SdfdsfOrderByInput) + orderBy?: SdfdsfOrderByInput; + + @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 { SdfdsfFindManyArgs }; diff --git a/server/src/sdfdsf/base/SdfdsfFindUniqueArgs.ts b/server/src/sdfdsf/base/SdfdsfFindUniqueArgs.ts new file mode 100644 index 0000000..1ef64e2 --- /dev/null +++ b/server/src/sdfdsf/base/SdfdsfFindUniqueArgs.ts @@ -0,0 +1,10 @@ +import { ArgsType, Field } from "@nestjs/graphql"; +import { SdfdsfWhereUniqueInput } from "./SdfdsfWhereUniqueInput"; + +@ArgsType() +class SdfdsfFindUniqueArgs { + @Field(() => SdfdsfWhereUniqueInput, { nullable: false }) + where!: SdfdsfWhereUniqueInput; +} + +export { SdfdsfFindUniqueArgs }; diff --git a/server/src/sdfdsf/base/SdfdsfOrderByInput.ts b/server/src/sdfdsf/base/SdfdsfOrderByInput.ts new file mode 100644 index 0000000..8d40627 --- /dev/null +++ b/server/src/sdfdsf/base/SdfdsfOrderByInput.ts @@ -0,0 +1,38 @@ +import { InputType, Field } from "@nestjs/graphql"; +import { ApiProperty } from "@nestjs/swagger"; +import { SortOrder } from "../../util/SortOrder"; + +@InputType({ + isAbstract: true, + description: undefined, +}) +class SdfdsfOrderByInput { + @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, + }) + updatedAt?: SortOrder; +} + +export { SdfdsfOrderByInput }; diff --git a/server/src/sdfdsf/base/SdfdsfUpdateInput.ts b/server/src/sdfdsf/base/SdfdsfUpdateInput.ts new file mode 100644 index 0000000..d967168 --- /dev/null +++ b/server/src/sdfdsf/base/SdfdsfUpdateInput.ts @@ -0,0 +1,2 @@ +class SdfdsfUpdateInput {} +export { SdfdsfUpdateInput }; diff --git a/server/src/sdfdsf/base/SdfdsfWhereInput.ts b/server/src/sdfdsf/base/SdfdsfWhereInput.ts new file mode 100644 index 0000000..c59212b --- /dev/null +++ b/server/src/sdfdsf/base/SdfdsfWhereInput.ts @@ -0,0 +1,19 @@ +import { InputType, Field } from "@nestjs/graphql"; +import { ApiProperty } from "@nestjs/swagger"; +import { StringFilter } from "../../util/StringFilter"; +import { Type } from "class-transformer"; +import { IsOptional } from "class-validator"; +@InputType() +class SdfdsfWhereInput { + @ApiProperty({ + required: false, + type: StringFilter, + }) + @Type(() => StringFilter) + @IsOptional() + @Field(() => StringFilter, { + nullable: true, + }) + id?: StringFilter; +} +export { SdfdsfWhereInput }; diff --git a/server/src/sdfdsf/base/SdfdsfWhereUniqueInput.ts b/server/src/sdfdsf/base/SdfdsfWhereUniqueInput.ts new file mode 100644 index 0000000..219b31f --- /dev/null +++ b/server/src/sdfdsf/base/SdfdsfWhereUniqueInput.ts @@ -0,0 +1,14 @@ +import { InputType, Field } from "@nestjs/graphql"; +import { ApiProperty } from "@nestjs/swagger"; +import { IsString } from "class-validator"; +@InputType() +class SdfdsfWhereUniqueInput { + @ApiProperty({ + required: true, + type: String, + }) + @IsString() + @Field(() => String) + id!: string; +} +export { SdfdsfWhereUniqueInput }; diff --git a/server/src/sdfdsf/base/sdfdsf.controller.base.spec.ts b/server/src/sdfdsf/base/sdfdsf.controller.base.spec.ts new file mode 100644 index 0000000..809caae --- /dev/null +++ b/server/src/sdfdsf/base/sdfdsf.controller.base.spec.ts @@ -0,0 +1,142 @@ +import { Test } from "@nestjs/testing"; +import { INestApplication, HttpStatus, ExecutionContext } from "@nestjs/common"; +import request from "supertest"; +import { MorganModule } from "nest-morgan"; +import { ACGuard } from "nest-access-control"; +import { BasicAuthGuard } from "../../auth/basicAuth.guard"; +import { ACLModule } from "../../auth/acl.module"; +import { SdfdsfController } from "../sdfdsf.controller"; +import { SdfdsfService } from "../sdfdsf.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; + }, +}; + +describe("Sdfdsf", () => { + let app: INestApplication; + + beforeAll(async () => { + const moduleRef = await Test.createTestingModule({ + providers: [ + { + provide: SdfdsfService, + useValue: service, + }, + ], + controllers: [SdfdsfController], + imports: [MorganModule.forRoot(), ACLModule], + }) + .overrideGuard(BasicAuthGuard) + .useValue(basicAuthGuard) + .overrideGuard(ACGuard) + .useValue(acGuard) + .compile(); + + app = moduleRef.createNestApplication(); + await app.init(); + }); + + test("POST /sdfdsfs", async () => { + await request(app.getHttpServer()) + .post("/sdfdsfs") + .send(CREATE_INPUT) + .expect(HttpStatus.CREATED) + .expect({ + ...CREATE_RESULT, + createdAt: CREATE_RESULT.createdAt.toISOString(), + updatedAt: CREATE_RESULT.updatedAt.toISOString(), + }); + }); + + test("GET /sdfdsfs", async () => { + await request(app.getHttpServer()) + .get("/sdfdsfs") + .expect(HttpStatus.OK) + .expect([ + { + ...FIND_MANY_RESULT[0], + createdAt: FIND_MANY_RESULT[0].createdAt.toISOString(), + updatedAt: FIND_MANY_RESULT[0].updatedAt.toISOString(), + }, + ]); + }); + + test("GET /sdfdsfs/:id non existing", async () => { + await request(app.getHttpServer()) + .get(`${"/sdfdsfs"}/${nonExistingId}`) + .expect(404) + .expect({ + statusCode: 404, + message: `No resource was found for {"${"id"}":"${nonExistingId}"}`, + error: "Not Found", + }); + }); + + test("GET /sdfdsfs/:id existing", async () => { + await request(app.getHttpServer()) + .get(`${"/sdfdsfs"}/${existingId}`) + .expect(HttpStatus.OK) + .expect({ + ...FIND_ONE_RESULT, + createdAt: FIND_ONE_RESULT.createdAt.toISOString(), + updatedAt: FIND_ONE_RESULT.updatedAt.toISOString(), + }); + }); + + afterAll(async () => { + await app.close(); + }); +}); diff --git a/server/src/sdfdsf/base/sdfdsf.controller.base.ts b/server/src/sdfdsf/base/sdfdsf.controller.base.ts new file mode 100644 index 0000000..a697228 --- /dev/null +++ b/server/src/sdfdsf/base/sdfdsf.controller.base.ts @@ -0,0 +1,229 @@ +import * as common from "@nestjs/common"; +import * as swagger from "@nestjs/swagger"; +import * as nestMorgan from "nest-morgan"; +import * as nestAccessControl from "nest-access-control"; +import * as basicAuthGuard from "../../auth/basicAuth.guard"; +import * as abacUtil from "../../auth/abac.util"; +import { isRecordNotFoundError } from "../../prisma.util"; +import * as errors from "../../errors"; +import { Request } from "express"; +import { plainToClass } from "class-transformer"; +import { SdfdsfService } from "../sdfdsf.service"; +import { SdfdsfCreateInput } from "./SdfdsfCreateInput"; +import { SdfdsfWhereInput } from "./SdfdsfWhereInput"; +import { SdfdsfWhereUniqueInput } from "./SdfdsfWhereUniqueInput"; +import { SdfdsfFindManyArgs } from "./SdfdsfFindManyArgs"; +import { SdfdsfUpdateInput } from "./SdfdsfUpdateInput"; +import { Sdfdsf } from "./Sdfdsf"; + +export class SdfdsfControllerBase { + constructor( + protected readonly service: SdfdsfService, + protected readonly rolesBuilder: nestAccessControl.RolesBuilder + ) {} + + @common.UseInterceptors(nestMorgan.MorganInterceptor("combined")) + @common.UseGuards(basicAuthGuard.BasicAuthGuard, nestAccessControl.ACGuard) + @common.Post() + @nestAccessControl.UseRoles({ + resource: "Sdfdsf", + action: "create", + possession: "any", + }) + @swagger.ApiCreatedResponse({ type: Sdfdsf }) + @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + async create( + @common.Body() data: SdfdsfCreateInput, + @nestAccessControl.UserRoles() userRoles: string[] + ): Promise { + const permission = this.rolesBuilder.permission({ + role: userRoles, + action: "create", + possession: "any", + resource: "Sdfdsf", + }); + const invalidAttributes = abacUtil.getInvalidAttributes(permission, data); + if (invalidAttributes.length) { + const properties = invalidAttributes + .map((attribute: string) => JSON.stringify(attribute)) + .join(", "); + const roles = userRoles + .map((role: string) => JSON.stringify(role)) + .join(","); + throw new errors.ForbiddenException( + `providing the properties: ${properties} on ${"Sdfdsf"} creation is forbidden for roles: ${roles}` + ); + } + return await this.service.create({ + data: data, + select: { + createdAt: true, + id: true, + updatedAt: true, + }, + }); + } + + @common.UseInterceptors(nestMorgan.MorganInterceptor("combined")) + @common.UseGuards(basicAuthGuard.BasicAuthGuard, nestAccessControl.ACGuard) + @common.Get() + @nestAccessControl.UseRoles({ + resource: "Sdfdsf", + action: "read", + possession: "any", + }) + @swagger.ApiOkResponse({ type: [Sdfdsf] }) + @swagger.ApiForbiddenResponse() + @swagger.ApiQuery({ + type: () => SdfdsfFindManyArgs, + style: "deepObject", + explode: true, + }) + async findMany( + @common.Req() request: Request, + @nestAccessControl.UserRoles() userRoles: string[] + ): Promise { + const args = plainToClass(SdfdsfFindManyArgs, request.query); + + const permission = this.rolesBuilder.permission({ + role: userRoles, + action: "read", + possession: "any", + resource: "Sdfdsf", + }); + const results = await this.service.findMany({ + ...args, + select: { + createdAt: true, + id: true, + updatedAt: true, + }, + }); + return results.map((result) => permission.filter(result)); + } + + @common.UseInterceptors(nestMorgan.MorganInterceptor("combined")) + @common.UseGuards(basicAuthGuard.BasicAuthGuard, nestAccessControl.ACGuard) + @common.Get("/:id") + @nestAccessControl.UseRoles({ + resource: "Sdfdsf", + action: "read", + possession: "own", + }) + @swagger.ApiOkResponse({ type: Sdfdsf }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) + @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + async findOne( + @common.Param() params: SdfdsfWhereUniqueInput, + @nestAccessControl.UserRoles() userRoles: string[] + ): Promise { + const permission = this.rolesBuilder.permission({ + role: userRoles, + action: "read", + possession: "own", + resource: "Sdfdsf", + }); + const result = await this.service.findOne({ + where: params, + select: { + createdAt: true, + id: true, + updatedAt: true, + }, + }); + if (result === null) { + throw new errors.NotFoundException( + `No resource was found for ${JSON.stringify(params)}` + ); + } + return permission.filter(result); + } + + @common.UseInterceptors(nestMorgan.MorganInterceptor("combined")) + @common.UseGuards(basicAuthGuard.BasicAuthGuard, nestAccessControl.ACGuard) + @common.Patch("/:id") + @nestAccessControl.UseRoles({ + resource: "Sdfdsf", + action: "update", + possession: "any", + }) + @swagger.ApiOkResponse({ type: Sdfdsf }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) + @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + async update( + @common.Param() params: SdfdsfWhereUniqueInput, + @common.Body() + data: SdfdsfUpdateInput, + @nestAccessControl.UserRoles() userRoles: string[] + ): Promise { + const permission = this.rolesBuilder.permission({ + role: userRoles, + action: "update", + possession: "any", + resource: "Sdfdsf", + }); + const invalidAttributes = abacUtil.getInvalidAttributes(permission, data); + if (invalidAttributes.length) { + const properties = invalidAttributes + .map((attribute: string) => JSON.stringify(attribute)) + .join(", "); + const roles = userRoles + .map((role: string) => JSON.stringify(role)) + .join(","); + throw new errors.ForbiddenException( + `providing the properties: ${properties} on ${"Sdfdsf"} update is forbidden for roles: ${roles}` + ); + } + try { + return await this.service.update({ + where: params, + data: data, + select: { + createdAt: true, + id: true, + updatedAt: true, + }, + }); + } catch (error) { + if (isRecordNotFoundError(error)) { + throw new errors.NotFoundException( + `No resource was found for ${JSON.stringify(params)}` + ); + } + throw error; + } + } + + @common.UseInterceptors(nestMorgan.MorganInterceptor("combined")) + @common.UseGuards(basicAuthGuard.BasicAuthGuard, nestAccessControl.ACGuard) + @common.Delete("/:id") + @nestAccessControl.UseRoles({ + resource: "Sdfdsf", + action: "delete", + possession: "any", + }) + @swagger.ApiOkResponse({ type: Sdfdsf }) + @swagger.ApiNotFoundResponse({ type: errors.NotFoundException }) + @swagger.ApiForbiddenResponse({ type: errors.ForbiddenException }) + async delete( + @common.Param() params: SdfdsfWhereUniqueInput + ): Promise { + try { + return await this.service.delete({ + where: params, + select: { + createdAt: true, + 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/server/src/sdfdsf/base/sdfdsf.module.base.ts b/server/src/sdfdsf/base/sdfdsf.module.base.ts new file mode 100644 index 0000000..b943248 --- /dev/null +++ b/server/src/sdfdsf/base/sdfdsf.module.base.ts @@ -0,0 +1,17 @@ +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 SdfdsfModuleBase {} diff --git a/server/src/sdfdsf/base/sdfdsf.resolver.base.ts b/server/src/sdfdsf/base/sdfdsf.resolver.base.ts new file mode 100644 index 0000000..7902254 --- /dev/null +++ b/server/src/sdfdsf/base/sdfdsf.resolver.base.ts @@ -0,0 +1,108 @@ +import * as common from "@nestjs/common"; +import * as graphql from "@nestjs/graphql"; +import * as apollo from "apollo-server-express"; +import * as nestAccessControl from "nest-access-control"; +import * as gqlBasicAuthGuard from "../../auth/gqlBasicAuth.guard"; +import * as gqlACGuard from "../../auth/gqlAC.guard"; +import * as gqlUserRoles from "../../auth/gqlUserRoles.decorator"; +import * as abacUtil from "../../auth/abac.util"; +import { isRecordNotFoundError } from "../../prisma.util"; +import { MetaQueryPayload } from "../../util/MetaQueryPayload"; +import { DeleteSdfdsfArgs } from "./DeleteSdfdsfArgs"; +import { SdfdsfFindManyArgs } from "./SdfdsfFindManyArgs"; +import { SdfdsfFindUniqueArgs } from "./SdfdsfFindUniqueArgs"; +import { Sdfdsf } from "./Sdfdsf"; +import { SdfdsfService } from "../sdfdsf.service"; + +@graphql.Resolver(() => Sdfdsf) +@common.UseGuards(gqlBasicAuthGuard.GqlBasicAuthGuard, gqlACGuard.GqlACGuard) +export class SdfdsfResolverBase { + constructor( + protected readonly service: SdfdsfService, + protected readonly rolesBuilder: nestAccessControl.RolesBuilder + ) {} + + @graphql.Query(() => MetaQueryPayload) + @nestAccessControl.UseRoles({ + resource: "Sdfdsf", + action: "read", + possession: "any", + }) + async _sdfdsfsMeta( + @graphql.Args() args: SdfdsfFindManyArgs + ): Promise { + const results = await this.service.count({ + ...args, + skip: undefined, + take: undefined, + }); + return { + count: results, + }; + } + + @graphql.Query(() => [Sdfdsf]) + @nestAccessControl.UseRoles({ + resource: "Sdfdsf", + action: "read", + possession: "any", + }) + async sdfdsfs( + @graphql.Args() args: SdfdsfFindManyArgs, + @gqlUserRoles.UserRoles() userRoles: string[] + ): Promise { + const permission = this.rolesBuilder.permission({ + role: userRoles, + action: "read", + possession: "any", + resource: "Sdfdsf", + }); + const results = await this.service.findMany(args); + return results.map((result) => permission.filter(result)); + } + + @graphql.Query(() => Sdfdsf, { nullable: true }) + @nestAccessControl.UseRoles({ + resource: "Sdfdsf", + action: "read", + possession: "own", + }) + async sdfdsf( + @graphql.Args() args: SdfdsfFindUniqueArgs, + @gqlUserRoles.UserRoles() userRoles: string[] + ): Promise { + const permission = this.rolesBuilder.permission({ + role: userRoles, + action: "read", + possession: "own", + resource: "Sdfdsf", + }); + const result = await this.service.findOne(args); + if (result === null) { + return null; + } + return permission.filter(result); + } + + @graphql.Mutation(() => Sdfdsf) + @nestAccessControl.UseRoles({ + resource: "Sdfdsf", + action: "delete", + possession: "any", + }) + async deleteSdfdsf( + @graphql.Args() args: DeleteSdfdsfArgs + ): Promise { + try { + // @ts-ignore + return await this.service.delete(args); + } catch (error) { + if (isRecordNotFoundError(error)) { + throw new apollo.ApolloError( + `No resource was found for ${JSON.stringify(args.where)}` + ); + } + throw error; + } + } +} diff --git a/server/src/sdfdsf/base/sdfdsf.service.base.ts b/server/src/sdfdsf/base/sdfdsf.service.base.ts new file mode 100644 index 0000000..1986809 --- /dev/null +++ b/server/src/sdfdsf/base/sdfdsf.service.base.ts @@ -0,0 +1,38 @@ +import { PrismaService } from "nestjs-prisma"; +import { Prisma, Sdfdsf } from "@prisma/client"; + +export class SdfdsfServiceBase { + constructor(protected readonly prisma: PrismaService) {} + + async count( + args: Prisma.SelectSubset + ): Promise { + return this.prisma.sdfdsf.count(args); + } + + async findMany( + args: Prisma.SelectSubset + ): Promise { + return this.prisma.sdfdsf.findMany(args); + } + async findOne( + args: Prisma.SelectSubset + ): Promise { + return this.prisma.sdfdsf.findUnique(args); + } + async create( + args: Prisma.SelectSubset + ): Promise { + return this.prisma.sdfdsf.create(args); + } + async update( + args: Prisma.SelectSubset + ): Promise { + return this.prisma.sdfdsf.update(args); + } + async delete( + args: Prisma.SelectSubset + ): Promise { + return this.prisma.sdfdsf.delete(args); + } +} diff --git a/server/src/sdfdsf/sdfdsf.controller.ts b/server/src/sdfdsf/sdfdsf.controller.ts new file mode 100644 index 0000000..02f32e0 --- /dev/null +++ b/server/src/sdfdsf/sdfdsf.controller.ts @@ -0,0 +1,18 @@ +import * as common from "@nestjs/common"; +import * as swagger from "@nestjs/swagger"; +import * as nestAccessControl from "nest-access-control"; +import { SdfdsfService } from "./sdfdsf.service"; +import { SdfdsfControllerBase } from "./base/sdfdsf.controller.base"; + +@swagger.ApiBasicAuth() +@swagger.ApiTags("sdfdsfs") +@common.Controller("sdfdsfs") +export class SdfdsfController extends SdfdsfControllerBase { + constructor( + protected readonly service: SdfdsfService, + @nestAccessControl.InjectRolesBuilder() + protected readonly rolesBuilder: nestAccessControl.RolesBuilder + ) { + super(service, rolesBuilder); + } +} diff --git a/server/src/sdfdsf/sdfdsf.module.ts b/server/src/sdfdsf/sdfdsf.module.ts new file mode 100644 index 0000000..1e93aab --- /dev/null +++ b/server/src/sdfdsf/sdfdsf.module.ts @@ -0,0 +1,13 @@ +import { Module } from "@nestjs/common"; +import { SdfdsfModuleBase } from "./base/sdfdsf.module.base"; +import { SdfdsfService } from "./sdfdsf.service"; +import { SdfdsfController } from "./sdfdsf.controller"; +import { SdfdsfResolver } from "./sdfdsf.resolver"; + +@Module({ + imports: [SdfdsfModuleBase], + controllers: [SdfdsfController], + providers: [SdfdsfService, SdfdsfResolver], + exports: [SdfdsfService], +}) +export class SdfdsfModule {} diff --git a/server/src/sdfdsf/sdfdsf.resolver.ts b/server/src/sdfdsf/sdfdsf.resolver.ts new file mode 100644 index 0000000..96f711f --- /dev/null +++ b/server/src/sdfdsf/sdfdsf.resolver.ts @@ -0,0 +1,20 @@ +import * as common from "@nestjs/common"; +import * as graphql from "@nestjs/graphql"; +import * as nestAccessControl from "nest-access-control"; +import * as gqlBasicAuthGuard from "../auth/gqlBasicAuth.guard"; +import * as gqlACGuard from "../auth/gqlAC.guard"; +import { SdfdsfResolverBase } from "./base/sdfdsf.resolver.base"; +import { Sdfdsf } from "./base/Sdfdsf"; +import { SdfdsfService } from "./sdfdsf.service"; + +@graphql.Resolver(() => Sdfdsf) +@common.UseGuards(gqlBasicAuthGuard.GqlBasicAuthGuard, gqlACGuard.GqlACGuard) +export class SdfdsfResolver extends SdfdsfResolverBase { + constructor( + protected readonly service: SdfdsfService, + @nestAccessControl.InjectRolesBuilder() + protected readonly rolesBuilder: nestAccessControl.RolesBuilder + ) { + super(service, rolesBuilder); + } +} diff --git a/server/src/sdfdsf/sdfdsf.service.ts b/server/src/sdfdsf/sdfdsf.service.ts new file mode 100644 index 0000000..9112af3 --- /dev/null +++ b/server/src/sdfdsf/sdfdsf.service.ts @@ -0,0 +1,10 @@ +import { Injectable } from "@nestjs/common"; +import { PrismaService } from "nestjs-prisma"; +import { SdfdsfServiceBase } from "./base/sdfdsf.service.base"; + +@Injectable() +export class SdfdsfService extends SdfdsfServiceBase { + constructor(protected readonly prisma: PrismaService) { + super(prisma); + } +} diff --git a/server/src/swagger.ts b/server/src/swagger.ts index ded984b..15152b3 100644 --- a/server/src/swagger.ts +++ b/server/src/swagger.ts @@ -3,11 +3,11 @@ import { DocumentBuilder } from "@nestjs/swagger"; export const swaggerPath = "api"; export const swaggerDocumentOptions = new DocumentBuilder() - .setTitle("My app-45") + .setTitle("My app-75") .setDescription( '\n\n## Congratulations! Your application is ready.\n\nPlease note that all endpoints are secured with HTTP basic authentication.\nBy default, your app comes with one user with the username "admin" and password "admin".\nLearn more in [our docs](https://docs.amplication.com)' ) - .setVersion("qpq3cyhw") + .setVersion("e39oruad") .addBasicAuth() .build(); @@ -17,5 +17,5 @@ export const swaggerSetupOptions = { }, customCssUrl: "../swagger/swagger.css", customfavIcon: "../swagger/favicon.png", - customSiteTitle: "My app-45", + customSiteTitle: "My app-75", }; diff --git a/server/src/user/base/User.ts b/server/src/user/base/User.ts index 65f783c..e3a5af3 100644 --- a/server/src/user/base/User.ts +++ b/server/src/user/base/User.ts @@ -12,17 +12,6 @@ class User { @Field(() => Date) createdAt!: Date; - @ApiProperty({ - required: false, - type: String, - }) - @IsString() - @IsOptional() - @Field(() => String, { - nullable: true, - }) - email!: string | null; - @ApiProperty({ required: false, type: String, @@ -53,14 +42,6 @@ class User { }) lastName!: string | null; - @ApiProperty({ - required: true, - type: String, - }) - @IsString() - @Field(() => String) - mobile!: string; - @ApiProperty({ required: true, type: [String], diff --git a/server/src/user/base/UserCreateInput.ts b/server/src/user/base/UserCreateInput.ts index ae5d745..6e217e9 100644 --- a/server/src/user/base/UserCreateInput.ts +++ b/server/src/user/base/UserCreateInput.ts @@ -3,17 +3,6 @@ import { ApiProperty } from "@nestjs/swagger"; import { IsString, IsOptional } from "class-validator"; @InputType() class UserCreateInput { - @ApiProperty({ - required: false, - type: String, - }) - @IsString() - @IsOptional() - @Field(() => String, { - nullable: true, - }) - email?: string | null; - @ApiProperty({ required: false, type: String, @@ -36,14 +25,6 @@ class UserCreateInput { }) lastName?: string | null; - @ApiProperty({ - required: true, - type: String, - }) - @IsString() - @Field(() => String) - mobile!: string; - @ApiProperty({ required: true, type: String, diff --git a/server/src/user/base/UserOrderByInput.ts b/server/src/user/base/UserOrderByInput.ts index 6261184..5bc72a2 100644 --- a/server/src/user/base/UserOrderByInput.ts +++ b/server/src/user/base/UserOrderByInput.ts @@ -16,15 +16,6 @@ class UserOrderByInput { }) createdAt?: SortOrder; - @ApiProperty({ - required: false, - enum: ["Asc", "Desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - email?: SortOrder; - @ApiProperty({ required: false, enum: ["Asc", "Desc"], @@ -52,15 +43,6 @@ class UserOrderByInput { }) lastName?: SortOrder; - @ApiProperty({ - required: false, - enum: ["Asc", "Desc"], - }) - @Field(() => SortOrder, { - nullable: true, - }) - mobile?: SortOrder; - @ApiProperty({ required: false, enum: ["Asc", "Desc"], diff --git a/server/src/user/base/UserUpdateInput.ts b/server/src/user/base/UserUpdateInput.ts index 3d83a6a..39cfa90 100644 --- a/server/src/user/base/UserUpdateInput.ts +++ b/server/src/user/base/UserUpdateInput.ts @@ -3,17 +3,6 @@ import { ApiProperty } from "@nestjs/swagger"; import { IsString, IsOptional } from "class-validator"; @InputType() class UserUpdateInput { - @ApiProperty({ - required: false, - type: String, - }) - @IsString() - @IsOptional() - @Field(() => String, { - nullable: true, - }) - email?: string | null; - @ApiProperty({ required: false, type: String, @@ -36,17 +25,6 @@ class UserUpdateInput { }) lastName?: string | null; - @ApiProperty({ - required: false, - type: String, - }) - @IsString() - @IsOptional() - @Field(() => String, { - nullable: true, - }) - mobile?: string; - @ApiProperty({ required: false, type: String, diff --git a/server/src/user/base/UserWhereInput.ts b/server/src/user/base/UserWhereInput.ts index 98820e7..8477a7f 100644 --- a/server/src/user/base/UserWhereInput.ts +++ b/server/src/user/base/UserWhereInput.ts @@ -6,17 +6,6 @@ import { IsOptional } from "class-validator"; import { StringFilter } from "../../util/StringFilter"; @InputType() class UserWhereInput { - @ApiProperty({ - required: false, - type: StringNullableFilter, - }) - @Type(() => StringNullableFilter) - @IsOptional() - @Field(() => StringNullableFilter, { - nullable: true, - }) - email?: StringNullableFilter; - @ApiProperty({ required: false, type: StringNullableFilter, @@ -50,17 +39,6 @@ class UserWhereInput { }) lastName?: StringNullableFilter; - @ApiProperty({ - required: false, - type: StringFilter, - }) - @Type(() => StringFilter) - @IsOptional() - @Field(() => StringFilter, { - nullable: true, - }) - mobile?: StringFilter; - @ApiProperty({ required: false, type: StringFilter, diff --git a/server/src/user/base/user.controller.base.spec.ts b/server/src/user/base/user.controller.base.spec.ts index a1af5bf..ee70bfb 100644 --- a/server/src/user/base/user.controller.base.spec.ts +++ b/server/src/user/base/user.controller.base.spec.ts @@ -12,11 +12,9 @@ const nonExistingId = "nonExistingId"; const existingId = "existingId"; const CREATE_INPUT = { createdAt: new Date(), - email: "exampleEmail", firstName: "exampleFirstName", id: "exampleId", lastName: "exampleLastName", - mobile: "exampleMobile", password: "examplePassword", roles: ["exampleRoles"], updatedAt: new Date(), @@ -24,11 +22,9 @@ const CREATE_INPUT = { }; const CREATE_RESULT = { createdAt: new Date(), - email: "exampleEmail", firstName: "exampleFirstName", id: "exampleId", lastName: "exampleLastName", - mobile: "exampleMobile", password: "examplePassword", roles: ["exampleRoles"], updatedAt: new Date(), @@ -37,11 +33,9 @@ const CREATE_RESULT = { const FIND_MANY_RESULT = [ { createdAt: new Date(), - email: "exampleEmail", firstName: "exampleFirstName", id: "exampleId", lastName: "exampleLastName", - mobile: "exampleMobile", password: "examplePassword", roles: ["exampleRoles"], updatedAt: new Date(), @@ -50,11 +44,9 @@ const FIND_MANY_RESULT = [ ]; const FIND_ONE_RESULT = { createdAt: new Date(), - email: "exampleEmail", firstName: "exampleFirstName", id: "exampleId", lastName: "exampleLastName", - mobile: "exampleMobile", password: "examplePassword", roles: ["exampleRoles"], updatedAt: new Date(), diff --git a/server/src/user/base/user.controller.base.ts b/server/src/user/base/user.controller.base.ts index 89e8726..9cc97ff 100644 --- a/server/src/user/base/user.controller.base.ts +++ b/server/src/user/base/user.controller.base.ts @@ -58,11 +58,9 @@ export class UserControllerBase { data: data, select: { createdAt: true, - email: true, firstName: true, id: true, lastName: true, - mobile: true, roles: true, updatedAt: true, username: true, @@ -101,11 +99,9 @@ export class UserControllerBase { ...args, select: { createdAt: true, - email: true, firstName: true, id: true, lastName: true, - mobile: true, roles: true, updatedAt: true, username: true, @@ -139,11 +135,9 @@ export class UserControllerBase { where: params, select: { createdAt: true, - email: true, firstName: true, id: true, lastName: true, - mobile: true, roles: true, updatedAt: true, username: true, @@ -198,11 +192,9 @@ export class UserControllerBase { data: data, select: { createdAt: true, - email: true, firstName: true, id: true, lastName: true, - mobile: true, roles: true, updatedAt: true, username: true, @@ -237,11 +229,9 @@ export class UserControllerBase { where: params, select: { createdAt: true, - email: true, firstName: true, id: true, lastName: true, - mobile: true, roles: true, updatedAt: true, username: true,