video-media-metadata.resolver.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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. VideoMediaMetadataCreateInput,
  21. VideoMediaMetadataCreateManyArgs,
  22. VideoMediaMetadataUpdateArgs,
  23. VideoMediaMetadataWhereArgs,
  24. VideoMediaMetadataWhereInput,
  25. VideoMediaMetadataWhereUniqueInput,
  26. VideoMediaMetadataOrderByEnum,
  27. } from '../../../generated';
  28. import { VideoMediaMetadata } from './video-media-metadata.model';
  29. import { VideoMediaMetadataService } from './video-media-metadata.service';
  30. import { VideoMediaEncoding } from '../video-media-encoding/video-media-encoding.model';
  31. import { Video } from '../video/video.model';
  32. import { getConnection } from 'typeorm';
  33. @ObjectType()
  34. export class VideoMediaMetadataEdge {
  35. @Field(() => VideoMediaMetadata, { nullable: false })
  36. node!: VideoMediaMetadata;
  37. @Field(() => String, { nullable: false })
  38. cursor!: string;
  39. }
  40. @ObjectType()
  41. export class VideoMediaMetadataConnection {
  42. @Field(() => Int, { nullable: false })
  43. totalCount!: number;
  44. @Field(() => [VideoMediaMetadataEdge], { nullable: false })
  45. edges!: VideoMediaMetadataEdge[];
  46. @Field(() => PageInfo, { nullable: false })
  47. pageInfo!: PageInfo;
  48. }
  49. @ArgsType()
  50. export class ConnectionPageInputOptions {
  51. @Field(() => Int, { nullable: true })
  52. @Min(0)
  53. first?: number;
  54. @Field(() => String, { nullable: true })
  55. after?: string; // V3: TODO: should we make a RelayCursor scalar?
  56. @Field(() => Int, { nullable: true })
  57. @Min(0)
  58. last?: number;
  59. @Field(() => String, { nullable: true })
  60. before?: string;
  61. }
  62. @ArgsType()
  63. export class VideoMediaMetadataConnectionWhereArgs extends ConnectionPageInputOptions {
  64. @Field(() => VideoMediaMetadataWhereInput, { nullable: true })
  65. where?: VideoMediaMetadataWhereInput;
  66. @Field(() => VideoMediaMetadataOrderByEnum, { nullable: true })
  67. orderBy?: [VideoMediaMetadataOrderByEnum];
  68. }
  69. @Resolver(VideoMediaMetadata)
  70. export class VideoMediaMetadataResolver {
  71. constructor(@Inject('VideoMediaMetadataService') public readonly service: VideoMediaMetadataService) {}
  72. @Query(() => [VideoMediaMetadata])
  73. async videoMediaMetadata(
  74. @Args() { where, orderBy, limit, offset }: VideoMediaMetadataWhereArgs,
  75. @Fields() fields: string[]
  76. ): Promise<VideoMediaMetadata[]> {
  77. return this.service.find<VideoMediaMetadataWhereInput>(where, orderBy, limit, offset, fields);
  78. }
  79. @Query(() => VideoMediaMetadata, { nullable: true })
  80. async videoMediaMetadataByUniqueInput(
  81. @Arg('where') where: VideoMediaMetadataWhereUniqueInput,
  82. @Fields() fields: string[]
  83. ): Promise<VideoMediaMetadata | null> {
  84. const result = await this.service.find(where, undefined, 1, 0, fields);
  85. return result && result.length >= 1 ? result[0] : null;
  86. }
  87. @Query(() => VideoMediaMetadataConnection)
  88. async videoMediaMetadataConnection(
  89. @Args() { where, orderBy, ...pageOptions }: VideoMediaMetadataConnectionWhereArgs,
  90. @Info() info: any
  91. ): Promise<VideoMediaMetadataConnection> {
  92. const rawFields = graphqlFields(info, {}, { excludedFields: ['__typename'] });
  93. let result: any = {
  94. totalCount: 0,
  95. edges: [],
  96. pageInfo: {
  97. hasNextPage: false,
  98. hasPreviousPage: false,
  99. },
  100. };
  101. // If the related database table does not have any records then an error is thrown to the client
  102. // by warthog
  103. try {
  104. result = await this.service.findConnection<VideoMediaMetadataWhereInput>(where, orderBy, pageOptions, rawFields);
  105. } catch (err) {
  106. console.log(err);
  107. // TODO: should continue to return this on `Error: Items is empty` or throw the error
  108. if (!(err.message as string).includes('Items is empty')) throw err;
  109. }
  110. return result as Promise<VideoMediaMetadataConnection>;
  111. }
  112. @FieldResolver(() => VideoMediaEncoding)
  113. async encoding(@Root() r: VideoMediaMetadata): Promise<VideoMediaEncoding | null> {
  114. const result = await getConnection()
  115. .getRepository(VideoMediaMetadata)
  116. .findOne(r.id, { relations: ['encoding'] });
  117. if (result && result.encoding !== undefined) {
  118. return result.encoding;
  119. }
  120. return null;
  121. }
  122. @FieldResolver(() => Video)
  123. async video(@Root() r: VideoMediaMetadata): Promise<Video | null> {
  124. const result = await getConnection()
  125. .getRepository(VideoMediaMetadata)
  126. .findOne(r.id, { relations: ['video'] });
  127. if (result && result.video !== undefined) {
  128. return result.video;
  129. }
  130. return null;
  131. }
  132. }