@financial-times/cp-content-pipeline-schema 2.7.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/lib/datasources/capi.d.ts +1 -1
  3. package/lib/datasources/capi.js +14 -39
  4. package/lib/datasources/capi.js.map +1 -1
  5. package/lib/datasources/instrumented.d.ts +4 -1
  6. package/lib/datasources/instrumented.js +16 -16
  7. package/lib/datasources/instrumented.js.map +1 -1
  8. package/lib/datasources/origami-image.d.ts +1 -1
  9. package/lib/datasources/origami-image.js +7 -21
  10. package/lib/datasources/origami-image.js.map +1 -1
  11. package/lib/datasources/twitter.d.ts +1 -1
  12. package/lib/datasources/twitter.js +7 -21
  13. package/lib/datasources/twitter.js.map +1 -1
  14. package/lib/generated/index.d.ts +24 -0
  15. package/lib/model/CapiResponse.d.ts +2 -0
  16. package/lib/model/CapiResponse.js +40 -4
  17. package/lib/model/CapiResponse.js.map +1 -1
  18. package/lib/model/Concept.d.ts +0 -2
  19. package/lib/model/Concept.js +1 -57
  20. package/lib/model/Concept.js.map +1 -1
  21. package/lib/model/Concept.test.js +0 -40
  22. package/lib/model/Concept.test.js.map +1 -1
  23. package/lib/model/Image.js +8 -3
  24. package/lib/model/Image.js.map +1 -1
  25. package/lib/model/Person.d.ts +21 -0
  26. package/lib/model/Person.js +106 -0
  27. package/lib/model/Person.js.map +1 -0
  28. package/lib/model/Person.test.d.ts +1 -0
  29. package/lib/model/Person.test.js +96 -0
  30. package/lib/model/Person.test.js.map +1 -0
  31. package/lib/model/Topper.d.ts +2 -1
  32. package/lib/model/Topper.js +18 -16
  33. package/lib/model/Topper.js.map +1 -1
  34. package/lib/model/Topper.test.js +29 -0
  35. package/lib/model/Topper.test.js.map +1 -1
  36. package/lib/model/schemas/capi/base-schema.d.ts +3 -0
  37. package/lib/model/schemas/capi/base-schema.js +1 -0
  38. package/lib/model/schemas/capi/base-schema.js.map +1 -1
  39. package/lib/resolvers/content-tree/bodyXMLToTree.js +1 -1
  40. package/lib/resolvers/content-tree/bodyXMLToTree.js.map +1 -1
  41. package/lib/resolvers/content-tree/bodyXMLToTree.test.js +7 -7
  42. package/lib/resolvers/content-tree/bodyXMLToTree.test.js.map +1 -1
  43. package/lib/resolvers/content-tree/references/Flourish.js +7 -2
  44. package/lib/resolvers/content-tree/references/Flourish.js.map +1 -1
  45. package/lib/resolvers/content-tree/references/RawImage.js +7 -2
  46. package/lib/resolvers/content-tree/references/RawImage.js.map +1 -1
  47. package/lib/resolvers/content-tree/references/Recommended.js +1 -1
  48. package/lib/resolvers/content-tree/references/Recommended.js.map +1 -1
  49. package/lib/resolvers/content-tree/references/Tweet.js +7 -2
  50. package/lib/resolvers/content-tree/references/Tweet.js.map +1 -1
  51. package/lib/resolvers/content-tree/references/Video.js +15 -2
  52. package/lib/resolvers/content-tree/references/Video.js.map +1 -1
  53. package/lib/resolvers/content.d.ts +1 -0
  54. package/lib/resolvers/content.js +1 -0
  55. package/lib/resolvers/content.js.map +1 -1
  56. package/lib/resolvers/core.js +16 -1
  57. package/lib/resolvers/core.js.map +1 -1
  58. package/lib/resolvers/index.d.ts +9 -3
  59. package/lib/resolvers/index.js +2 -0
  60. package/lib/resolvers/index.js.map +1 -1
  61. package/lib/resolvers/person.d.ts +8 -0
  62. package/lib/resolvers/person.js +11 -0
  63. package/lib/resolvers/person.js.map +1 -0
  64. package/lib/resolvers/topper.d.ts +3 -3
  65. package/package.json +5 -2
  66. package/queries/article.graphql +9 -0
  67. package/src/datasources/capi.ts +16 -44
  68. package/src/datasources/instrumented.ts +29 -31
  69. package/src/datasources/origami-image.ts +11 -25
  70. package/src/datasources/twitter.ts +10 -24
  71. package/src/generated/index.ts +28 -0
  72. package/src/model/CapiResponse.ts +51 -6
  73. package/src/model/Concept.test.ts +0 -49
  74. package/src/model/Concept.ts +1 -32
  75. package/src/model/Image.ts +9 -4
  76. package/src/model/Person.test.ts +110 -0
  77. package/src/model/Person.ts +79 -0
  78. package/src/model/Topper.test.ts +37 -0
  79. package/src/model/Topper.ts +18 -23
  80. package/src/model/schemas/capi/base-schema.ts +1 -0
  81. package/src/resolvers/content-tree/bodyXMLToTree.test.ts +7 -7
  82. package/src/resolvers/content-tree/bodyXMLToTree.ts +1 -1
  83. package/src/resolvers/content-tree/references/Flourish.ts +7 -2
  84. package/src/resolvers/content-tree/references/RawImage.ts +7 -2
  85. package/src/resolvers/content-tree/references/Recommended.ts +1 -1
  86. package/src/resolvers/content-tree/references/Tweet.ts +7 -2
  87. package/src/resolvers/content-tree/references/Video.ts +18 -4
  88. package/src/resolvers/content.ts +1 -0
  89. package/src/resolvers/core.ts +18 -1
  90. package/src/resolvers/index.ts +2 -0
  91. package/src/resolvers/person.ts +12 -0
  92. package/tsconfig.tsbuildinfo +1 -1
  93. package/typedefs/content.graphql +1 -0
  94. package/typedefs/person.graphql +5 -0
  95. package/typedefs/topper.graphql +3 -3
