diff --git a/packages/api/package.json b/packages/api/package.json index 3ca6cc60a..95aa34d84 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -3,16 +3,15 @@ "version": "1.0.0", "license": "UNLICENSED", "scripts": { - "build": "tsc && yarn copy-files", - "dev": "ts-node-dev --files src/server.ts", - "dev_qp": "ts-node-dev --files src/queue-processor.ts", + "build": "tsc", + "dev": "ts-node-dev --debounce 100 --respawn --transpile-only src/server.ts", + "dev_qp": "ts-node-dev --debounce 100 --respawn --transpile-only src/queue-processor.ts", "start": "node dist/server.js", "start_queue_processor": "node dist/queue-processor.js", "lint": "eslint src --ext ts,js,tsx,jsx", "lint:fix": "eslint src --fix --ext ts,js,tsx,jsx", "test:typecheck": "tsc --noEmit", - "test": "nyc mocha -r ts-node/register --config mocha-config.json --timeout 10000", - "copy-files": "copyfiles -u 1 src/**/*.html dist/" + "test": "nyc mocha -r ts-node/register --config mocha-config.json --timeout 10000" }, "dependencies": { "@bmatei/apollo-prometheus-exporter": "^3.0.0", @@ -154,7 +153,6 @@ "chai-as-promised": "^7.1.1", "chai-string": "^1.5.0", "circular-dependency-plugin": "^5.2.0", - "copyfiles": "^2.4.1", "mocha": "^9.0.1", "mocha-unfunk-reporter": "^0.4.0", "nock": "^13.2.4", diff --git a/packages/api/src/entity/rule.ts b/packages/api/src/entity/rule.ts index 6dab77e60..8e87a5cd9 100644 --- a/packages/api/src/entity/rule.ts +++ b/packages/api/src/entity/rule.ts @@ -24,6 +24,7 @@ export enum RuleEventType { PageUpdated = 'PAGE_UPDATED', LabelCreated = 'LABEL_CREATED', HighlightCreated = 'HIGHLIGHT_CREATED', + HighlightUpdated = 'HIGHLIGHT_UPDATED', } export interface RuleAction { diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index e5f8bb85a..93afb8908 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -2509,6 +2509,7 @@ export enum RuleActionType { export enum RuleEventType { HighlightCreated = 'HIGHLIGHT_CREATED', + HighlightUpdated = 'HIGHLIGHT_UPDATED', LabelCreated = 'LABEL_CREATED', PageCreated = 'PAGE_CREATED', PageUpdated = 'PAGE_UPDATED' diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 26684a5c0..ba442c3a7 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -1885,6 +1885,7 @@ enum RuleActionType { enum RuleEventType { HIGHLIGHT_CREATED + HIGHLIGHT_UPDATED LABEL_CREATED PAGE_CREATED PAGE_UPDATED diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index c510e5a5c..6b0c3cb01 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -2185,6 +2185,7 @@ const schema = gql` PAGE_UPDATED LABEL_CREATED HIGHLIGHT_CREATED + HIGHLIGHT_UPDATED } input SetRuleInput { diff --git a/packages/api/src/services/highlights.ts b/packages/api/src/services/highlights.ts index 92fedc303..a127d5dfb 100644 --- a/packages/api/src/services/highlights.ts +++ b/packages/api/src/services/highlights.ts @@ -68,9 +68,12 @@ export const createHighlight = async ( EntityType.HIGHLIGHT, { id: libraryItemId, - originalUrl: newHighlight.libraryItem.originalUrl, // for Readwise - thumbnail: newHighlight.libraryItem.thumbnail, // for Readwise highlights: [cleanData], + // for Readwise + originalUrl: newHighlight.libraryItem.originalUrl, + title: newHighlight.libraryItem.title, + author: newHighlight.libraryItem.author, + thumbnail: newHighlight.libraryItem.thumbnail, }, userId ) @@ -122,6 +125,8 @@ export const mergeHighlights = async ( { id: libraryItemId, originalUrl: newHighlight.libraryItem.originalUrl, + title: newHighlight.libraryItem.title, + author: newHighlight.libraryItem.author, thumbnail: newHighlight.libraryItem.thumbnail, highlights: [newHighlight], }, @@ -156,15 +161,14 @@ export const updateHighlight = async ( }) const libraryItemId = updatedHighlight.libraryItem.id - // await pubsub.entityUpdated( - // EntityType.HIGHLIGHT, - // { - // id: libraryItemId, - // slug: updatedHighlight.libraryItem.slug, - // highlights: [highlight], - // } as ItemEvent, - // userId - // ) + await pubsub.entityUpdated( + EntityType.HIGHLIGHT, + { + id: libraryItemId, + highlights: [highlight], + } as ItemEvent, + userId + ) await enqueueUpdateHighlight({ libraryItemId, diff --git a/packages/api/src/services/integrations/notion.ts b/packages/api/src/services/integrations/notion.ts index 5b15639b7..d95bc893b 100644 --- a/packages/api/src/services/integrations/notion.ts +++ b/packages/api/src/services/integrations/notion.ts @@ -258,7 +258,7 @@ export class NotionClient implements IntegrationClient { .filter( (highlight) => !lastSync || - (highlight.updatedAt && highlight.updatedAt > lastSync) // only new highlights + new Date(highlight.updatedAt as string) > lastSync // only new highlights ) .map((highlight) => ({ paragraph: { diff --git a/packages/api/src/services/integrations/readwise.ts b/packages/api/src/services/integrations/readwise.ts index 129144ea1..6a6209abc 100644 --- a/packages/api/src/services/integrations/readwise.ts +++ b/packages/api/src/services/integrations/readwise.ts @@ -102,7 +102,9 @@ export class ReadwiseClient implements IntegrationClient { title: item.title, author: item.author || undefined, highlight_url: getHighlightUrl(item.id, highlight.id), - highlighted_at: highlight.createdAt as string | undefined, + highlighted_at: highlight.createdAt + ? new Date(highlight.createdAt as string).toISOString() + : undefined, category, image_url: item.thumbnail || undefined, location_type: 'order', diff --git a/yarn.lock b/yarn.lock index 1324cd2a1..f31031bd2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12914,19 +12914,6 @@ copy-to-clipboard@^3.3.1: dependencies: toggle-selection "^1.0.6" -copyfiles@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" - integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== - dependencies: - glob "^7.0.5" - minimatch "^3.0.3" - mkdirp "^1.0.4" - noms "0.0.0" - through2 "^2.0.1" - untildify "^4.0.0" - yargs "^16.1.0" - core-js-compat@^3.20.2, core-js-compat@^3.21.0: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" @@ -16833,7 +16820,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7, glob@^7.0.5: +glob@7: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -22431,7 +22418,7 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -23427,14 +23414,6 @@ nofilter@^3.1.0: resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== -noms@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" - integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== - dependencies: - inherits "^2.0.1" - readable-stream "~1.0.31" - nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" @@ -27114,16 +27093,6 @@ readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readdir-scoped-modules@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -29252,11 +29221,6 @@ string_decoder@^1.0.0, string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -29868,7 +29832,7 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= -through2@^2.0.0, through2@^2.0.1, through2@~2.0.0: +through2@^2.0.0, through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -32209,7 +32173,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0, yargs@^16.0.0, yargs@^16.1.0, yargs@^16.2.0: +yargs@16.2.0, yargs@^16.0.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==