worker.resolver.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import {
  2. Arg,
  3. Args,
  4. Mutation,
  5. Query,
  6. Root,
  7. Resolver,
  8. FieldResolver,
  9. ObjectType,
  10. Field,
  11. Int,
  12. ArgsType,
  13. Info,
  14. } from 'type-graphql';
  15. import graphqlFields from 'graphql-fields';
  16. import { Inject } from 'typedi';
  17. import { Min } from 'class-validator';
  18. import { Fields, StandardDeleteResponse, UserId, PageInfo, RawFields } from 'warthog';
  19. import {
  20. WorkerCreateInput,
  21. WorkerCreateManyArgs,
  22. WorkerUpdateArgs,
  23. WorkerWhereArgs,
  24. WorkerWhereInput,
  25. WorkerWhereUniqueInput,
  26. WorkerOrderByEnum,
  27. } from '../../../generated';
  28. import { Worker } from './worker.model';
  29. import { WorkerService } from './worker.service';
  30. import { DataObject } from '../data-object/data-object.model';
  31. import { getConnection } from 'typeorm';
  32. @ObjectType()
  33. export class WorkerEdge {
  34. @Field(() => Worker, { nullable: false })
  35. node!: Worker;
  36. @Field(() => String, { nullable: false })
  37. cursor!: string;
  38. }
  39. @ObjectType()
  40. export class WorkerConnection {
  41. @Field(() => Int, { nullable: false })
  42. totalCount!: number;
  43. @Field(() => [WorkerEdge], { nullable: false })
  44. edges!: WorkerEdge[];
  45. @Field(() => PageInfo, { nullable: false })
  46. pageInfo!: PageInfo;
  47. }
  48. @ArgsType()
  49. export class ConnectionPageInputOptions {
  50. @Field(() => Int, { nullable: true })
  51. @Min(0)
  52. first?: number;
  53. @Field(() => String, { nullable: true })
  54. after?: string; // V3: TODO: should we make a RelayCursor scalar?
  55. @Field(() => Int, { nullable: true })
  56. @Min(0)
  57. last?: number;
  58. @Field(() => String, { nullable: true })
  59. before?: string;
  60. }
  61. @ArgsType()
  62. export class WorkerConnectionWhereArgs extends ConnectionPageInputOptions {
  63. @Field(() => WorkerWhereInput, { nullable: true })
  64. where?: WorkerWhereInput;
  65. @Field(() => WorkerOrderByEnum, { nullable: true })
  66. orderBy?: WorkerOrderByEnum;
  67. }
  68. @Resolver(Worker)
  69. export class WorkerResolver {
  70. constructor(@Inject('WorkerService') public readonly service: WorkerService) {}
  71. @Query(() => [Worker])
  72. async workers(
  73. @Args() { where, orderBy, limit, offset }: WorkerWhereArgs,
  74. @Fields() fields: string[]
  75. ): Promise<Worker[]> {
  76. return this.service.find<WorkerWhereInput>(where, orderBy, limit, offset, fields);
  77. }
  78. @Query(() => Worker, { nullable: true })
  79. async workerByUniqueInput(
  80. @Arg('where') where: WorkerWhereUniqueInput,
  81. @Fields() fields: string[]
  82. ): Promise<Worker | null> {
  83. const result = await this.service.find(where, undefined, 1, 0, fields);
  84. return result && result.length >= 1 ? result[0] : null;
  85. }
  86. @Query(() => WorkerConnection)
  87. async workersConnection(
  88. @Args() { where, orderBy, ...pageOptions }: WorkerConnectionWhereArgs,
  89. @Info() info: any
  90. ): Promise<WorkerConnection> {
  91. const rawFields = graphqlFields(info, {}, { excludedFields: ['__typename'] });
  92. let result: any = {
  93. totalCount: 0,
  94. edges: [],
  95. pageInfo: {
  96. hasNextPage: false,
  97. hasPreviousPage: false,
  98. },
  99. };
  100. // If the related database table does not have any records then an error is thrown to the client
  101. // by warthog
  102. try {
  103. result = await this.service.findConnection<WorkerWhereInput>(where, orderBy, pageOptions, rawFields);
  104. } catch (err) {
  105. console.log(err);
  106. // TODO: should continue to return this on `Error: Items is empty` or throw the error
  107. if (!(err.message as string).includes('Items is empty')) throw err;
  108. }
  109. return result as Promise<WorkerConnection>;
  110. }
  111. @FieldResolver(() => DataObject)
  112. async dataObjects(@Root() r: Worker): Promise<DataObject[] | null> {
  113. const result = await getConnection()
  114. .getRepository(Worker)
  115. .findOne(r.id, { relations: ['dataObjects'] });
  116. if (result && result.dataObjects !== undefined) {
  117. return result.dataObjects;
  118. }
  119. return null;
  120. }
  121. }