Browse Source

feat(server): Make administrators query return paginated list

Michael Bromley 7 years ago
parent
commit
e5f2e0c2e9

File diff suppressed because it is too large
+ 0 - 0
schema.json


+ 32 - 2
server/src/api/administrator/administrator.api.graphql

@@ -1,9 +1,39 @@
 type Query {
-  administrators: [Administrator!]!
-  administrator(id: ID!): Administrator!
+  administrators(options: AdministratorListOptions): AdministratorList!
+  administrator(id: ID!): Administrator
 }
 
 type Mutation {
   "Create a new Administrator"
   createAdministrator(input: CreateAdministratorInput!): Administrator!
 }
+
+type AdministratorList implements PaginatedList {
+    items: [Administrator!]!
+    totalItems: Int!
+}
+
+input AdministratorListOptions {
+    take: Int
+    skip: Int
+    sort: AdministratorSortParameter
+    filter: AdministratorFilterParameter
+}
+
+input AdministratorSortParameter {
+    id: SortOrder
+    createdAt: SortOrder
+    updatedAt: SortOrder
+    firstName: SortOrder
+    lastName: SortOrder
+    emailAddress: SortOrder
+}
+
+input AdministratorFilterParameter {
+    firstName: StringOperators
+    lastName: StringOperators
+    emailAddress: StringOperators
+    createdAt: DateOperators
+    updatedAt: DateOperators
+}
+

+ 5 - 4
server/src/api/administrator/administrator.resolver.ts

@@ -1,4 +1,5 @@
-import { Mutation, Query, Resolver } from '@nestjs/graphql';
+import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
+import { PaginatedList } from 'shared/shared-types';
 
 import { Administrator } from '../../entity/administrator/administrator.entity';
 import { Permission } from '../../entity/role/permission';
@@ -13,14 +14,14 @@ export class AdministratorResolver {
     @Query()
     @RolesGuard([Permission.ReadAdministrator])
     @ApplyIdCodec()
-    administrators(): Promise<Administrator[]> {
-        return this.administratorService.findAll();
+    administrators(@Args() args: any): Promise<PaginatedList<Administrator>> {
+        return this.administratorService.findAll(args.options);
     }
 
     @Query()
     @RolesGuard([Permission.ReadAdministrator])
     @ApplyIdCodec()
-    administrator(obj, args): Promise<Administrator | undefined> {
+    administrator(@Args() args: any): Promise<Administrator | undefined> {
         return this.administratorService.findOne(args.id);
     }
 

+ 1 - 1
server/src/entity/administrator/administrator.entity.ts

@@ -17,7 +17,7 @@ export class Administrator extends VendureEntity {
     @Column({ unique: true })
     emailAddress: string;
 
-    @OneToOne(type => User, { eager: true })
+    @OneToOne(type => User)
     @JoinColumn()
     user: User;
 }

+ 4 - 4
server/src/entity/administrator/administrator.graphql

@@ -2,10 +2,10 @@ type Administrator implements Node {
     id: ID!
     createdAt: DateTime!
     updatedAt: DateTime!
-    firstName: String
-    lastName: String
-    emailAddress: String
-    user: User
+    firstName: String!
+    lastName: String!
+    emailAddress: String!
+    user: User!
 }
 
 input CreateAdministratorInput {

+ 3 - 3
server/src/entity/user/user.graphql

@@ -2,8 +2,8 @@ type User implements Node {
     id: ID!
     createdAt: DateTime!
     updatedAt: DateTime!
-    identifier: String
-    passwordHash: String
-    roles: [String]
+    identifier: String!
+    passwordHash: String!
+    roles: [Role!]!
     lastLogin: String
 }

+ 12 - 2
server/src/service/administrator.service.ts

@@ -1,11 +1,14 @@
 import { Injectable } from '@nestjs/common';
 import { InjectConnection } from '@nestjs/typeorm';
+import { PaginatedList } from 'shared/shared-types';
 import { Connection } from 'typeorm';
 
+import { ListQueryOptions } from '../common/types/common-types';
 import { CreateAdministratorDto } from '../entity/administrator/administrator.dto';
 import { Administrator } from '../entity/administrator/administrator.entity';
 import { User } from '../entity/user/user.entity';
 
+import { buildListQuery } from './helpers/build-list-query';
 import { PasswordService } from './password.service';
 import { RoleService } from './role.service';
 
@@ -17,8 +20,15 @@ export class AdministratorService {
         private roleService: RoleService,
     ) {}
 
-    findAll(): Promise<Administrator[]> {
-        return this.connection.manager.find(Administrator);
+    findAll(options: ListQueryOptions<Administrator>): Promise<PaginatedList<Administrator>> {
+        return buildListQuery(this.connection, Administrator, options, ['user', 'user.roles'])
+            .getManyAndCount()
+            .then(([items, totalItems]) => {
+                return {
+                    items,
+                    totalItems,
+                };
+            });
     }
 
     findOne(administratorId: string): Promise<Administrator | undefined> {

Some files were not shown because too many files changed in this diff