Sfoglia il codice sorgente

Implement create and read on Administrators

Michael Bromley 7 anni fa
parent
commit
45e6ebcc4b

+ 9 - 0
modules/core/api/administrator/administrator.api.graphql

@@ -0,0 +1,9 @@
+type Query {
+  administrators: [Administrator]
+  administrator(id: Int!): Administrator
+}
+
+type Mutation {
+  "Create a new Administrator"
+  createAdministrator(input: CreateAdministratorInput!): Administrator
+}

+ 24 - 0
modules/core/api/administrator/administrator.resolver.ts

@@ -0,0 +1,24 @@
+import { Mutation, Query, Resolver } from '@nestjs/graphql';
+import { Administrator } from '../../entity/administrator/administrator.entity';
+import { AdministratorService } from '../../service/administrator.service';
+
+@Resolver('Administrator')
+export class AdministratorResolver {
+    constructor(private administratorService: AdministratorService) {}
+
+    @Query('administrators')
+    administrators(): Promise<Administrator[]> {
+        return this.administratorService.findAll();
+    }
+
+    @Query('administrator')
+    administrator(obj, args): Promise<Administrator | undefined> {
+        return this.administratorService.findOne(args.id);
+    }
+
+    @Mutation()
+    createAdministrator(_, args): Promise<Administrator> {
+        const { input } = args;
+        return this.administratorService.create(input);
+    }
+}

+ 4 - 0
modules/core/app.module.ts

@@ -2,6 +2,7 @@ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
 import { GraphQLFactory, GraphQLModule } from '@nestjs/graphql';
 import { TypeOrmModule } from '@nestjs/typeorm';
 import { graphiqlExpress, graphqlExpress } from 'apollo-server-express';
+import { AdministratorResolver } from './api/administrator/administrator.resolver';
 import { AuthController } from './api/auth/auth.controller';
 import { CustomerController } from './api/customer/customer.controller';
 import { CustomerResolver } from './api/customer/customer.resolver';
@@ -9,6 +10,7 @@ import { ProductResolver } from './api/product/product.resolver';
 import { AuthService } from './auth/auth.service';
 import { JwtStrategy } from './auth/jwt.strategy';
 import { PasswordService } from './auth/password.service';
+import { AdministratorService } from './service/administrator.service';
 import { CustomerService } from './service/customer.service';
 import { ProductVariantService } from './service/product-variant.service';
 import { ProductService } from './service/product.service';
@@ -30,6 +32,8 @@ import { ProductService } from './service/product.service';
     ],
     controllers: [AuthController, CustomerController],
     providers: [
+        AdministratorResolver,
+        AdministratorService,
         AuthService,
         JwtStrategy,
         PasswordService,

+ 6 - 0
modules/core/entity/administrator/administrator.dto.ts

@@ -0,0 +1,6 @@
+export interface CreateAdministratorDto {
+    firstName: string;
+    lastName: string;
+    emailAddress: string;
+    password: string;
+}

+ 8 - 1
modules/core/entity/administrator/administrator.entity.ts

@@ -7,10 +7,17 @@ import {
     PrimaryGeneratedColumn,
     UpdateDateColumn,
 } from 'typeorm';
+import { DeepPartial } from '../../common/common-types';
 import { User } from '../user/user.entity';
 
 @Entity('administrator')
 export class Administrator {
+    constructor(input?: DeepPartial<Administrator>) {
+        if (input) {
+            Object.assign(this, input);
+        }
+    }
+
     @PrimaryGeneratedColumn() id: number;
 
     @Column() firstName: string;
@@ -20,7 +27,7 @@ export class Administrator {
     @Column({ unique: true })
     emailAddress: string;
 
-    @OneToOne(type => User)
+    @OneToOne(type => User, { eager: true })
     @JoinColumn()
     user: User;
 

+ 7 - 2
modules/core/entity/administrator/administrator.graphql

@@ -4,6 +4,11 @@ type Administrator {
     lastName: String
     emailAddress: String
     user: User
-    createdAt: String
-    updatedAt: String
+}
+
+input CreateAdministratorInput {
+    firstName: String
+    lastName: String
+    emailAddress: String!
+    password: String!
 }

+ 34 - 0
modules/core/service/administrator.service.ts

@@ -0,0 +1,34 @@
+import { Injectable } from '@nestjs/common';
+import { InjectConnection } from '@nestjs/typeorm';
+import { Connection } from 'typeorm';
+import { PasswordService } from '../auth/password.service';
+import { Role } from '../auth/role';
+import { CreateAdministratorDto } from '../entity/administrator/administrator.dto';
+import { Administrator } from '../entity/administrator/administrator.entity';
+import { User } from '../entity/user/user.entity';
+
+@Injectable()
+export class AdministratorService {
+    constructor(@InjectConnection() private connection: Connection, private passwordService: PasswordService) {}
+
+    findAll(): Promise<Administrator[]> {
+        return this.connection.manager.find(Administrator);
+    }
+
+    findOne(administratorId: number): Promise<Administrator | undefined> {
+        return this.connection.manager.findOne(Administrator, administratorId);
+    }
+
+    async create(createAdministratorDto: CreateAdministratorDto): Promise<Administrator> {
+        const administrator = new Administrator(createAdministratorDto);
+
+        const user = new User();
+        user.passwordHash = await this.passwordService.hash(createAdministratorDto.password);
+        user.identifier = createAdministratorDto.emailAddress;
+        user.roles = [Role.Superadmin];
+        const createdUser = await this.connection.getRepository(User).save(user);
+        administrator.user = createdUser;
+
+        return this.connection.getRepository(Administrator).save(administrator);
+    }
+}