@@ -1,3 +1,4 @@
1
+ import { OperationalError } from '@dotcom-reliability-kit/errors'
1
2
  import { TweetResolvers } from '../../../generated'
2
3
  import isError from '../../../helpers/isError'
3
4
 
@@ -10,9 +11,13 @@ export const Tweet = {
10
11
  return tweet.html
11
12
  } catch (error) {
12
13
  if (isError(error)) {
13
- context.logger.error({
14
+ context.logger.warn({
14
15
  event: 'RECOVERABLE_ERROR',
15
- error,
16
+ error: new OperationalError({
17
+ code: 'TWEET_EMBED_ERROR',
18
+ message: `Failed to get HTML embed for tweet ${parent.reference.id}`,
19
+ cause: error,
20
+ }),
16
21
  })
17
22
  }
18
23
  return null
@@ -1,15 +1,29 @@
1
1
  import { uuidFromUrl } from '../../../helpers/metadata'
2
2
  import { VideoReferenceResolvers } from '../../../generated'
3
+ import { OperationalError } from '@dotcom-reliability-kit/errors'
3
4
 
4
5
  export const Video = {
5
6
  // This will override the original id from the parent that is a URL.
6
7
  id: (parent) => uuidFromUrl(parent.reference.id),
7
8
 
8
9
  async title(parent, _args, context) {
9
- const capiResponse = await context.dataSources.capi.getContent(
10
- uuidFromUrl(parent.reference.id)
11
- )
12
- return capiResponse.title()
10
+ try {
11
+ const capiResponse = await context.dataSources.capi.getContent(
12
+ uuidFromUrl(parent.reference.id)
13
+ )
14
+
15
+ return capiResponse.title()
16
+ } catch (error) {
17
+ if (error instanceof Error) {
18
+ throw new OperationalError({
19
+ code: 'VIDEO_CONTENT_FETCH_ERROR',
20
+ message: `Error getting content object for video ${parent.reference.id}`,
21
+ cause: error,
22
+ })
23
+ }
24
+
25
+ throw error
26
+ }
13
27
  },
14
28
 
15
29
  type(parent) {
@@ -80,6 +80,7 @@ const resolvers = {
80
80
  }
81
81
  },
82
82
  isPinned: (parent) => parent.isPinned(),
83
+ authors: (parent) => parent.authors(),
83
84
  },
84
85
 
85
86
  LiveBlogPackage: {
@@ -2,6 +2,7 @@ import fs from 'fs'
2
2
  import path from 'path'
3
3
  import { QueryResolvers, MutationResolvers } from '../generated'
4
4
  import { CapiResponse } from '../model/CapiResponse'
5
+ import { BaseError, HttpError } from '@dotcom-reliability-kit/errors'
5
6
 
6
7
  const packageJson = JSON.parse(
7
8
  fs.readFileSync(path.resolve(__dirname, '../../package.json'), 'utf-8')
@@ -13,7 +14,23 @@ const resolvers = {
13
14
  Query: {
14
15
  version: () => version,
15
16
  async content(_, args, context) {
16
- return context.dataSources.capi.getContent(args.uuid)
17
+ try {
18
+ return await context.dataSources.capi.getContent(args.uuid)
19
+ } catch (error) {
20
+ if (
21
+ error instanceof BaseError &&
22
+ error.data.upstreamStatusCode === 404
23
+ ) {
24
+ throw new HttpError({
25
+ code: 'CONTENT_NOT_FOUND',
26
+ message: `Content ${args.uuid} not found in Content API`,
27
+ statusCode: 404,
28
+ relatesToSystems: ['up-ica'],
29
+ })
30
+ }
31
+
32
+ throw error
33
+ }
17
34
  },
18
35
  contentFromJSON(_, { content }, context) {
19
36
  return CapiResponse.fromJSON(content, context)
@@ -9,6 +9,7 @@ import { default as richText } from './richText'
9
9
  import { default as scalars } from './scalars'
10
10
  import { default as teaser } from './teaser'
11
11
  import { default as topper } from './topper'
12
+ import { default as person } from './person'
12
13
  import { resolvers as references } from './content-tree/references'
13
14
  import { Resolvers } from '../generated'
14
15
 
@@ -25,6 +26,7 @@ const resolvers = {
25
26
  ...scalars,
26
27
  ...teaser,
27
28
  ...topper,
29
+ ...person,
28
30
  } satisfies Resolvers
29
31
 
30
32
  export default resolvers
@@ -0,0 +1,12 @@
1
+ import { PersonResolvers } from '../generated'
2
+ const resolvers = {
3
+ Person: {
4
+ headshot: (parent) => parent.headshot(),
5
+ prefLabel: (parent) => parent.prefLabel(),
6
+ streamPage: (parent) => parent.streamPage(),
7
+ },
8
+ } satisfies {
9
+ Person: PersonResolvers
10
+ }
11
+
12
+ export default resolvers