@atproto/ozone 0.2.2 → 0.2.4

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 (132) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/api/chat/index.d.ts.map +1 -1
  3. package/dist/api/chat/index.js +2 -0
  4. package/dist/api/chat/index.js.map +1 -1
  5. package/dist/api/health.d.ts.map +1 -1
  6. package/dist/api/moderation/util.d.ts.map +1 -1
  7. package/dist/api/util.d.ts +2 -2
  8. package/dist/api/util.d.ts.map +1 -1
  9. package/dist/api/well-known.d.ts.map +1 -1
  10. package/dist/assignment/index.d.ts.map +1 -1
  11. package/dist/assignment/index.js.map +1 -1
  12. package/dist/auth-verifier.d.ts.map +1 -1
  13. package/dist/background.d.ts.map +1 -1
  14. package/dist/background.js.map +1 -1
  15. package/dist/communication-service/template.d.ts.map +1 -1
  16. package/dist/communication-service/template.js.map +1 -1
  17. package/dist/communication-service/util.d.ts.map +1 -1
  18. package/dist/config/config.d.ts.map +1 -1
  19. package/dist/config/secrets.d.ts.map +1 -1
  20. package/dist/context.d.ts.map +1 -1
  21. package/dist/context.js.map +1 -1
  22. package/dist/daemon/blob-diverter.d.ts.map +1 -1
  23. package/dist/daemon/blob-diverter.js.map +1 -1
  24. package/dist/daemon/context.d.ts.map +1 -1
  25. package/dist/daemon/context.js.map +1 -1
  26. package/dist/daemon/event-pusher.d.ts +1 -1
  27. package/dist/daemon/event-pusher.d.ts.map +1 -1
  28. package/dist/daemon/event-reverser.d.ts.map +1 -1
  29. package/dist/daemon/index.d.ts.map +1 -1
  30. package/dist/daemon/index.js.map +1 -1
  31. package/dist/daemon/materialized-view-refresher.d.ts.map +1 -1
  32. package/dist/daemon/queue-router.d.ts.map +1 -1
  33. package/dist/daemon/scheduled-action-processor.d.ts.map +1 -1
  34. package/dist/daemon/stats-computer.d.ts.map +1 -1
  35. package/dist/daemon/strike-expiry-processor.d.ts.map +1 -1
  36. package/dist/daemon/team-profile-synchronizer.d.ts.map +1 -1
  37. package/dist/daemon/verification-listener.d.ts.map +1 -1
  38. package/dist/db/index.d.ts.map +1 -1
  39. package/dist/db/migrations/provider.d.ts.map +1 -1
  40. package/dist/db/migrations/provider.js.map +1 -1
  41. package/dist/db/pagination.d.ts +1 -1
  42. package/dist/db/pagination.d.ts.map +1 -1
  43. package/dist/db/pagination.js.map +1 -1
  44. package/dist/db/schema/index.d.ts.map +1 -1
  45. package/dist/db/types.d.ts.map +1 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/jetstream/service.d.ts.map +1 -1
  48. package/dist/lexicon/index.d.ts +2 -0
  49. package/dist/lexicon/index.d.ts.map +1 -1
  50. package/dist/lexicon/index.js +4 -0
  51. package/dist/lexicon/index.js.map +1 -1
  52. package/dist/lexicon/lexicons.d.ts +17172 -17038
  53. package/dist/lexicon/lexicons.d.ts.map +1 -1
  54. package/dist/lexicon/lexicons.js +77 -1
  55. package/dist/lexicon/lexicons.js.map +1 -1
  56. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts +13 -0
  57. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts.map +1 -1
  58. package/dist/lexicon/types/chat/bsky/convo/defs.js +7 -0
  59. package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -1
  60. package/dist/lexicon/types/chat/bsky/convo/getUnreadCounts.d.ts +25 -0
  61. package/dist/lexicon/types/chat/bsky/convo/getUnreadCounts.d.ts.map +1 -0
  62. package/dist/lexicon/types/chat/bsky/convo/getUnreadCounts.js +5 -0
  63. package/dist/lexicon/types/chat/bsky/convo/getUnreadCounts.js.map +1 -0
  64. package/dist/lexicon/types/chat/bsky/convo/sendMessage.d.ts +1 -1
  65. package/dist/lexicon/types/chat/bsky/convo/sendMessage.d.ts.map +1 -1
  66. package/dist/lexicon/types/chat/bsky/convo/sendMessage.js.map +1 -1
  67. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.d.ts +1 -1
  68. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.d.ts.map +1 -1
  69. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.js.map +1 -1
  70. package/dist/lexicon/types/chat/bsky/convo/unlockConvo.d.ts +1 -1
  71. package/dist/lexicon/types/chat/bsky/convo/unlockConvo.d.ts.map +1 -1
  72. package/dist/lexicon/types/chat/bsky/convo/unlockConvo.js.map +1 -1
  73. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.d.ts +1 -1
  74. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.d.ts.map +1 -1
  75. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.js.map +1 -1
  76. package/dist/lexicon/util.d.ts.map +1 -1
  77. package/dist/mod-service/index.d.ts +38 -38
  78. package/dist/mod-service/index.d.ts.map +1 -1
  79. package/dist/mod-service/profile.d.ts.map +1 -1
  80. package/dist/mod-service/status.d.ts +80 -80
  81. package/dist/mod-service/status.d.ts.map +1 -1
  82. package/dist/mod-service/strike.d.ts.map +1 -1
  83. package/dist/mod-service/strike.js.map +1 -1
  84. package/dist/mod-service/subject.d.ts +4 -4
  85. package/dist/mod-service/subject.d.ts.map +1 -1
  86. package/dist/mod-service/util.d.ts +1 -1
  87. package/dist/mod-service/util.d.ts.map +1 -1
  88. package/dist/mod-service/views.d.ts.map +1 -1
  89. package/dist/mod-service/views.js.map +1 -1
  90. package/dist/queue/service.d.ts.map +1 -1
  91. package/dist/queue/service.js.map +1 -1
  92. package/dist/report/activity.d.ts +5 -5
  93. package/dist/report/activity.d.ts.map +1 -1
  94. package/dist/report/handle-report-update.d.ts.map +1 -1
  95. package/dist/report/handle-report-update.js.map +1 -1
  96. package/dist/report/stats.d.ts.map +1 -1
  97. package/dist/report/stats.js.map +1 -1
  98. package/dist/report/views.d.ts +2 -2
  99. package/dist/report/views.d.ts.map +1 -1
  100. package/dist/safelink/service.d.ts +3 -3
  101. package/dist/safelink/service.d.ts.map +1 -1
  102. package/dist/safelink/service.js.map +1 -1
  103. package/dist/scheduled-action/service.d.ts.map +1 -1
  104. package/dist/scheduled-action/service.js.map +1 -1
  105. package/dist/sequencer/outbox.d.ts.map +1 -1
  106. package/dist/sequencer/outbox.js.map +1 -1
  107. package/dist/sequencer/sequencer.d.ts.map +1 -1
  108. package/dist/sequencer/sequencer.js.map +1 -1
  109. package/dist/set/service.d.ts +1 -1
  110. package/dist/set/service.d.ts.map +1 -1
  111. package/dist/set/service.js.map +1 -1
  112. package/dist/setting/service.d.ts.map +1 -1
  113. package/dist/setting/service.js.map +1 -1
  114. package/dist/tag-service/content-tagger.d.ts.map +1 -1
  115. package/dist/tag-service/content-tagger.js.map +1 -1
  116. package/dist/tag-service/embed-tagger.d.ts.map +1 -1
  117. package/dist/tag-service/index.d.ts.map +1 -1
  118. package/dist/tag-service/index.js.map +1 -1
  119. package/dist/tag-service/language-tagger.d.ts.map +1 -1
  120. package/dist/tag-service/util.d.ts.map +1 -1
  121. package/dist/team/index.d.ts.map +1 -1
  122. package/dist/team/index.js.map +1 -1
  123. package/dist/util.d.ts.map +1 -1
  124. package/dist/verification/issuer.d.ts +1 -1
  125. package/dist/verification/issuer.d.ts.map +1 -1
  126. package/dist/verification/service.d.ts +5 -5
  127. package/dist/verification/service.d.ts.map +1 -1
  128. package/dist/verification/service.js.map +1 -1
  129. package/dist/verification/util.d.ts.map +1 -1
  130. package/package.json +13 -14
  131. package/src/api/chat/index.ts +2 -0
  132. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../src/sequencer/outbox.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncBuffer, AsyncBufferFullError } from '@atproto/common'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { LabelsEvt, Sequencer } from './sequencer.js'\n\nexport type OutboxOpts = {\n maxBufferSize: number\n}\n\nexport class Outbox {\n private caughtUp = false\n lastSeen = -1\n\n cutoverBuffer: LabelsEvt[]\n outBuffer: AsyncBuffer<LabelsEvt>\n\n constructor(\n public sequencer: Sequencer,\n opts: Partial<OutboxOpts> = {},\n ) {\n const { maxBufferSize = 500 } = opts\n this.cutoverBuffer = []\n this.outBuffer = new AsyncBuffer<LabelsEvt>(maxBufferSize)\n }\n\n // event stream occurs in 3 phases\n // 1. backfill events: events that have been added to the DB since the last time a connection was open.\n // The outbox is not yet listening for new events from the sequencer\n // 2. cutover: the outbox has caught up with where the sequencer purports to be,\n // but the sequencer might already be halfway through sending out a round of updates.\n // Therefore, we start accepting the sequencer's events in a buffer, while making our own request to the\n // database to ensure we're caught up. We then dedupe the query & the buffer & stream the events in order\n // 3. streaming: we're all caught up on historic state, so the sequencer outputs events and we\n // immediately yield them\n async *events(\n backfillCursor?: number,\n signal?: AbortSignal,\n ): AsyncGenerator<LabelsEvt> {\n // catch up as much as we can\n if (backfillCursor !== undefined) {\n for await (const evt of this.getBackfill(backfillCursor)) {\n if (signal?.aborted) return\n this.lastSeen = evt.seq\n yield evt\n }\n } else {\n // if not backfill, we don't need to cutover, just start streaming\n this.caughtUp = true\n }\n\n // streams updates from sequencer, but buffers them for cutover as it makes a last request\n\n const addToBuffer = (evts) => {\n if (this.caughtUp) {\n this.outBuffer.pushMany(evts)\n } else {\n this.cutoverBuffer = [...this.cutoverBuffer, ...evts]\n }\n }\n\n if (!signal?.aborted) {\n this.sequencer.on('events', addToBuffer)\n }\n signal?.addEventListener('abort', () =>\n this.sequencer.off('events', addToBuffer),\n )\n\n const cutover = async () => {\n // only need to perform cutover if we've been backfilling\n if (backfillCursor !== undefined) {\n const cutoverEvts = await this.sequencer.requestLabelRange({\n earliestId: this.lastSeen > -1 ? this.lastSeen : backfillCursor,\n })\n this.outBuffer.pushMany(cutoverEvts)\n // dont worry about dupes, we ensure order on yield\n this.outBuffer.pushMany(this.cutoverBuffer)\n this.caughtUp = true\n this.cutoverBuffer = []\n } else {\n this.caughtUp = true\n }\n }\n cutover()\n\n while (true) {\n try {\n for await (const evt of this.outBuffer.events()) {\n if (signal?.aborted) return\n if (evt.seq > this.lastSeen) {\n this.lastSeen = evt.seq\n yield evt\n }\n }\n } catch (err) {\n if (err instanceof AsyncBufferFullError) {\n throw new InvalidRequestError(\n 'Stream consumer too slow',\n 'ConsumerTooSlow',\n )\n } else {\n throw err\n }\n }\n }\n }\n\n // yields only historical events\n async *getBackfill(backfillCursor: number) {\n const PAGE_SIZE = 500\n while (true) {\n const evts = await this.sequencer.requestLabelRange({\n earliestId: this.lastSeen > -1 ? this.lastSeen : backfillCursor,\n limit: PAGE_SIZE,\n })\n for (const evt of evts) {\n yield evt\n }\n // if we're within half a pagesize of the sequencer, we call it good & switch to cutover\n const seqCursor = this.sequencer.lastSeen ?? -1\n if (seqCursor - this.lastSeen < PAGE_SIZE / 2) break\n if (evts.length < 1) break\n }\n }\n}\n"]}
1
+ {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../src/sequencer/outbox.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncBuffer, AsyncBufferFullError } from '@atproto/common'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { LabelsEvt, Sequencer } from './sequencer.js'\n\nexport type OutboxOpts = {\n maxBufferSize: number\n}\n\nexport class Outbox {\n private caughtUp = false\n lastSeen = -1\n\n cutoverBuffer: LabelsEvt[]\n outBuffer: AsyncBuffer<LabelsEvt>\n\n constructor(\n public sequencer: Sequencer,\n opts: Partial<OutboxOpts> = {},\n ) {\n const { maxBufferSize = 500 } = opts\n this.cutoverBuffer = []\n this.outBuffer = new AsyncBuffer<LabelsEvt>(maxBufferSize)\n }\n\n // event stream occurs in 3 phases\n // 1. backfill events: events that have been added to the DB since the last time a connection was open.\n // The outbox is not yet listening for new events from the sequencer\n // 2. cutover: the outbox has caught up with where the sequencer purports to be,\n // but the sequencer might already be halfway through sending out a round of updates.\n // Therefore, we start accepting the sequencer's events in a buffer, while making our own request to the\n // database to ensure we're caught up. We then dedupe the query & the buffer & stream the events in order\n // 3. streaming: we're all caught up on historic state, so the sequencer outputs events and we\n // immediately yield them\n async *events(\n backfillCursor?: number,\n signal?: AbortSignal,\n ): AsyncGenerator<LabelsEvt> {\n // catch up as much as we can\n if (backfillCursor !== undefined) {\n for await (const evt of this.getBackfill(backfillCursor)) {\n if (signal?.aborted) return\n this.lastSeen = evt.seq\n yield evt\n }\n } else {\n // if not backfill, we don't need to cutover, just start streaming\n this.caughtUp = true\n }\n\n // streams updates from sequencer, but buffers them for cutover as it makes a last request\n\n const addToBuffer = (evts) => {\n if (this.caughtUp) {\n this.outBuffer.pushMany(evts)\n } else {\n this.cutoverBuffer = [...this.cutoverBuffer, ...evts]\n }\n }\n\n if (!signal?.aborted) {\n this.sequencer.on('events', addToBuffer)\n }\n signal?.addEventListener('abort', () =>\n this.sequencer.off('events', addToBuffer),\n )\n\n const cutover = async () => {\n // only need to perform cutover if we've been backfilling\n if (backfillCursor !== undefined) {\n const cutoverEvts = await this.sequencer.requestLabelRange({\n earliestId: this.lastSeen > -1 ? this.lastSeen : backfillCursor,\n })\n this.outBuffer.pushMany(cutoverEvts)\n // dont worry about dupes, we ensure order on yield\n this.outBuffer.pushMany(this.cutoverBuffer)\n this.caughtUp = true\n this.cutoverBuffer = []\n } else {\n this.caughtUp = true\n }\n }\n cutover()\n\n while (true) {\n try {\n for await (const evt of this.outBuffer.events()) {\n if (signal?.aborted) return\n if (evt.seq > this.lastSeen) {\n this.lastSeen = evt.seq\n yield evt\n }\n }\n } catch (err) {\n if (err instanceof AsyncBufferFullError) {\n throw new InvalidRequestError(\n 'Stream consumer too slow',\n 'ConsumerTooSlow',\n )\n } else {\n throw err\n }\n }\n }\n }\n\n // yields only historical events\n async *getBackfill(backfillCursor: number) {\n const PAGE_SIZE = 500\n while (true) {\n const evts = await this.sequencer.requestLabelRange({\n earliestId: this.lastSeen > -1 ? this.lastSeen : backfillCursor,\n limit: PAGE_SIZE,\n })\n for (const evt of evts) {\n yield evt\n }\n // if we're within half a pagesize of the sequencer, we call it good & switch to cutover\n const seqCursor = this.sequencer.lastSeen ?? -1\n if (seqCursor - this.lastSeen < PAGE_SIZE / 2) break\n if (evts.length < 1) break\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,KAAK,UAAU,GAAG,EAAE,CAAC,UAAU,CAAA;AAC/B,OAAO,KAAK,YAAY,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAgB,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,uDAAuD,CAAA;AAE3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,YAAY,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,uDAAuD,CAAA;AAChG,KAAK,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;8BAEU,UAAU,gBAAgB;AAA1E,qBAAa,SAAU,SAAQ,cAA4C;IAQhE,OAAO,EAAE,iBAAiB;IAC1B,QAAQ;IARjB,EAAE,EAAE,QAAQ,CAAA;IACZ,SAAS,UAAQ;IACjB,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;IACtC,MAAM,UAAQ;IACd,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;gBAGnB,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,SAAI;IAQf,KAAK;IAaL,OAAO;IAaP,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAU9B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAW9C,iBAAiB,CAAC,IAAI,EAAE;QAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0BxB,OAAO,CAAC,IAAI;CA+Bb;AAED,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IACnC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA"}
1
+ {"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,KAAK,UAAU,GAAG,EAAE,CAAC,UAAU,CAAA;AAC/B,OAAO,KAAK,YAAY,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAgB,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,uDAAuD,CAAA;AAE3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,YAAY,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,uDAAuD,CAAA;AAChG,KAAK,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;wCAEoB,gBAAgB;AAA1E,qBAAa,SAAU,SAAQ,cAA4C;IAQhE,OAAO,EAAE,iBAAiB;IAC1B,QAAQ;IARjB,EAAE,EAAE,QAAQ,CAAA;IACZ,SAAS,UAAQ;IACjB,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;IACtC,MAAM,UAAQ;IACd,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;IAE5B,YACS,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,SAAI,EAMpB;IAEK,KAAK,kBAWV;IAEK,OAAO,kBAWZ;IAEK,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQnC;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CASnD;IAEK,iBAAiB,CAAC,IAAI,EAAE;QAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAwBvB;IAED,OAAO,CAAC,IAAI;CA+Bb;AAED,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IACnC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"sequencer.js","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'node:events'\nimport { Selectable } from 'kysely'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\ntype PoolClient = pg.PoolClient\nimport type TypedEmitter from 'typed-emitter'\nimport { Database } from '../db/index.js'\nimport { Label as LabelTable, LabelChannel } from '../db/schema/label.js'\nimport { Labels as LabelsEvt } from '../lexicon/types/com/atproto/label/subscribeLabels.js'\nimport { seqLogger as log } from '../logger.js'\nimport { ModerationService } from '../mod-service/index.js'\n\nexport type { Labels as LabelsEvt } from '../lexicon/types/com/atproto/label/subscribeLabels.js'\ntype LabelRow = Selectable<LabelTable>\n\nexport class Sequencer extends (EventEmitter as new () => SequencerEmitter) {\n db: Database\n destroyed = false\n pollPromise: Promise<void> | undefined\n queued = false\n conn: PoolClient | undefined\n\n constructor(\n public modSrvc: ModerationService,\n public lastSeen = 0,\n ) {\n super()\n this.db = modSrvc.db\n // note: this does not err when surpassed, just prints a warning to stderr\n this.setMaxListeners(100)\n }\n\n async start() {\n const curr = await this.curr()\n this.lastSeen = curr ?? 0\n this.poll()\n this.conn = await this.db.pool.connect()\n this.conn.query(`listen ${LabelChannel}`) // if this errors, unhandled rejection should cause process to exit\n this.conn.on('notification', (notif) => {\n if (notif.channel === LabelChannel) {\n this.poll()\n }\n })\n }\n\n async destroy() {\n if (this.destroyed) return\n this.destroyed = true\n if (this.conn) {\n this.conn.release()\n this.conn = undefined\n }\n if (this.pollPromise) {\n await this.pollPromise\n }\n this.emit('close')\n }\n\n async curr(): Promise<number | null> {\n const got = await this.db.db\n .selectFrom('label')\n .selectAll()\n .orderBy('id', 'desc')\n .limit(1)\n .executeTakeFirst()\n return got?.id ?? null\n }\n\n async next(cursor: number): Promise<LabelRow | null> {\n const got = await this.db.db\n .selectFrom('label')\n .selectAll()\n .where('id', '>', cursor)\n .limit(1)\n .orderBy('id', 'asc')\n .executeTakeFirst()\n return got || null\n }\n\n async requestLabelRange(opts: {\n earliestId?: number\n limit?: number\n }): Promise<LabelsEvt[]> {\n const { earliestId, limit } = opts\n\n let seqQb = this.db.db.selectFrom('label').selectAll().orderBy('id', 'asc')\n if (earliestId !== undefined) {\n seqQb = seqQb.where('id', '>', earliestId)\n }\n if (limit !== undefined) {\n seqQb = seqQb.limit(limit)\n }\n\n const rows = await seqQb.execute()\n if (rows.length < 1) {\n return []\n }\n\n const evts: LabelsEvt[] = await Promise.all(\n rows.map(async (row) => {\n const formatted = await this.modSrvc.views.formatLabelAndEnsureSig(row)\n return { seq: row.id, labels: [formatted] }\n }),\n )\n\n return evts\n }\n\n private poll() {\n if (this.destroyed) return\n if (this.pollPromise) {\n this.queued = true\n return\n }\n this.queued = false\n this.pollPromise = this.requestLabelRange({\n earliestId: this.lastSeen,\n limit: 500,\n })\n .then((evts) => {\n this.emit('events', evts)\n this.lastSeen = evts.at(-1)?.seq ?? this.lastSeen\n if (evts.length > 0) {\n this.queued = true\n }\n })\n .catch((err) => {\n log.error(\n { err, lastSeen: this.lastSeen },\n 'sequencer failed to poll db',\n )\n })\n .finally(() => {\n this.pollPromise = undefined\n if (this.queued) {\n this.poll()\n }\n })\n }\n}\n\ntype SequencerEvents = {\n events: (evts: LabelsEvt[]) => void\n close: () => void\n}\n\nexport type SequencerEmitter = TypedEmitter.default<SequencerEvents>\n"]}
1
+ {"version":3,"file":"sequencer.js","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AAOtC,OAAO,EAAuB,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzE,OAAO,EAAE,SAAS,IAAI,GAAG,EAAE,MAAM,cAAc,CAAA;AAM/C,MAAM,OAAO,SAAU,SAAS,YAA2C;IAOzE,YACS,OAA0B,EAC1B,QAAQ,GAAG,CAAC;QAEnB,KAAK,EAAE,CAAA;QAHA,YAAO,GAAP,OAAO,CAAmB;QAC1B,aAAQ,GAAR,QAAQ,CAAI;QAPrB,cAAS,GAAG,KAAK,CAAA;QAEjB,WAAM,GAAG,KAAK,CAAA;QAQZ,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAA;QACpB,0EAA0E;QAC1E,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAA;QACzB,IAAI,CAAC,IAAI,EAAE,CAAA;QACX,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;QACxC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,YAAY,EAAE,CAAC,CAAA,CAAC,mEAAmE;QAC7G,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,EAAE,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;YACnB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAA;QACxB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,OAAO,CAAC;aACnB,SAAS,EAAE;aACX,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,KAAK,CAAC,CAAC,CAAC;aACR,gBAAgB,EAAE,CAAA;QACrB,OAAO,GAAG,EAAE,EAAE,IAAI,IAAI,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,OAAO,CAAC;aACnB,SAAS,EAAE;aACX,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC;aACxB,KAAK,CAAC,CAAC,CAAC;aACR,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,gBAAgB,EAAE,CAAA;QACrB,OAAO,GAAG,IAAI,IAAI,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAGvB;QACC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;QAElC,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC3E,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;QAC5C,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC5B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,IAAI,GAAgB,MAAM,OAAO,CAAC,GAAG,CACzC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACrB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAA;YACvE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,CAAA;QAC7C,CAAC,CAAC,CACH,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,IAAI;QACV,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAC1B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YAClB,OAAM;QACR,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACxC,UAAU,EAAE,IAAI,CAAC,QAAQ;YACzB,KAAK,EAAE,GAAG;SACX,CAAC;aACC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAA;YACjD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YACpB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,GAAG,CAAC,KAAK,CACP,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAChC,6BAA6B,CAC9B,CAAA;QACH,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;YAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,IAAI,EAAE,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;IACN,CAAC;CACF","sourcesContent":["import EventEmitter from 'node:events'\nimport { Selectable } from 'kysely'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\ntype PoolClient = pg.PoolClient\nimport type TypedEmitter from 'typed-emitter'\nimport { Database } from '../db/index.js'\nimport { Label as LabelTable, LabelChannel } from '../db/schema/label.js'\nimport { Labels as LabelsEvt } from '../lexicon/types/com/atproto/label/subscribeLabels.js'\nimport { seqLogger as log } from '../logger.js'\nimport { ModerationService } from '../mod-service/index.js'\n\nexport type { Labels as LabelsEvt } from '../lexicon/types/com/atproto/label/subscribeLabels.js'\ntype LabelRow = Selectable<LabelTable>\n\nexport class Sequencer extends (EventEmitter as new () => SequencerEmitter) {\n db: Database\n destroyed = false\n pollPromise: Promise<void> | undefined\n queued = false\n conn: PoolClient | undefined\n\n constructor(\n public modSrvc: ModerationService,\n public lastSeen = 0,\n ) {\n super()\n this.db = modSrvc.db\n // note: this does not err when surpassed, just prints a warning to stderr\n this.setMaxListeners(100)\n }\n\n async start() {\n const curr = await this.curr()\n this.lastSeen = curr ?? 0\n this.poll()\n this.conn = await this.db.pool.connect()\n this.conn.query(`listen ${LabelChannel}`) // if this errors, unhandled rejection should cause process to exit\n this.conn.on('notification', (notif) => {\n if (notif.channel === LabelChannel) {\n this.poll()\n }\n })\n }\n\n async destroy() {\n if (this.destroyed) return\n this.destroyed = true\n if (this.conn) {\n this.conn.release()\n this.conn = undefined\n }\n if (this.pollPromise) {\n await this.pollPromise\n }\n this.emit('close')\n }\n\n async curr(): Promise<number | null> {\n const got = await this.db.db\n .selectFrom('label')\n .selectAll()\n .orderBy('id', 'desc')\n .limit(1)\n .executeTakeFirst()\n return got?.id ?? null\n }\n\n async next(cursor: number): Promise<LabelRow | null> {\n const got = await this.db.db\n .selectFrom('label')\n .selectAll()\n .where('id', '>', cursor)\n .limit(1)\n .orderBy('id', 'asc')\n .executeTakeFirst()\n return got || null\n }\n\n async requestLabelRange(opts: {\n earliestId?: number\n limit?: number\n }): Promise<LabelsEvt[]> {\n const { earliestId, limit } = opts\n\n let seqQb = this.db.db.selectFrom('label').selectAll().orderBy('id', 'asc')\n if (earliestId !== undefined) {\n seqQb = seqQb.where('id', '>', earliestId)\n }\n if (limit !== undefined) {\n seqQb = seqQb.limit(limit)\n }\n\n const rows = await seqQb.execute()\n if (rows.length < 1) {\n return []\n }\n\n const evts: LabelsEvt[] = await Promise.all(\n rows.map(async (row) => {\n const formatted = await this.modSrvc.views.formatLabelAndEnsureSig(row)\n return { seq: row.id, labels: [formatted] }\n }),\n )\n\n return evts\n }\n\n private poll() {\n if (this.destroyed) return\n if (this.pollPromise) {\n this.queued = true\n return\n }\n this.queued = false\n this.pollPromise = this.requestLabelRange({\n earliestId: this.lastSeen,\n limit: 500,\n })\n .then((evts) => {\n this.emit('events', evts)\n this.lastSeen = evts.at(-1)?.seq ?? this.lastSeen\n if (evts.length > 0) {\n this.queued = true\n }\n })\n .catch((err) => {\n log.error(\n { err, lastSeen: this.lastSeen },\n 'sequencer failed to poll db',\n )\n })\n .finally(() => {\n this.pollPromise = undefined\n if (this.queued) {\n this.poll()\n }\n })\n }\n}\n\ntype SequencerEvents = {\n events: (evts: LabelsEvt[]) => void\n close: () => void\n}\n\nexport type SequencerEmitter = TypedEmitter.default<SequencerEvents>\n"]}
@@ -7,7 +7,7 @@ export declare class SetService {
7
7
  db: Database;
8
8
  constructor(db: Database);
9
9
  static creator(): (db: Database) => SetService;
10
- buildQueryForSetWithSize(): import("kysely").QueryBuilderWithSelection<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", {}, "s.id" | "s.createdAt" | "s.updatedAt" | "s.name" | "s.description" | ((eb: import("kysely").ExpressionBuilder<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s">) => import("kysely").AliasedQueryBuilder<import("kysely/dist/esm/parser/table-parser.js").From<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "set_value">, import("kysely/dist/esm/parser/table-parser.js").FromTables<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", "set_value">, import("kysely").Selection<import("kysely/dist/esm/parser/table-parser.js").From<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "set_value">, import("kysely/dist/esm/parser/table-parser.js").FromTables<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", "set_value">, (e: import("kysely").ExpressionBuilder<import("kysely/dist/esm/parser/table-parser.js").From<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "set_value">, import("kysely/dist/esm/parser/table-parser.js").FromTables<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", "set_value">>) => import("kysely").AliasedAggregateFunctionBuilder<import("kysely/dist/esm/parser/table-parser.js").From<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "set_value">, import("kysely/dist/esm/parser/table-parser.js").FromTables<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", "set_value">, number, "count">>, "setSize">)>;
10
+ buildQueryForSetWithSize(): import("kysely").QueryBuilderWithSelection<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", {}, "s.createdAt" | "s.description" | "s.id" | "s.name" | "s.updatedAt" | ((eb: import("kysely").ExpressionBuilder<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s">) => import("kysely").AliasedQueryBuilder<import("kysely/dist/esm/parser/table-parser.js").From<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "set_value">, import("kysely/dist/esm/parser/table-parser.js").FromTables<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", "set_value">, import("kysely").Selection<import("kysely/dist/esm/parser/table-parser.js").From<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "set_value">, import("kysely/dist/esm/parser/table-parser.js").FromTables<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", "set_value">, (e: import("kysely").ExpressionBuilder<import("kysely/dist/esm/parser/table-parser.js").From<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "set_value">, import("kysely/dist/esm/parser/table-parser.js").FromTables<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", "set_value">>) => import("kysely").AliasedAggregateFunctionBuilder<import("kysely/dist/esm/parser/table-parser.js").From<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "set_value">, import("kysely/dist/esm/parser/table-parser.js").FromTables<import("kysely/dist/esm/parser/table-parser.js").From<import("../db/schema/index.js").DatabaseSchemaType, "set_detail as s">, "s", "set_value">, number, "count">>, "setSize">)>;
11
11
  query({ limit, cursor, namePrefix, sortBy, sortDirection, }: {
12
12
  limit: number;
13
13
  cursor?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/set/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,0CAA0C,CAAA;AAElE,MAAM,MAAM,iBAAiB,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,UAAU,CAAA;AAE5D,qBAAa,UAAU;IACF,EAAE,EAAE,QAAQ;gBAAZ,EAAE,EAAE,QAAQ;IAE/B,MAAM,CAAC,OAAO,KACJ,IAAI,QAAQ;IAGtB,wBAAwB;IAgBlB,KAAK,CAAC,EACV,KAAK,EACL,MAAM,EACN,UAAU,EACV,MAAM,EACN,aAAa,GACd,EAAE;QACD,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,CAAA;QAC1C,aAAa,EAAE,KAAK,GAAG,MAAM,CAAA;KAC9B,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,UAAU,CAAC,SAAS,GAAG;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,EAAE,CAAA;QACnD,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAC;IAkCI,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IASnE,iBAAiB,CACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,SAAS,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IAM7D,gBAAgB,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,MAAM,GACP,EAAE;QACD,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CACP;QACE,GAAG,EAAE,UAAU,CAAC,SAAS,GAAG;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAChD,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GACD,SAAS,CACZ;IA0BK,MAAM,CAAC,EACX,IAAI,EACJ,WAAW,GACZ,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBzD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB5D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;CAShE"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/set/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,0CAA0C,CAAA;AAElE,MAAM,MAAM,iBAAiB,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,UAAU,CAAA;AAE5D,qBAAa,UAAU;IACF,EAAE,EAAE,QAAQ;IAA/B,YAAmB,EAAE,EAAE,QAAQ,EAAI;IAEnC,MAAM,CAAC,OAAO,SACA,QAAQ,gBACrB;IAED,wBAAwB,oqEAcvB;IAEK,KAAK,CAAC,EACV,KAAK,EACL,MAAM,EACN,UAAU,EACV,MAAM,EACN,aAAa,GACd,EAAE;QACD,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,CAAA;QAC1C,aAAa,EAAE,KAAK,GAAG,MAAM,CAAA;KAC9B,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,UAAU,CAAC,SAAS,GAAG;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,EAAE,CAAA;QACnD,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAC,CAgCD;IAEK,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,CAOxE;IAEK,iBAAiB,CACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,SAAS,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC,CAIlE;IAEK,gBAAgB,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,MAAM,GACP,EAAE;QACD,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CACP;QACE,GAAG,EAAE,UAAU,CAAC,SAAS,GAAG;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAChD,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GACD,SAAS,CACZ,CAyBA;IACK,MAAM,CAAC,EACX,IAAI,EACJ,WAAW,GACZ,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBzD;IAEK,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB9D;IAEK,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjE;IAEK,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5C;IAED,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAQ9D;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/set/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport { Database } from '../db/index.js'\nimport { TimeIdKeyset, paginate } from '../db/pagination.js'\nimport { SetDetail } from '../db/schema/ozone_set.js'\nimport { SetView } from '../lexicon/types/tools/ozone/set/defs.js'\n\nexport type SetServiceCreator = (db: Database) => SetService\n\nexport class SetService {\n constructor(public db: Database) {}\n\n static creator() {\n return (db: Database) => new SetService(db)\n }\n\n buildQueryForSetWithSize() {\n return this.db.db.selectFrom('set_detail as s').select([\n 's.id',\n 's.name',\n 's.description',\n 's.createdAt',\n 's.updatedAt',\n (eb) =>\n eb\n .selectFrom('set_value')\n .select((e) => e.fn.count<number>('setId').as('count'))\n .whereRef('setId', '=', 's.id')\n .as('setSize'),\n ])\n }\n\n async query({\n limit,\n cursor,\n namePrefix,\n sortBy,\n sortDirection,\n }: {\n limit: number\n cursor?: string\n namePrefix?: string\n sortBy: 'name' | 'createdAt' | 'updatedAt'\n sortDirection: 'asc' | 'desc'\n }): Promise<{\n sets: Selectable<SetDetail & { setSize: number }>[]\n cursor?: string\n }> {\n let qb = this.buildQueryForSetWithSize().limit(limit)\n\n if (namePrefix) {\n qb = qb.where('s.name', 'like', `${namePrefix}%`)\n }\n\n if (cursor) {\n if (sortBy === 'name') {\n qb = qb.where('s.name', sortDirection === 'asc' ? '>' : '<', cursor)\n } else {\n qb = qb.where(\n `s.${sortBy}`,\n sortDirection === 'asc' ? '>' : '<',\n new Date(cursor),\n )\n }\n }\n\n qb = qb.orderBy(`s.${sortBy}`, sortDirection)\n\n const sets = await qb.execute()\n const lastItem = sets.at(-1)\n\n return {\n sets,\n cursor: lastItem\n ? sortBy === 'name'\n ? lastItem?.name\n : lastItem?.[sortBy].toISOString()\n : undefined,\n }\n }\n\n async getByName(name: string): Promise<Selectable<SetDetail> | undefined> {\n const query = this.db.db\n .selectFrom('set_detail')\n .selectAll()\n .where('name', '=', name)\n\n return await query.executeTakeFirst()\n }\n\n async getByNameWithSize(\n name: string,\n ): Promise<Selectable<SetDetail & { setSize: number }> | undefined> {\n return await this.buildQueryForSetWithSize()\n .where('s.name', '=', name)\n .executeTakeFirst()\n }\n\n async getSetWithValues({\n name,\n limit,\n cursor,\n }: {\n name: string\n limit: number\n cursor?: string\n }): Promise<\n | {\n set: Selectable<SetDetail & { setSize: number }>\n values: string[]\n cursor?: string\n }\n | undefined\n > {\n const set = await this.getByNameWithSize(name)\n if (!set) return undefined\n\n const { ref } = this.db.db.dynamic\n const qb = this.db.db\n .selectFrom('set_value')\n .selectAll()\n .where('setId', '=', set.id)\n\n const keyset = new TimeIdKeyset(ref(`createdAt`), ref('id'))\n const paginatedBuilder = paginate(qb, {\n limit,\n cursor,\n keyset,\n direction: 'asc',\n })\n\n const result = await paginatedBuilder.execute()\n\n return {\n set,\n values: result.map((v) => v.value),\n cursor: keyset.packFromResult(result),\n }\n }\n async upsert({\n name,\n description,\n }: Pick<SetDetail, 'name' | 'description'>): Promise<void> {\n await this.db.db\n .insertInto('set_detail')\n .values({\n name,\n description,\n updatedAt: new Date(),\n })\n .onConflict((oc) => {\n // if description is provided as a string, even an empty one, update it\n // otherwise, just update the updatedAt timestamp\n return oc.column('name').doUpdateSet(\n typeof description === 'string'\n ? {\n description,\n updatedAt: new Date(),\n }\n : { updatedAt: new Date() },\n )\n })\n .execute()\n }\n\n async addValues(setId: number, values: string[]): Promise<void> {\n await this.db.transaction(async (txn) => {\n const now = new Date()\n const query = txn.db\n .insertInto('set_value')\n .values(\n values.map((value) => ({\n setId,\n value,\n createdAt: now,\n })),\n )\n .onConflict((oc) => oc.columns(['setId', 'value']).doNothing())\n\n await query.execute()\n\n // Update the set's updatedAt timestamp\n await txn.db\n .updateTable('set_detail')\n .set({ updatedAt: now })\n .where('id', '=', setId)\n .execute()\n })\n }\n\n async removeValues(setId: number, values: string[]): Promise<void> {\n if (values.length < 1) {\n return\n }\n await this.db.transaction(async (txn) => {\n const query = txn.db\n .deleteFrom('set_value')\n .where('setId', '=', setId)\n .where('value', 'in', values)\n\n await query.execute()\n\n // Update the set's updatedAt timestamp\n await txn.db\n .updateTable('set_detail')\n .set({ updatedAt: new Date() })\n .where('id', '=', setId)\n .execute()\n })\n }\n\n async removeSet(setId: number): Promise<void> {\n await this.db.transaction(async (txn) => {\n await txn.db.deleteFrom('set_value').where('setId', '=', setId).execute()\n await txn.db.deleteFrom('set_detail').where('id', '=', setId).execute()\n })\n }\n\n view(set: Selectable<SetDetail> & { setSize: number }): SetView {\n return {\n name: set.name,\n description: set.description || undefined,\n setSize: set.setSize,\n createdAt: set.createdAt.toISOString(),\n updatedAt: set.updatedAt.toISOString(),\n }\n }\n}\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/set/service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAM5D,MAAM,OAAO,UAAU;IACrB,YAAmB,EAAY;kBAAZ,EAAE;IAAa,CAAC;IAEnC,MAAM,CAAC,OAAO;QACZ,OAAO,CAAC,EAAY,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,wBAAwB;QACtB,OAAO,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;YACrD,MAAM;YACN,QAAQ;YACR,eAAe;YACf,aAAa;YACb,aAAa;YACb,CAAC,EAAE,EAAE,EAAE,CACL,EAAE;iBACC,UAAU,CAAC,WAAW,CAAC;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAS,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;iBACtD,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC;iBAC9B,EAAE,CAAC,SAAS,CAAC;SACnB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EACV,KAAK,EACL,MAAM,EACN,UAAU,EACV,MAAM,EACN,aAAa,GAOd;QAIC,IAAI,EAAE,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAErD,IAAI,UAAU,EAAE,CAAC;YACf,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,CAAA;QACnD,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACtE,CAAC;iBAAM,CAAC;gBACN,EAAE,GAAG,EAAE,CAAC,KAAK,CACX,KAAK,MAAM,EAAE,EACb,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EACnC,IAAI,IAAI,CAAC,MAAM,CAAC,CACjB,CAAA;YACH,CAAC;QACH,CAAC;QAED,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,EAAE,aAAa,CAAC,CAAA;QAE7C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAE5B,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,QAAQ;gBACd,CAAC,CAAC,MAAM,KAAK,MAAM;oBACjB,CAAC,CAAC,QAAQ,EAAE,IAAI;oBAChB,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;gBACpC,CAAC,CAAC,SAAS;SACd,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;aACrB,UAAU,CAAC,YAAY,CAAC;aACxB,SAAS,EAAE;aACX,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAE3B,OAAO,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,IAAY;QAEZ,OAAO,MAAM,IAAI,CAAC,wBAAwB,EAAE;aACzC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC;aAC1B,gBAAgB,EAAE,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,MAAM,GAKP;QAQC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAA;QAE1B,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;aAClB,UAAU,CAAC,WAAW,CAAC;aACvB,SAAS,EAAE;aACX,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QAE9B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,EAAE,EAAE;YACpC,KAAK;YACL,MAAM;YACN,MAAM;YACN,SAAS,EAAE,KAAK;SACjB,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAA;QAE/C,OAAO;YACL,GAAG;YACH,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAClC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;SACtC,CAAA;IACH,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,EACX,IAAI,EACJ,WAAW,GAC6B;QACxC,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,YAAY,CAAC;aACxB,MAAM,CAAC;YACN,IAAI;YACJ,WAAW;YACX,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;aACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YACjB,uEAAuE;YACvE,iDAAiD;YACjD,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAClC,OAAO,WAAW,KAAK,QAAQ;gBAC7B,CAAC,CAAC;oBACE,WAAW;oBACX,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB;gBACH,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAC9B,CAAA;QACH,CAAC,CAAC;aACD,OAAO,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,MAAgB;QAC7C,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE;iBACjB,UAAU,CAAC,WAAW,CAAC;iBACvB,MAAM,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrB,KAAK;gBACL,KAAK;gBACL,SAAS,EAAE,GAAG;aACf,CAAC,CAAC,CACJ;iBACA,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;YAEjE,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;YAErB,uCAAuC;YACvC,MAAM,GAAG,CAAC,EAAE;iBACT,WAAW,CAAC,YAAY,CAAC;iBACzB,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;iBACvB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;iBACvB,OAAO,EAAE,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,MAAgB;QAChD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAM;QACR,CAAC;QACD,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE;iBACjB,UAAU,CAAC,WAAW,CAAC;iBACvB,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC;iBAC1B,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;YAE/B,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;YAErB,uCAAuC;YACvC,MAAM,GAAG,CAAC,EAAE;iBACT,WAAW,CAAC,YAAY,CAAC;iBACzB,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;iBAC9B,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;iBACvB,OAAO,EAAE,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;YACzE,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;QACzE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,GAAgD;QACnD,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;YACzC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;YACtC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;SACvC,CAAA;IACH,CAAC;CACF","sourcesContent":["import { Selectable } from 'kysely'\nimport { Database } from '../db/index.js'\nimport { TimeIdKeyset, paginate } from '../db/pagination.js'\nimport { SetDetail } from '../db/schema/ozone_set.js'\nimport { SetView } from '../lexicon/types/tools/ozone/set/defs.js'\n\nexport type SetServiceCreator = (db: Database) => SetService\n\nexport class SetService {\n constructor(public db: Database) {}\n\n static creator() {\n return (db: Database) => new SetService(db)\n }\n\n buildQueryForSetWithSize() {\n return this.db.db.selectFrom('set_detail as s').select([\n 's.id',\n 's.name',\n 's.description',\n 's.createdAt',\n 's.updatedAt',\n (eb) =>\n eb\n .selectFrom('set_value')\n .select((e) => e.fn.count<number>('setId').as('count'))\n .whereRef('setId', '=', 's.id')\n .as('setSize'),\n ])\n }\n\n async query({\n limit,\n cursor,\n namePrefix,\n sortBy,\n sortDirection,\n }: {\n limit: number\n cursor?: string\n namePrefix?: string\n sortBy: 'name' | 'createdAt' | 'updatedAt'\n sortDirection: 'asc' | 'desc'\n }): Promise<{\n sets: Selectable<SetDetail & { setSize: number }>[]\n cursor?: string\n }> {\n let qb = this.buildQueryForSetWithSize().limit(limit)\n\n if (namePrefix) {\n qb = qb.where('s.name', 'like', `${namePrefix}%`)\n }\n\n if (cursor) {\n if (sortBy === 'name') {\n qb = qb.where('s.name', sortDirection === 'asc' ? '>' : '<', cursor)\n } else {\n qb = qb.where(\n `s.${sortBy}`,\n sortDirection === 'asc' ? '>' : '<',\n new Date(cursor),\n )\n }\n }\n\n qb = qb.orderBy(`s.${sortBy}`, sortDirection)\n\n const sets = await qb.execute()\n const lastItem = sets.at(-1)\n\n return {\n sets,\n cursor: lastItem\n ? sortBy === 'name'\n ? lastItem?.name\n : lastItem?.[sortBy].toISOString()\n : undefined,\n }\n }\n\n async getByName(name: string): Promise<Selectable<SetDetail> | undefined> {\n const query = this.db.db\n .selectFrom('set_detail')\n .selectAll()\n .where('name', '=', name)\n\n return await query.executeTakeFirst()\n }\n\n async getByNameWithSize(\n name: string,\n ): Promise<Selectable<SetDetail & { setSize: number }> | undefined> {\n return await this.buildQueryForSetWithSize()\n .where('s.name', '=', name)\n .executeTakeFirst()\n }\n\n async getSetWithValues({\n name,\n limit,\n cursor,\n }: {\n name: string\n limit: number\n cursor?: string\n }): Promise<\n | {\n set: Selectable<SetDetail & { setSize: number }>\n values: string[]\n cursor?: string\n }\n | undefined\n > {\n const set = await this.getByNameWithSize(name)\n if (!set) return undefined\n\n const { ref } = this.db.db.dynamic\n const qb = this.db.db\n .selectFrom('set_value')\n .selectAll()\n .where('setId', '=', set.id)\n\n const keyset = new TimeIdKeyset(ref(`createdAt`), ref('id'))\n const paginatedBuilder = paginate(qb, {\n limit,\n cursor,\n keyset,\n direction: 'asc',\n })\n\n const result = await paginatedBuilder.execute()\n\n return {\n set,\n values: result.map((v) => v.value),\n cursor: keyset.packFromResult(result),\n }\n }\n async upsert({\n name,\n description,\n }: Pick<SetDetail, 'name' | 'description'>): Promise<void> {\n await this.db.db\n .insertInto('set_detail')\n .values({\n name,\n description,\n updatedAt: new Date(),\n })\n .onConflict((oc) => {\n // if description is provided as a string, even an empty one, update it\n // otherwise, just update the updatedAt timestamp\n return oc.column('name').doUpdateSet(\n typeof description === 'string'\n ? {\n description,\n updatedAt: new Date(),\n }\n : { updatedAt: new Date() },\n )\n })\n .execute()\n }\n\n async addValues(setId: number, values: string[]): Promise<void> {\n await this.db.transaction(async (txn) => {\n const now = new Date()\n const query = txn.db\n .insertInto('set_value')\n .values(\n values.map((value) => ({\n setId,\n value,\n createdAt: now,\n })),\n )\n .onConflict((oc) => oc.columns(['setId', 'value']).doNothing())\n\n await query.execute()\n\n // Update the set's updatedAt timestamp\n await txn.db\n .updateTable('set_detail')\n .set({ updatedAt: now })\n .where('id', '=', setId)\n .execute()\n })\n }\n\n async removeValues(setId: number, values: string[]): Promise<void> {\n if (values.length < 1) {\n return\n }\n await this.db.transaction(async (txn) => {\n const query = txn.db\n .deleteFrom('set_value')\n .where('setId', '=', setId)\n .where('value', 'in', values)\n\n await query.execute()\n\n // Update the set's updatedAt timestamp\n await txn.db\n .updateTable('set_detail')\n .set({ updatedAt: new Date() })\n .where('id', '=', setId)\n .execute()\n })\n }\n\n async removeSet(setId: number): Promise<void> {\n await this.db.transaction(async (txn) => {\n await txn.db.deleteFrom('set_value').where('setId', '=', setId).execute()\n await txn.db.deleteFrom('set_detail').where('id', '=', setId).execute()\n })\n }\n\n view(set: Selectable<SetDetail> & { setSize: number }): SetView {\n return {\n name: set.name,\n description: set.description || undefined,\n setSize: set.setSize,\n createdAt: set.createdAt.toISOString(),\n updatedAt: set.updatedAt.toISOString(),\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/setting/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,8CAA8C,CAAA;AAErE,MAAM,MAAM,qBAAqB,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,cAAc,CAAA;AAEpE,qBAAa,cAAc;IACN,EAAE,EAAE,QAAQ;gBAAZ,EAAE,EAAE,QAAQ;IAE/B,MAAM,CAAC,OAAO,KACJ,IAAI,QAAQ;IAGhB,KAAK,CAAC,EACV,KAAW,EACX,KAAK,EACL,GAAG,EACH,MAAM,EACN,MAAM,EACN,IAAI,GACL,EAAE;QACD,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,CAAA;QAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAChB,GAAG,OAAO,CAAC;QACV,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAA;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAC;IAiCI,MAAM,CACV,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG;QACxD,SAAS,EAAE,IAAI,CAAA;QACf,SAAS,EAAE,IAAI,CAAA;KAChB,GACA,OAAO,CAAC,IAAI,CAAC;IAgBV,aAAa,CACjB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,YAAY,CAAA;QACnB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAA;KAC9B,GACA,OAAO,CAAC,IAAI,CAAC;IAyBhB,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM;CA2B3C"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/setting/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,8CAA8C,CAAA;AAErE,MAAM,MAAM,qBAAqB,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,cAAc,CAAA;AAEpE,qBAAa,cAAc;IACN,EAAE,EAAE,QAAQ;IAA/B,YAAmB,EAAE,EAAE,QAAQ,EAAI;IAEnC,MAAM,CAAC,OAAO,SACA,QAAQ,oBACrB;IAEK,KAAK,CAAC,EACV,KAAW,EACX,KAAK,EACL,GAAG,EACH,MAAM,EACN,MAAM,EACN,IAAI,GACL,EAAE;QACD,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,CAAA;QAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAChB,GAAG,OAAO,CAAC;QACV,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAA;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAC,CA+BD;IAEK,MAAM,CACV,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG;QACxD,SAAS,EAAE,IAAI,CAAA;QACf,SAAS,EAAE,IAAI,CAAA;KAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAcf;IAEK,aAAa,CACjB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,YAAY,CAAA;QACnB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAA;KAC9B,GACA,OAAO,CAAC,IAAI,CAAC,CAuBf;IAED,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CA0BzC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/setting/service.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { Selectable } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { Database } from '../db/index.js'\nimport { Member } from '../db/schema/member.js'\nimport { Setting, SettingScope } from '../db/schema/setting.js'\nimport { Option } from '../lexicon/types/tools/ozone/setting/defs.js'\n\nexport type SettingServiceCreator = (db: Database) => SettingService\n\nexport class SettingService {\n constructor(public db: Database) {}\n\n static creator() {\n return (db: Database) => new SettingService(db)\n }\n\n async query({\n limit = 100,\n scope,\n did,\n cursor,\n prefix,\n keys,\n }: {\n limit: number\n scope?: 'personal' | 'instance'\n did?: string\n cursor?: string\n prefix?: string\n keys?: string[]\n }): Promise<{\n options: Selectable<Setting>[]\n cursor?: string\n }> {\n let builder = this.db.db.selectFrom('setting').selectAll()\n\n if (prefix) {\n builder = builder.where('key', 'like', `${prefix}%`)\n } else if (keys?.length) {\n builder = builder.where('key', 'in', keys)\n }\n\n if (scope) {\n builder = builder.where('scope', '=', scope)\n }\n\n if (did) {\n builder = builder.where('did', '=', did)\n }\n\n if (cursor) {\n const cursorId = parseInt(cursor, 10)\n if (isNaN(cursorId)) {\n throw new InvalidRequestError('invalid cursor')\n }\n builder = builder.where('id', '<', cursorId)\n }\n\n const options = await builder.orderBy('id', 'desc').limit(limit).execute()\n\n return {\n options,\n cursor: options[options.length - 1]?.id.toString(),\n }\n }\n\n async upsert(\n option: Omit<Setting, 'id' | 'createdAt' | 'updatedAt'> & {\n createdAt: Date\n updatedAt: Date\n },\n ): Promise<void> {\n await this.db.db\n .insertInto('setting')\n .values(option)\n .onConflict((oc) => {\n return oc.columns(['key', 'scope', 'did']).doUpdateSet({\n value: option.value,\n updatedAt: option.updatedAt,\n description: option.description,\n managerRole: option.managerRole,\n lastUpdatedBy: option.lastUpdatedBy,\n })\n })\n .execute()\n }\n\n async removeOptions(\n keys: string[],\n filters: {\n did?: string\n scope: SettingScope\n managerRole: Member['role'][]\n },\n ): Promise<void> {\n if (!keys.length) return\n\n if (filters.scope === 'personal') {\n assert(filters.did, 'did is required for personal scope')\n }\n\n let qb = this.db.db\n .deleteFrom('setting')\n .where('key', 'in', keys)\n .where('scope', '=', filters.scope)\n\n if (filters.managerRole.length) {\n qb = qb.where('managerRole', 'in', filters.managerRole)\n } else {\n qb = qb.where('managerRole', 'is', null)\n }\n\n if (filters.did) {\n qb = qb.where('did', '=', filters.did)\n }\n\n await qb.execute()\n }\n\n view(setting: Selectable<Setting>): Option {\n const {\n key,\n value,\n did,\n description,\n createdAt,\n createdBy,\n updatedAt,\n lastUpdatedBy,\n managerRole,\n scope,\n } = setting\n\n return {\n key,\n value,\n did,\n scope,\n createdBy,\n lastUpdatedBy,\n managerRole: managerRole || undefined,\n description: description || undefined,\n createdAt: createdAt.toISOString(),\n updatedAt: updatedAt.toISOString(),\n }\n }\n}\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/setting/service.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { Selectable } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { Database } from '../db/index.js'\nimport { Member } from '../db/schema/member.js'\nimport { Setting, SettingScope } from '../db/schema/setting.js'\nimport { Option } from '../lexicon/types/tools/ozone/setting/defs.js'\n\nexport type SettingServiceCreator = (db: Database) => SettingService\n\nexport class SettingService {\n constructor(public db: Database) {}\n\n static creator() {\n return (db: Database) => new SettingService(db)\n }\n\n async query({\n limit = 100,\n scope,\n did,\n cursor,\n prefix,\n keys,\n }: {\n limit: number\n scope?: 'personal' | 'instance'\n did?: string\n cursor?: string\n prefix?: string\n keys?: string[]\n }): Promise<{\n options: Selectable<Setting>[]\n cursor?: string\n }> {\n let builder = this.db.db.selectFrom('setting').selectAll()\n\n if (prefix) {\n builder = builder.where('key', 'like', `${prefix}%`)\n } else if (keys?.length) {\n builder = builder.where('key', 'in', keys)\n }\n\n if (scope) {\n builder = builder.where('scope', '=', scope)\n }\n\n if (did) {\n builder = builder.where('did', '=', did)\n }\n\n if (cursor) {\n const cursorId = parseInt(cursor, 10)\n if (isNaN(cursorId)) {\n throw new InvalidRequestError('invalid cursor')\n }\n builder = builder.where('id', '<', cursorId)\n }\n\n const options = await builder.orderBy('id', 'desc').limit(limit).execute()\n\n return {\n options,\n cursor: options[options.length - 1]?.id.toString(),\n }\n }\n\n async upsert(\n option: Omit<Setting, 'id' | 'createdAt' | 'updatedAt'> & {\n createdAt: Date\n updatedAt: Date\n },\n ): Promise<void> {\n await this.db.db\n .insertInto('setting')\n .values(option)\n .onConflict((oc) => {\n return oc.columns(['key', 'scope', 'did']).doUpdateSet({\n value: option.value,\n updatedAt: option.updatedAt,\n description: option.description,\n managerRole: option.managerRole,\n lastUpdatedBy: option.lastUpdatedBy,\n })\n })\n .execute()\n }\n\n async removeOptions(\n keys: string[],\n filters: {\n did?: string\n scope: SettingScope\n managerRole: Member['role'][]\n },\n ): Promise<void> {\n if (!keys.length) return\n\n if (filters.scope === 'personal') {\n assert(filters.did, 'did is required for personal scope')\n }\n\n let qb = this.db.db\n .deleteFrom('setting')\n .where('key', 'in', keys)\n .where('scope', '=', filters.scope)\n\n if (filters.managerRole.length) {\n qb = qb.where('managerRole', 'in', filters.managerRole)\n } else {\n qb = qb.where('managerRole', 'is', null)\n }\n\n if (filters.did) {\n qb = qb.where('did', '=', filters.did)\n }\n\n await qb.execute()\n }\n\n view(setting: Selectable<Setting>): Option {\n const {\n key,\n value,\n did,\n description,\n createdAt,\n createdBy,\n updatedAt,\n lastUpdatedBy,\n managerRole,\n scope,\n } = setting\n\n return {\n key,\n value,\n did,\n scope,\n createdBy,\n lastUpdatedBy,\n managerRole: managerRole || undefined,\n description: description || undefined,\n createdAt: createdAt.toISOString(),\n updatedAt: updatedAt.toISOString(),\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"content-tagger.d.ts","sourceRoot":"","sources":["../../src/tag-service/content-tagger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAEpE,8BAAsB,aAAa;IAE/B,SAAS,CAAC,OAAO,EAAE,UAAU;IAC7B,SAAS,CAAC,aAAa,EAAE,0BAA0B,GAAG,IAAI;IAC1D,SAAS,CAAC,iBAAiB,EAAE,iBAAiB;gBAFpC,OAAO,EAAE,UAAU,EACnB,aAAa,EAAE,0BAA0B,GAAG,IAAI,EAChD,iBAAiB,EAAE,iBAAiB;IAGhD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAEpC,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,OAAO;IAC1C,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAE3C,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQlC,SAAS,CAAC,gBAAgB,IAAI,OAAO;CAKtC"}
1
+ {"version":3,"file":"content-tagger.d.ts","sourceRoot":"","sources":["../../src/tag-service/content-tagger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAEpE,8BAAsB,aAAa;IAE/B,SAAS,CAAC,OAAO,EAAE,UAAU;IAC7B,SAAS,CAAC,aAAa,EAAE,0BAA0B,GAAG,IAAI;IAC1D,SAAS,CAAC,iBAAiB,EAAE,iBAAiB;IAHhD,YACY,OAAO,EAAE,UAAU,EACnB,aAAa,EAAE,0BAA0B,GAAG,IAAI,EAChD,iBAAiB,EAAE,iBAAiB,EAC5C;IAEJ,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAEpC,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,OAAO,CAAA;IAC1C,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAE3C,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAMjC;IAED,SAAS,CAAC,gBAAgB,IAAI,OAAO,CAIpC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-tagger.js","sourceRoot":"","sources":["../../src/tag-service/content-tagger.ts"],"names":[],"mappings":"AAIA,MAAM,OAAgB,aAAa;IACjC,YACY,OAAmB,EACnB,aAAgD,EAChD,iBAAoC;QAFpC,YAAO,GAAP,OAAO,CAAY;QACnB,kBAAa,GAAb,aAAa,CAAmC;QAChD,sBAAiB,GAAjB,iBAAiB,CAAmB;IAC7C,CAAC;IAOJ,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,EAAE,CAAA;IACzB,CAAC;IAES,gBAAgB;QACxB,OAAO,OAAO,CACZ,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACxE,CAAA;IACH,CAAC;CACF","sourcesContent":["import { ModerationService } from '../mod-service/index.js'\nimport { ModSubject } from '../mod-service/subject.js'\nimport { ModerationSubjectStatusRow } from '../mod-service/types.js'\n\nexport abstract class ContentTagger {\n constructor(\n protected subject: ModSubject,\n protected subjectStatus: ModerationSubjectStatusRow | null,\n protected moderationService: ModerationService,\n ) {}\n\n protected abstract tagPrefix: string\n\n protected abstract isApplicable(): boolean\n protected abstract buildTags(): Promise<string[]>\n\n async getTags(): Promise<string[]> {\n if (!this.isApplicable()) {\n return []\n }\n\n return this.buildTags()\n }\n\n protected tagAlreadyExists(): boolean {\n return Boolean(\n this.subjectStatus?.tags?.some((tag) => tag.startsWith(this.tagPrefix)),\n )\n }\n}\n"]}
1
+ {"version":3,"file":"content-tagger.js","sourceRoot":"","sources":["../../src/tag-service/content-tagger.ts"],"names":[],"mappings":"AAIA,MAAM,OAAgB,aAAa;IACjC,YACY,OAAmB,EACnB,aAAgD,EAChD,iBAAoC;uBAFpC,OAAO;6BACP,aAAa;iCACb,iBAAiB;IAC1B,CAAC;IAOJ,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,EAAE,CAAA;IACzB,CAAC;IAES,gBAAgB;QACxB,OAAO,OAAO,CACZ,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACxE,CAAA;IACH,CAAC;CACF","sourcesContent":["import { ModerationService } from '../mod-service/index.js'\nimport { ModSubject } from '../mod-service/subject.js'\nimport { ModerationSubjectStatusRow } from '../mod-service/types.js'\n\nexport abstract class ContentTagger {\n constructor(\n protected subject: ModSubject,\n protected subjectStatus: ModerationSubjectStatusRow | null,\n protected moderationService: ModerationService,\n ) {}\n\n protected abstract tagPrefix: string\n\n protected abstract isApplicable(): boolean\n protected abstract buildTags(): Promise<string[]>\n\n async getTags(): Promise<string[]> {\n if (!this.isApplicable()) {\n return []\n }\n\n return this.buildTags()\n }\n\n protected tagAlreadyExists(): boolean {\n return Boolean(\n this.subjectStatus?.tags?.some((tag) => tag.startsWith(this.tagPrefix)),\n )\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"embed-tagger.d.ts","sourceRoot":"","sources":["../../src/tag-service/embed-tagger.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,qBAAa,WAAY,SAAQ,aAAa;IAC5C,SAAS,SAAW;IAEpB,YAAY,IAAI,OAAO;IASjB,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmC9B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAWrE"}
1
+ {"version":3,"file":"embed-tagger.d.ts","sourceRoot":"","sources":["../../src/tag-service/embed-tagger.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,qBAAa,WAAY,SAAQ,aAAa;IAC5C,SAAS,SAAW;IAEpB,YAAY,IAAI,OAAO,CAOtB;IAEK,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAiCnC;IAEK,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAUnE;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tag-service/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAKpE,qBAAa,UAAU;IAInB,OAAO,CAAC,OAAO;IACf,SAAS,CAAC,aAAa,EAAE,0BAA0B,GAAG,IAAI;IAC1D,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,iBAAiB;IAN3B,OAAO,CAAC,OAAO,CAAiB;gBAGtB,OAAO,EAAE,UAAU,EACjB,aAAa,EAAE,0BAA0B,GAAG,IAAI,EAClD,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,iBAAiB;IAUxC,kBAAkB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC;CA4CxD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tag-service/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAKpE,qBAAa,UAAU;IAInB,OAAO,CAAC,OAAO;IACf,SAAS,CAAC,aAAa,EAAE,0BAA0B,GAAG,IAAI;IAC1D,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,iBAAiB;IAN3B,OAAO,CAAC,OAAO,CAAiB;IAEhC,YACU,OAAO,EAAE,UAAU,EACjB,aAAa,EAAE,0BAA0B,GAAG,IAAI,EAClD,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,iBAAiB,EAO7C;IAGK,kBAAkB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,iBA2CtD;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tag-service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,GAAG,EAAE,MAAM,cAAc,CAAA;AAKhD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,OAAO,UAAU;IAGrB,YACU,OAAmB,EACjB,aAAgD,EAClD,SAAiB,EACjB,iBAAoC;QAHpC,YAAO,GAAP,OAAO,CAAY;QACjB,kBAAa,GAAb,aAAa,CAAmC;QAClD,cAAS,GAAT,SAAS,CAAQ;QACjB,sBAAiB,GAAjB,iBAAiB,CAAmB;QAE5C,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC;YAC7D,IAAI,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC;YAC1D,6BAA6B;SAC9B,CAAA;IACH,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,kBAAkB,CAAC,WAA8B;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;YAEjC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;oBACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;oBAClB,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,wDAAwD;oBACxD,GAAG,CAAC,KAAK,CACP,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EACjC,uBAAuB,CACxB,CAAA;gBACH,CAAC;YACH,CAAC,CAAC,CACH,CAAA;YAED,qEAAqE;YACrE,wEAAwE;YACxE,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;oBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAClB,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;oBACpC,KAAK,EAAE;wBACL,KAAK,EAAE,yCAAyC;wBAChD,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;wBACd,MAAM,EAAE,EAAE;qBACX;oBACD,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;CACF","sourcesContent":["import { langLogger as log } from '../logger.js'\nimport { ModerationService } from '../mod-service/index.js'\nimport { ModSubject } from '../mod-service/subject.js'\nimport { ModerationSubjectStatusRow } from '../mod-service/types.js'\nimport { ContentTagger } from './content-tagger.js'\nimport { EmbedTagger } from './embed-tagger.js'\nimport { LanguageTagger } from './language-tagger.js'\n\nexport class TagService {\n private taggers: ContentTagger[]\n\n constructor(\n private subject: ModSubject,\n protected subjectStatus: ModerationSubjectStatusRow | null,\n private taggerDid: string,\n private moderationService: ModerationService,\n ) {\n this.taggers = [\n new LanguageTagger(subject, subjectStatus, moderationService),\n new EmbedTagger(subject, subjectStatus, moderationService),\n // Add more taggers as needed\n ]\n }\n\n // Allow the caller to seed the initial tags\n async evaluateForSubject(initialTags?: Iterable<string>) {\n try {\n const tags = new Set(initialTags)\n\n await Promise.all(\n this.taggers.map(async (tagger) => {\n try {\n const newTags = await tagger.getTags()\n for (const newTag of newTags) {\n tags.add(newTag)\n }\n } catch (e) {\n // Don't let one tagger error stop the rest from running\n log.error(\n { subject: this.subject, err: e },\n 'Error applying tagger',\n )\n }\n }),\n )\n\n // Ensure that before inserting new tags, we discard any tag that may\n // have been evaluated to be added but is already present in the subject\n if (this.subjectStatus?.tags?.length) {\n for (const tag of this.subjectStatus.tags) {\n tags.delete(tag)\n }\n }\n\n if (tags.size) {\n await this.moderationService.logEvent({\n event: {\n $type: 'tools.ozone.moderation.defs#modEventTag',\n add: [...tags],\n remove: [],\n },\n subject: this.subject,\n createdBy: this.taggerDid,\n })\n }\n } catch (err) {\n log.error({ subject: this.subject, err }, 'Error tagging subject')\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tag-service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,GAAG,EAAE,MAAM,cAAc,CAAA;AAKhD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,OAAO,UAAU;IAGrB,YACU,OAAmB,EACjB,aAAgD,EAClD,SAAiB,EACjB,iBAAoC;uBAHpC,OAAO;6BACL,aAAa;yBACf,SAAS;iCACT,iBAAiB;QAEzB,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC;YAC7D,IAAI,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC;YAC1D,6BAA6B;SAC9B,CAAA;IACH,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,kBAAkB,CAAC,WAA8B;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;YAEjC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;oBACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;oBAClB,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,wDAAwD;oBACxD,GAAG,CAAC,KAAK,CACP,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EACjC,uBAAuB,CACxB,CAAA;gBACH,CAAC;YACH,CAAC,CAAC,CACH,CAAA;YAED,qEAAqE;YACrE,wEAAwE;YACxE,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;oBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAClB,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;oBACpC,KAAK,EAAE;wBACL,KAAK,EAAE,yCAAyC;wBAChD,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;wBACd,MAAM,EAAE,EAAE;qBACX;oBACD,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;CACF","sourcesContent":["import { langLogger as log } from '../logger.js'\nimport { ModerationService } from '../mod-service/index.js'\nimport { ModSubject } from '../mod-service/subject.js'\nimport { ModerationSubjectStatusRow } from '../mod-service/types.js'\nimport { ContentTagger } from './content-tagger.js'\nimport { EmbedTagger } from './embed-tagger.js'\nimport { LanguageTagger } from './language-tagger.js'\n\nexport class TagService {\n private taggers: ContentTagger[]\n\n constructor(\n private subject: ModSubject,\n protected subjectStatus: ModerationSubjectStatusRow | null,\n private taggerDid: string,\n private moderationService: ModerationService,\n ) {\n this.taggers = [\n new LanguageTagger(subject, subjectStatus, moderationService),\n new EmbedTagger(subject, subjectStatus, moderationService),\n // Add more taggers as needed\n ]\n }\n\n // Allow the caller to seed the initial tags\n async evaluateForSubject(initialTags?: Iterable<string>) {\n try {\n const tags = new Set(initialTags)\n\n await Promise.all(\n this.taggers.map(async (tagger) => {\n try {\n const newTags = await tagger.getTags()\n for (const newTag of newTags) {\n tags.add(newTag)\n }\n } catch (e) {\n // Don't let one tagger error stop the rest from running\n log.error(\n { subject: this.subject, err: e },\n 'Error applying tagger',\n )\n }\n }),\n )\n\n // Ensure that before inserting new tags, we discard any tag that may\n // have been evaluated to be added but is already present in the subject\n if (this.subjectStatus?.tags?.length) {\n for (const tag of this.subjectStatus.tags) {\n tags.delete(tag)\n }\n }\n\n if (tags.size) {\n await this.moderationService.logEvent({\n event: {\n $type: 'tools.ozone.moderation.defs#modEventTag',\n add: [...tags],\n remove: [],\n },\n subject: this.subject,\n createdBy: this.taggerDid,\n })\n }\n } catch (err) {\n log.error({ subject: this.subject, err }, 'Error tagging subject')\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"language-tagger.d.ts","sourceRoot":"","sources":["../../src/tag-service/language-tagger.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAQnD,qBAAa,cAAe,SAAQ,aAAa;IAC/C,SAAS,SAAU;IAEnB,YAAY,IAAI,OAAO;IAIjB,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYpC,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS;IAqBrE,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;CA4ChD"}
1
+ {"version":3,"file":"language-tagger.d.ts","sourceRoot":"","sources":["../../src/tag-service/language-tagger.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAQnD,qBAAa,cAAe,SAAQ,aAAa;IAC/C,SAAS,SAAU;IAEnB,YAAY,IAAI,OAAO,CAEtB;IAEK,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAUnC;IAED,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAmB1E;IAEK,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CA2C9C;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/tag-service/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iDAAiD,CAAA;AAE5E,eAAO,MAAM,eAAe,GAAI,YAAY,UAAU,WAUrD,CAAA"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/tag-service/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iDAAiD,CAAA;AAE5E,eAAO,MAAM,eAAe,eAAgB,UAAU,WAUrD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/team/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/team/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/team/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport AtpAgent from '@atproto/api'\nimport { chunkArray } from '@atproto/common'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { Database } from '../db/index.js'\nimport { Member } from '../db/schema/member.js'\nimport { ids } from '../lexicon/lexicons.js'\nimport { ProfileViewDetailed } from '../lexicon/types/app/bsky/actor/defs.js'\nimport { Member as TeamMember } from '../lexicon/types/tools/ozone/team/defs.js'\nimport { httpLogger } from '../logger.js'\nimport { AuthHeaders } from '../mod-service/views.js'\n\nexport type TeamServiceCreator = (db: Database) => TeamService\n\nexport class TeamService {\n constructor(\n public db: Database,\n private appviewAgent: AtpAgent,\n private appviewDid: string,\n private createAuthHeaders: (\n aud: string,\n method: string,\n ) => Promise<AuthHeaders>,\n ) {}\n\n static creator(\n appviewAgent: AtpAgent,\n appviewDid: string,\n createAuthHeaders: (aud: string, method: string) => Promise<AuthHeaders>,\n ) {\n return (db: Database) =>\n new TeamService(db, appviewAgent, appviewDid, createAuthHeaders)\n }\n\n async list({\n cursor,\n limit = 25,\n roles,\n disabled,\n q,\n }: {\n q?: string\n cursor?: string\n limit?: number\n disabled?: boolean\n roles?: string[]\n }): Promise<{ members: Selectable<Member>[]; cursor?: string }> {\n let builder = this.db.db.selectFrom('member').selectAll()\n if (cursor) {\n builder = builder.where('createdAt', '>', new Date(cursor))\n }\n if (roles !== undefined) {\n const knownRoles = roles.filter(\n (r) =>\n r === 'tools.ozone.team.defs#roleAdmin' ||\n r === 'tools.ozone.team.defs#roleModerator' ||\n r === 'tools.ozone.team.defs#roleVerifier' ||\n r === 'tools.ozone.team.defs#roleTriage',\n )\n\n // Optimization: no need to query to know that no values will be returned\n if (!knownRoles.length) return { members: [] }\n\n builder = builder.where('role', 'in', knownRoles)\n }\n if (disabled !== undefined) {\n builder = builder.where('disabled', disabled ? 'is' : 'is not', true)\n }\n if (q) {\n builder = builder.where((qb) =>\n qb\n .orWhere('handle', 'ilike', `%${q}%`)\n .orWhere('displayName', 'ilike', `%${q}%`),\n )\n }\n\n const members = await builder\n .limit(limit)\n .orderBy('createdAt', 'asc')\n .orderBy('handle', 'asc')\n .execute()\n\n return { members, cursor: members.at(-1)?.createdAt.toISOString() }\n }\n\n async create({\n role,\n did,\n disabled,\n updatedAt,\n createdAt,\n lastUpdatedBy,\n }: Omit<Selectable<Member>, 'createdAt' | 'updatedAt'> & {\n createdAt?: Date\n updatedAt?: Date\n }): Promise<Selectable<Member>> {\n const now = new Date()\n const newMember = await this.db.db\n .insertInto('member')\n .values({\n role,\n did,\n disabled,\n lastUpdatedBy,\n updatedAt: updatedAt || now,\n createdAt: createdAt || now,\n })\n .returningAll()\n .executeTakeFirstOrThrow()\n\n return newMember\n }\n\n async upsert({\n role,\n did,\n lastUpdatedBy,\n }: Pick<\n Selectable<Member>,\n 'role' | 'did' | 'lastUpdatedBy'\n >): Promise<void> {\n const now = new Date()\n await this.db.db\n .insertInto('member')\n .values({\n role,\n did,\n lastUpdatedBy,\n disabled: false,\n updatedAt: now,\n createdAt: now,\n })\n .onConflict((oc) =>\n oc.column('did').doUpdateSet({ role, updatedAt: now, lastUpdatedBy }),\n )\n .execute()\n }\n\n async update(\n did: string,\n updates: Partial<\n Pick<\n Selectable<Member>,\n 'role' | 'disabled' | 'lastUpdatedBy' | 'updatedAt'\n >\n >,\n ): Promise<Selectable<Member>> {\n const { role, disabled, lastUpdatedBy, updatedAt = new Date() } = updates\n const updatedMember = await this.db.db\n .updateTable('member')\n .where('did', '=', did)\n .set({\n role,\n disabled,\n lastUpdatedBy,\n updatedAt,\n })\n .returningAll()\n .executeTakeFirstOrThrow()\n\n return updatedMember\n }\n\n async delete(did: string): Promise<void> {\n await this.db.db.deleteFrom('member').where('did', '=', did).execute()\n }\n\n async assertCanDelete(did: string): Promise<void> {\n const memberExists = await this.doesMemberExist(did)\n\n if (!memberExists) {\n throw new InvalidRequestError('member not found', 'MemberNotFound')\n }\n }\n\n async doesMemberExist(did: string): Promise<boolean> {\n const member = await this.db.db\n .selectFrom('member')\n .select('did')\n .where('did', '=', did)\n .executeTakeFirst()\n\n return !!member\n }\n\n async getMember(did: string): Promise<Selectable<Member> | undefined> {\n const member = await this.db.db\n .selectFrom('member')\n .selectAll()\n .where('did', '=', did)\n .executeTakeFirst()\n\n return member\n }\n\n getMemberRole(member?: Selectable<Member>) {\n const isAdmin = member?.role === 'tools.ozone.team.defs#roleAdmin'\n const isModerator =\n isAdmin || member?.role === 'tools.ozone.team.defs#roleModerator'\n const isTriage =\n isModerator || member?.role === 'tools.ozone.team.defs#roleTriage'\n const isVerifier =\n isAdmin || member?.role === 'tools.ozone.team.defs#roleVerifier'\n\n return {\n isModerator,\n isAdmin,\n isTriage,\n isVerifier,\n }\n }\n\n // getProfiles() only allows 25 DIDs at a time so we need to query in chunks\n async getProfiles(dids: string[]): Promise<Map<string, ProfileViewDetailed>> {\n const profiles = new Map<string, ProfileViewDetailed>()\n\n try {\n const headers = await this.createAuthHeaders(\n this.appviewDid,\n ids.AppBskyActorGetProfiles,\n )\n\n for (const actors of chunkArray(dids, 25)) {\n const { data } = await this.appviewAgent.getProfiles(\n { actors },\n headers,\n )\n\n data.profiles.forEach((profile) => {\n profiles.set(profile.did, profile)\n })\n }\n } catch (err) {\n httpLogger.error({ err, dids }, 'Failed to get profiles for team members')\n }\n\n return profiles\n }\n\n async syncMemberProfiles(): Promise<void> {\n let lastDid = ''\n // Max 25 profiles can be fetched at a time so let's pull 25 members at a time from the db and update their profile details\n do {\n const members = await this.db.db\n .selectFrom('member')\n .select(['did'])\n .limit(25)\n .if(!!lastDid, (q) => q.where('did', '>', lastDid))\n .orderBy('did', 'asc')\n .execute()\n\n const dids = members.map((member) => member.did)\n const profiles = await this.getProfiles(dids)\n\n for (const profile of profiles.values()) {\n await this.db.db\n .updateTable('member')\n .where('did', '=', profile.did)\n .set({\n handle: profile.handle,\n displayName: profile.displayName || null,\n })\n .execute()\n }\n\n lastDid = dids.at(-1) || ''\n } while (lastDid)\n }\n\n async viewByDids(dids: string[]): Promise<Map<string, TeamMember>> {\n if (!dids.length) return new Map()\n const members = await this.db.db\n .selectFrom('member')\n .selectAll()\n .where('did', 'in', dids)\n .execute()\n const memberViews = await this.view(members)\n return new Map(memberViews.map((m) => [m.did, m]))\n }\n\n async view(members: Selectable<Member>[]): Promise<TeamMember[]> {\n const profiles = await this.getProfiles(members.map(({ did }) => did))\n return members.map((member) => {\n return {\n did: member.did,\n role: member.role,\n disabled: member.disabled,\n profile: profiles.get(member.did),\n createdAt: member.createdAt.toISOString(),\n updatedAt: member.updatedAt.toISOString(),\n lastUpdatedBy: member.lastUpdatedBy,\n }\n })\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/team/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG1D,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAA;AAG5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAKzC,MAAM,OAAO,WAAW;IACtB,YACS,EAAY,EACX,YAAsB,EACtB,UAAkB,EAClB,iBAGiB;kBANlB,EAAE;4BACD,YAAY;0BACZ,UAAU;iCACV,iBAAiB;IAIxB,CAAC;IAEJ,MAAM,CAAC,OAAO,CACZ,YAAsB,EACtB,UAAkB,EAClB,iBAAwE;QAExE,OAAO,CAAC,EAAY,EAAE,EAAE,CACtB,IAAI,WAAW,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EACT,MAAM,EACN,KAAK,GAAG,EAAE,EACV,KAAK,EACL,QAAQ,EACR,CAAC,GAOF;QACC,IAAI,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAA;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7D,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,KAAK,iCAAiC;gBACvC,CAAC,KAAK,qCAAqC;gBAC3C,CAAC,KAAK,oCAAoC;gBAC1C,CAAC,KAAK,kCAAkC,CAC3C,CAAA;YAED,yEAAyE;YACzE,IAAI,CAAC,UAAU,CAAC,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;YAE9C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;QACnD,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACvE,CAAC;QACD,IAAI,CAAC,EAAE,CAAC;YACN,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAC7B,EAAE;iBACC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC;iBACpC,OAAO,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAC7C,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,OAAO;aAC1B,KAAK,CAAC,KAAK,CAAC;aACZ,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC;aAC3B,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;aACxB,OAAO,EAAE,CAAA;QAEZ,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,CAAA;IACrE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EACX,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,GAId;QACC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC/B,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC;YACN,IAAI;YACJ,GAAG;YACH,QAAQ;YACR,aAAa;YACb,SAAS,EAAE,SAAS,IAAI,GAAG;YAC3B,SAAS,EAAE,SAAS,IAAI,GAAG;SAC5B,CAAC;aACD,YAAY,EAAE;aACd,uBAAuB,EAAE,CAAA;QAE5B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EACX,IAAI,EACJ,GAAG,EACH,aAAa,GAId;QACC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC;YACN,IAAI;YACJ,GAAG;YACH,aAAa;YACb,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;aACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CACjB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CACtE;aACA,OAAO,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAW,EACX,OAKC;QAED,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,GAAG,OAAO,CAAA;QACzE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACnC,WAAW,CAAC,QAAQ,CAAC;aACrB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;aACtB,GAAG,CAAC;YACH,IAAI;YACJ,QAAQ;YACR,aAAa;YACb,SAAS;SACV,CAAC;aACD,YAAY,EAAE;aACd,uBAAuB,EAAE,CAAA;QAE5B,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IACxE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAW;QAC/B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAEpD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAW;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC5B,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;aACtB,gBAAgB,EAAE,CAAA;QAErB,OAAO,CAAC,CAAC,MAAM,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC5B,UAAU,CAAC,QAAQ,CAAC;aACpB,SAAS,EAAE;aACX,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;aACtB,gBAAgB,EAAE,CAAA;QAErB,OAAO,MAAM,CAAA;IACf,CAAC;IAED,aAAa,CAAC,MAA2B;QACvC,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,KAAK,iCAAiC,CAAA;QAClE,MAAM,WAAW,GACf,OAAO,IAAI,MAAM,EAAE,IAAI,KAAK,qCAAqC,CAAA;QACnE,MAAM,QAAQ,GACZ,WAAW,IAAI,MAAM,EAAE,IAAI,KAAK,kCAAkC,CAAA;QACpE,MAAM,UAAU,GACd,OAAO,IAAI,MAAM,EAAE,IAAI,KAAK,oCAAoC,CAAA;QAElE,OAAO;YACL,WAAW;YACX,OAAO;YACP,QAAQ;YACR,UAAU;SACX,CAAA;IACH,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,WAAW,CAAC,IAAc;QAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;QAEvD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAC1C,IAAI,CAAC,UAAU,EACf,GAAG,CAAC,uBAAuB,CAC5B,CAAA;YAED,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAClD,EAAE,MAAM,EAAE,EACV,OAAO,CACR,CAAA;gBAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAChC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;gBACpC,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,yCAAyC,CAAC,CAAA;QAC5E,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,2HAA2H;QAC3H,GAAG,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;iBAC7B,UAAU,CAAC,QAAQ,CAAC;iBACpB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;iBACf,KAAK,CAAC,EAAE,CAAC;iBACT,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;iBAClD,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;iBACrB,OAAO,EAAE,CAAA;YAEZ,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;YAE7C,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxC,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;qBACb,WAAW,CAAC,QAAQ,CAAC;qBACrB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;qBAC9B,GAAG,CAAC;oBACH,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;iBACzC,CAAC;qBACD,OAAO,EAAE,CAAA;YACd,CAAC;YAED,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC7B,CAAC,QAAQ,OAAO,EAAC;IACnB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAc;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,GAAG,EAAE,CAAA;QAClC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC7B,UAAU,CAAC,QAAQ,CAAC;aACpB,SAAS,EAAE;aACX,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;aACxB,OAAO,EAAE,CAAA;QACZ,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5C,OAAO,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA6B;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QACtE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5B,OAAO;gBACL,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;gBACjC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;gBACzC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;gBACzC,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF","sourcesContent":["import { Selectable } from 'kysely'\nimport AtpAgent from '@atproto/api'\nimport { chunkArray } from '@atproto/common'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { Database } from '../db/index.js'\nimport { Member } from '../db/schema/member.js'\nimport { ids } from '../lexicon/lexicons.js'\nimport { ProfileViewDetailed } from '../lexicon/types/app/bsky/actor/defs.js'\nimport { Member as TeamMember } from '../lexicon/types/tools/ozone/team/defs.js'\nimport { httpLogger } from '../logger.js'\nimport { AuthHeaders } from '../mod-service/views.js'\n\nexport type TeamServiceCreator = (db: Database) => TeamService\n\nexport class TeamService {\n constructor(\n public db: Database,\n private appviewAgent: AtpAgent,\n private appviewDid: string,\n private createAuthHeaders: (\n aud: string,\n method: string,\n ) => Promise<AuthHeaders>,\n ) {}\n\n static creator(\n appviewAgent: AtpAgent,\n appviewDid: string,\n createAuthHeaders: (aud: string, method: string) => Promise<AuthHeaders>,\n ) {\n return (db: Database) =>\n new TeamService(db, appviewAgent, appviewDid, createAuthHeaders)\n }\n\n async list({\n cursor,\n limit = 25,\n roles,\n disabled,\n q,\n }: {\n q?: string\n cursor?: string\n limit?: number\n disabled?: boolean\n roles?: string[]\n }): Promise<{ members: Selectable<Member>[]; cursor?: string }> {\n let builder = this.db.db.selectFrom('member').selectAll()\n if (cursor) {\n builder = builder.where('createdAt', '>', new Date(cursor))\n }\n if (roles !== undefined) {\n const knownRoles = roles.filter(\n (r) =>\n r === 'tools.ozone.team.defs#roleAdmin' ||\n r === 'tools.ozone.team.defs#roleModerator' ||\n r === 'tools.ozone.team.defs#roleVerifier' ||\n r === 'tools.ozone.team.defs#roleTriage',\n )\n\n // Optimization: no need to query to know that no values will be returned\n if (!knownRoles.length) return { members: [] }\n\n builder = builder.where('role', 'in', knownRoles)\n }\n if (disabled !== undefined) {\n builder = builder.where('disabled', disabled ? 'is' : 'is not', true)\n }\n if (q) {\n builder = builder.where((qb) =>\n qb\n .orWhere('handle', 'ilike', `%${q}%`)\n .orWhere('displayName', 'ilike', `%${q}%`),\n )\n }\n\n const members = await builder\n .limit(limit)\n .orderBy('createdAt', 'asc')\n .orderBy('handle', 'asc')\n .execute()\n\n return { members, cursor: members.at(-1)?.createdAt.toISOString() }\n }\n\n async create({\n role,\n did,\n disabled,\n updatedAt,\n createdAt,\n lastUpdatedBy,\n }: Omit<Selectable<Member>, 'createdAt' | 'updatedAt'> & {\n createdAt?: Date\n updatedAt?: Date\n }): Promise<Selectable<Member>> {\n const now = new Date()\n const newMember = await this.db.db\n .insertInto('member')\n .values({\n role,\n did,\n disabled,\n lastUpdatedBy,\n updatedAt: updatedAt || now,\n createdAt: createdAt || now,\n })\n .returningAll()\n .executeTakeFirstOrThrow()\n\n return newMember\n }\n\n async upsert({\n role,\n did,\n lastUpdatedBy,\n }: Pick<\n Selectable<Member>,\n 'role' | 'did' | 'lastUpdatedBy'\n >): Promise<void> {\n const now = new Date()\n await this.db.db\n .insertInto('member')\n .values({\n role,\n did,\n lastUpdatedBy,\n disabled: false,\n updatedAt: now,\n createdAt: now,\n })\n .onConflict((oc) =>\n oc.column('did').doUpdateSet({ role, updatedAt: now, lastUpdatedBy }),\n )\n .execute()\n }\n\n async update(\n did: string,\n updates: Partial<\n Pick<\n Selectable<Member>,\n 'role' | 'disabled' | 'lastUpdatedBy' | 'updatedAt'\n >\n >,\n ): Promise<Selectable<Member>> {\n const { role, disabled, lastUpdatedBy, updatedAt = new Date() } = updates\n const updatedMember = await this.db.db\n .updateTable('member')\n .where('did', '=', did)\n .set({\n role,\n disabled,\n lastUpdatedBy,\n updatedAt,\n })\n .returningAll()\n .executeTakeFirstOrThrow()\n\n return updatedMember\n }\n\n async delete(did: string): Promise<void> {\n await this.db.db.deleteFrom('member').where('did', '=', did).execute()\n }\n\n async assertCanDelete(did: string): Promise<void> {\n const memberExists = await this.doesMemberExist(did)\n\n if (!memberExists) {\n throw new InvalidRequestError('member not found', 'MemberNotFound')\n }\n }\n\n async doesMemberExist(did: string): Promise<boolean> {\n const member = await this.db.db\n .selectFrom('member')\n .select('did')\n .where('did', '=', did)\n .executeTakeFirst()\n\n return !!member\n }\n\n async getMember(did: string): Promise<Selectable<Member> | undefined> {\n const member = await this.db.db\n .selectFrom('member')\n .selectAll()\n .where('did', '=', did)\n .executeTakeFirst()\n\n return member\n }\n\n getMemberRole(member?: Selectable<Member>) {\n const isAdmin = member?.role === 'tools.ozone.team.defs#roleAdmin'\n const isModerator =\n isAdmin || member?.role === 'tools.ozone.team.defs#roleModerator'\n const isTriage =\n isModerator || member?.role === 'tools.ozone.team.defs#roleTriage'\n const isVerifier =\n isAdmin || member?.role === 'tools.ozone.team.defs#roleVerifier'\n\n return {\n isModerator,\n isAdmin,\n isTriage,\n isVerifier,\n }\n }\n\n // getProfiles() only allows 25 DIDs at a time so we need to query in chunks\n async getProfiles(dids: string[]): Promise<Map<string, ProfileViewDetailed>> {\n const profiles = new Map<string, ProfileViewDetailed>()\n\n try {\n const headers = await this.createAuthHeaders(\n this.appviewDid,\n ids.AppBskyActorGetProfiles,\n )\n\n for (const actors of chunkArray(dids, 25)) {\n const { data } = await this.appviewAgent.getProfiles(\n { actors },\n headers,\n )\n\n data.profiles.forEach((profile) => {\n profiles.set(profile.did, profile)\n })\n }\n } catch (err) {\n httpLogger.error({ err, dids }, 'Failed to get profiles for team members')\n }\n\n return profiles\n }\n\n async syncMemberProfiles(): Promise<void> {\n let lastDid = ''\n // Max 25 profiles can be fetched at a time so let's pull 25 members at a time from the db and update their profile details\n do {\n const members = await this.db.db\n .selectFrom('member')\n .select(['did'])\n .limit(25)\n .if(!!lastDid, (q) => q.where('did', '>', lastDid))\n .orderBy('did', 'asc')\n .execute()\n\n const dids = members.map((member) => member.did)\n const profiles = await this.getProfiles(dids)\n\n for (const profile of profiles.values()) {\n await this.db.db\n .updateTable('member')\n .where('did', '=', profile.did)\n .set({\n handle: profile.handle,\n displayName: profile.displayName || null,\n })\n .execute()\n }\n\n lastDid = dids.at(-1) || ''\n } while (lastDid)\n }\n\n async viewByDids(dids: string[]): Promise<Map<string, TeamMember>> {\n if (!dids.length) return new Map()\n const members = await this.db.db\n .selectFrom('member')\n .selectAll()\n .where('did', 'in', dids)\n .execute()\n const memberViews = await this.view(members)\n return new Map(memberViews.map((m) => [m.did, m]))\n }\n\n async view(members: Selectable<Member>[]): Promise<TeamMember[]> {\n const profiles = await this.getProfiles(members.map(({ did }) => did))\n return members.map((member) => {\n return {\n did: member.did,\n role: member.role,\n disabled: member.disabled,\n profile: profiles.get(member.did),\n createdAt: member.createdAt.toISOString(),\n updatedAt: member.updatedAt.toISOString(),\n lastUpdatedBy: member.lastUpdatedBy,\n }\n })\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,eAAO,MAAM,eAAe,GAC1B,IAAI,QAAQ,EACZ,YAAY,MAAM,KACjB,OAAO,CAAC,MAAM,CAehB,CAAA;AAED,eAAO,MAAM,2BAA2B,aAEtC,CAAA;AAEF,eAAO,MAAM,SAAS,wFAMpB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,mBAAmB,4BAA4B,CAAA;AAE5D,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,MAAM,GAAG,SAAS,EAC1B,YAAY,MAAM,KACjB,cAAc,GAAG,IAuBnB,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,EAAE,KAAG,cAKrD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,QAAQ,cAAc,KAAG,MAK5D,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACjD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,cAAc,UAAQ,iBA+EvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,WAOjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GACtD,eAAe,CAejB"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,eAAO,MAAM,eAAe,OACtB,QAAQ,cACA,MAAM,KACjB,OAAO,CAAC,MAAM,CAehB,CAAA;AAED,eAAO,MAAM,2BAA2B,aAEtC,CAAA;AAEF,eAAO,MAAM,SAAS,wFAMpB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,mBAAmB,4BAA4B,CAAA;AAE5D,eAAO,MAAM,kBAAkB,WACrB,MAAM,GAAG,SAAS,cACd,MAAM,KACjB,cAAc,GAAG,IAuBnB,CAAA;AAED,eAAO,MAAM,oBAAoB,SAAU,MAAM,EAAE,KAAG,cAKrD,CAAA;AAED,eAAO,MAAM,mBAAmB,WAAY,cAAc,KAAG,MAK5D,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACjD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,cAAc,UAAQ,iBA+EvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,WAOjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GACtD,eAAe,CAejB"}
@@ -19,7 +19,7 @@ export declare class VerificationIssuer {
19
19
  verify(verifications: VerificationInput[]): Promise<{
20
20
  grantedVerifications: Selectable<Verification>[];
21
21
  failedVerifications: {
22
- $type: "tools.ozone.verification.grantVerifications#grantError";
22
+ $type: 'tools.ozone.verification.grantVerifications#grantError';
23
23
  subject: string;
24
24
  error: string;
25
25
  }[];
@@ -1 +1 @@
1
- {"version":3,"file":"issuer.d.ts","sourceRoot":"","sources":["../../src/verification/issuer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,KAAK,EAA4B,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,cAAc,EAAE,cAAc,KAC3B,kBAAkB,CAAA;AAIvB,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,cAAc;IAFlC,OAAO,CAAC,OAAO,CAA0D;IACzE,OAAO,CAAC,KAAK,CAA0B;gBACnB,cAAc,EAAE,cAAc;IAElD,MAAM,CAAC,OAAO,KACJ,gBAAgB,cAAc;IAIlC,QAAQ;IAuBR,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE;;;mBAGpC,wDAAwD;qBACtD,MAAM;mBACR,MAAM;;;IAqDX,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;;;iBAED,MAAM;mBAAS,MAAM;;;CAkC9D"}
1
+ {"version":3,"file":"issuer.d.ts","sourceRoot":"","sources":["../../src/verification/issuer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,KAAK,EAA4B,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,cAAc,EAAE,cAAc,KAC3B,kBAAkB,CAAA;AAIvB,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,cAAc;IAFlC,OAAO,CAAC,OAAO,CAA0D;IACzE,OAAO,CAAC,KAAK,CAA0B;IACvC,YAAoB,cAAc,EAAE,cAAc,EAAI;IAEtD,MAAM,CAAC,OAAO,qBACY,cAAc,wBAEvC;IAEK,QAAQ,mBAqBb;IAEK,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE;;;mBAGpC,wDAAwD;qBACtD,MAAM;mBACR,MAAM;;OAmDhB;IAEK,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;;;iBAED,MAAM;mBAAS,MAAM;;OAiC5D;CACF"}
@@ -25,17 +25,17 @@ export declare class VerificationService {
25
25
  limit?: number;
26
26
  }): Promise<{
27
27
  verifications: {
28
- createdAt: string;
29
- updatedAt: string;
30
- uri: string;
31
28
  cid: string;
32
- subject: string;
33
- handle: string;
29
+ createdAt: string;
34
30
  displayName: string;
31
+ handle: string;
35
32
  issuer: string;
36
33
  revokeReason: string | null;
37
34
  revokedAt: string | null;
38
35
  revokedBy: string | null;
36
+ subject: string;
37
+ updatedAt: string;
38
+ uri: string;
39
39
  }[];
40
40
  cursor: string | undefined;
41
41
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/verification/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EACL,MAAM,EACN,gBAAgB,EAEhB,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,MAAM,MAAM,0BAA0B,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,mBAAmB,CAAA;AAE9E,qBAAa,mBAAmB;IACX,EAAE,EAAE,QAAQ;gBAAZ,EAAE,EAAE,QAAQ;IAE/B,MAAM,CAAC,OAAO,KACJ,IAAI,QAAQ;IAGhB,MAAM,CACV,aAAa,EAAE,IAAI,CACjB,YAAY,EACV,KAAK,GACL,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,aAAa,GACb,WAAW,GACX,KAAK,CACR,EAAE;IAYC,WAAW,CAAC,EAChB,IAAI,EACJ,SAAS,EACT,SAAS,EACT,YAAY,GACb,EAAE;QACD,IAAI,EAAE,MAAM,EAAE,CAAA;QACd,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB;IAoBK,IAAI,CAAC,EACT,aAAa,EACb,MAAM,EACN,YAAY,EACZ,aAAa,EACb,OAAY,EACZ,QAAa,EACb,SAAS,EACT,KAAW,GACZ,EAAE;QACD,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;QAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;QACnB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf;;;;;;;;;;;;;;;;IAsCD,IAAI,CACF,aAAa,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,EACzC,KAAK,EAAE,GAAG,CACR,MAAM,EACJ,MAAM,CAAC,wBAAwB,CAAC,cAAc,CAAC,GAC/C,MAAM,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CACpD,EACD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,GAC1D,MAAM,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,EAAE;IAoClD,iBAAiB;IAUvB,oBAAoB;IAWd,oBAAoB,CAAC,MAAM,EAAE,MAAM;CAa1C"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/verification/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EACL,MAAM,EACN,gBAAgB,EAEhB,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,MAAM,MAAM,0BAA0B,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,mBAAmB,CAAA;AAE9E,qBAAa,mBAAmB;IACX,EAAE,EAAE,QAAQ;IAA/B,YAAmB,EAAE,EAAE,QAAQ,EAAI;IAEnC,MAAM,CAAC,OAAO,SACA,QAAQ,yBACrB;IAEK,MAAM,CACV,aAAa,EAAE,IAAI,CACjB,YAAY,EACV,KAAK,GACL,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,aAAa,GACb,WAAW,GACX,KAAK,CACR,EAAE,uCAUJ;IAEK,WAAW,CAAC,EAChB,IAAI,EACJ,SAAS,EACT,SAAS,EACT,YAAY,GACb,EAAE;QACD,IAAI,EAAE,MAAM,EAAE,CAAA;QACd,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,wDAkBA;IAEK,IAAI,CAAC,EACT,aAAa,EACb,MAAM,EACN,YAAY,EACZ,aAAa,EACb,OAAY,EACZ,QAAa,EACb,SAAS,EACT,KAAW,GACZ,EAAE;QACD,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;QAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;QACnB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf;;;;;;;;;;;;;;;OAoCA;IAED,IAAI,CACF,aAAa,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,EACzC,KAAK,EAAE,GAAG,CACR,MAAM,EACJ,MAAM,CAAC,wBAAwB,CAAC,cAAc,CAAC,GAC/C,MAAM,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CACpD,EACD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,GAC1D,MAAM,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,EAAE,CAkCvD;IAEK,iBAAiB,2BAQtB;IAED,oBAAoB,6CASnB;IAEK,oBAAoB,CAAC,MAAM,EAAE,MAAM,sCAYxC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/verification/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport {\n $Typed,\n AppBskyActorDefs,\n AtUri,\n ToolsOzoneModerationDefs,\n ToolsOzoneVerificationDefs,\n} from '@atproto/api'\nimport { Database } from '../db/index.js'\nimport { CreatedAtUriKeyset, paginate } from '../db/pagination.js'\nimport { Verification } from '../db/schema/verification.js'\n\nexport type VerificationServiceCreator = (db: Database) => VerificationService\n\nexport class VerificationService {\n constructor(public db: Database) {}\n\n static creator() {\n return (db: Database) => new VerificationService(db)\n }\n\n async create(\n verifications: Pick<\n Verification,\n | 'uri'\n | 'issuer'\n | 'subject'\n | 'handle'\n | 'displayName'\n | 'createdAt'\n | 'cid'\n >[],\n ) {\n return this.db.transaction(async (tx) => {\n return tx.db\n .insertInto('verification')\n .values(verifications)\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .execute()\n })\n }\n\n async markRevoked({\n uris,\n revokedBy,\n revokedAt,\n revokeReason,\n }: {\n uris: string[]\n revokedBy?: string\n revokedAt?: string\n revokeReason?: string\n }) {\n const now = new Date().toISOString()\n return this.db.transaction(async (tx) => {\n for (const uri of uris) {\n return tx.db\n .updateTable('verification')\n .set({\n revokeReason,\n updatedAt: now,\n revokedAt: revokedAt || now,\n // Allow setting revokedBy to a moderator/verifier DID and if it isn't set, default to the author of the verification record\n revokedBy: revokedBy || new AtUri(uri).host,\n })\n .where('uri', '=', uri)\n .where('revokedAt', 'is', null)\n .execute()\n }\n })\n }\n\n async list({\n sortDirection,\n cursor,\n createdAfter,\n createdBefore,\n issuers = [],\n subjects = [],\n isRevoked,\n limit = 100,\n }: {\n sortDirection?: 'asc' | 'desc'\n cursor?: string\n createdAfter?: string\n createdBefore?: string\n issuers?: string[]\n subjects?: string[]\n isRevoked?: boolean\n limit?: number\n }) {\n const { ref } = this.db.db.dynamic\n\n let qb = this.db.db.selectFrom('verification').selectAll()\n\n if (issuers.length) {\n qb = qb.where('issuer', 'in', issuers)\n }\n\n if (isRevoked !== undefined) {\n qb = qb.where('revokedAt', isRevoked ? 'is not' : 'is', null)\n }\n\n if (subjects.length) {\n qb = qb.where('subject', 'in', subjects)\n }\n\n if (createdAfter) {\n qb = qb.where('createdAt', '>=', createdAfter)\n }\n\n if (createdBefore) {\n qb = qb.where('createdAt', '<=', createdBefore)\n }\n\n const keyset = new CreatedAtUriKeyset(ref(`createdAt`), ref('uri'))\n const paginatedBuilder = paginate(qb, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n direction: sortDirection === 'desc' ? 'desc' : 'asc',\n })\n\n const result = await paginatedBuilder.execute()\n return { verifications: result, cursor: keyset.packFromResult(result) }\n }\n\n view(\n verifications: Selectable<Verification>[],\n repos: Map<\n string,\n | $Typed<ToolsOzoneModerationDefs.RepoViewDetail>\n | $Typed<ToolsOzoneModerationDefs.RepoViewNotFound>\n >,\n profiles: Map<string, AppBskyActorDefs.ProfileViewDetailed>,\n ): $Typed<ToolsOzoneVerificationDefs.VerificationView>[] {\n return verifications.map((verification) => {\n const issuerRepo = repos.get(verification.issuer)\n const subjectRepo = repos.get(verification.subject)\n const subjectProfile = profiles.get(verification.subject)\n const issuerProfile = profiles.get(verification.issuer)\n return {\n $type: 'tools.ozone.verification.defs#verificationView',\n uri: verification.uri,\n issuer: verification.issuer,\n subject: verification.subject,\n createdAt: verification.createdAt,\n displayName: verification.displayName,\n handle: verification.handle,\n updatedAt: verification.updatedAt || undefined,\n revokedAt: verification.revokedAt || undefined,\n revokedBy: verification.revokedBy || undefined,\n revokeReason: verification.revokeReason || undefined,\n issuerRepo,\n subjectRepo,\n subjectProfile: subjectProfile\n ? {\n $type: 'app.bsky.actor.defs#profileViewDetailed',\n ...subjectProfile,\n }\n : undefined,\n issuerProfile: issuerProfile\n ? {\n $type: 'app.bsky.actor.defs#profileViewDetailed',\n ...issuerProfile,\n }\n : undefined,\n }\n })\n }\n\n async getFirehoseCursor() {\n const entry = await this.db.db\n .selectFrom('firehose_cursor')\n .select('cursor')\n .where('service', '=', 'verification')\n .executeTakeFirst()\n\n return entry?.cursor || null\n }\n\n createFirehoseCursor() {\n return this.db.db\n .insertInto('firehose_cursor')\n .values({\n service: 'verification',\n cursor: null,\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async updateFirehoseCursor(cursor: number) {\n const updated = await this.db.db\n .updateTable('firehose_cursor')\n .set({ cursor })\n .where('service', '=', 'verification')\n .where((qb) =>\n qb.where('cursor', '<', cursor).orWhere('cursor', 'is', null),\n )\n .returningAll()\n .executeTakeFirst()\n\n return updated?.cursor\n }\n}\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/verification/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport {\n $Typed,\n AppBskyActorDefs,\n AtUri,\n ToolsOzoneModerationDefs,\n ToolsOzoneVerificationDefs,\n} from '@atproto/api'\nimport { Database } from '../db/index.js'\nimport { CreatedAtUriKeyset, paginate } from '../db/pagination.js'\nimport { Verification } from '../db/schema/verification.js'\n\nexport type VerificationServiceCreator = (db: Database) => VerificationService\n\nexport class VerificationService {\n constructor(public db: Database) {}\n\n static creator() {\n return (db: Database) => new VerificationService(db)\n }\n\n async create(\n verifications: Pick<\n Verification,\n | 'uri'\n | 'issuer'\n | 'subject'\n | 'handle'\n | 'displayName'\n | 'createdAt'\n | 'cid'\n >[],\n ) {\n return this.db.transaction(async (tx) => {\n return tx.db\n .insertInto('verification')\n .values(verifications)\n .onConflict((oc) => oc.doNothing())\n .returningAll()\n .execute()\n })\n }\n\n async markRevoked({\n uris,\n revokedBy,\n revokedAt,\n revokeReason,\n }: {\n uris: string[]\n revokedBy?: string\n revokedAt?: string\n revokeReason?: string\n }) {\n const now = new Date().toISOString()\n return this.db.transaction(async (tx) => {\n for (const uri of uris) {\n return tx.db\n .updateTable('verification')\n .set({\n revokeReason,\n updatedAt: now,\n revokedAt: revokedAt || now,\n // Allow setting revokedBy to a moderator/verifier DID and if it isn't set, default to the author of the verification record\n revokedBy: revokedBy || new AtUri(uri).host,\n })\n .where('uri', '=', uri)\n .where('revokedAt', 'is', null)\n .execute()\n }\n })\n }\n\n async list({\n sortDirection,\n cursor,\n createdAfter,\n createdBefore,\n issuers = [],\n subjects = [],\n isRevoked,\n limit = 100,\n }: {\n sortDirection?: 'asc' | 'desc'\n cursor?: string\n createdAfter?: string\n createdBefore?: string\n issuers?: string[]\n subjects?: string[]\n isRevoked?: boolean\n limit?: number\n }) {\n const { ref } = this.db.db.dynamic\n\n let qb = this.db.db.selectFrom('verification').selectAll()\n\n if (issuers.length) {\n qb = qb.where('issuer', 'in', issuers)\n }\n\n if (isRevoked !== undefined) {\n qb = qb.where('revokedAt', isRevoked ? 'is not' : 'is', null)\n }\n\n if (subjects.length) {\n qb = qb.where('subject', 'in', subjects)\n }\n\n if (createdAfter) {\n qb = qb.where('createdAt', '>=', createdAfter)\n }\n\n if (createdBefore) {\n qb = qb.where('createdAt', '<=', createdBefore)\n }\n\n const keyset = new CreatedAtUriKeyset(ref(`createdAt`), ref('uri'))\n const paginatedBuilder = paginate(qb, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n direction: sortDirection === 'desc' ? 'desc' : 'asc',\n })\n\n const result = await paginatedBuilder.execute()\n return { verifications: result, cursor: keyset.packFromResult(result) }\n }\n\n view(\n verifications: Selectable<Verification>[],\n repos: Map<\n string,\n | $Typed<ToolsOzoneModerationDefs.RepoViewDetail>\n | $Typed<ToolsOzoneModerationDefs.RepoViewNotFound>\n >,\n profiles: Map<string, AppBskyActorDefs.ProfileViewDetailed>,\n ): $Typed<ToolsOzoneVerificationDefs.VerificationView>[] {\n return verifications.map((verification) => {\n const issuerRepo = repos.get(verification.issuer)\n const subjectRepo = repos.get(verification.subject)\n const subjectProfile = profiles.get(verification.subject)\n const issuerProfile = profiles.get(verification.issuer)\n return {\n $type: 'tools.ozone.verification.defs#verificationView',\n uri: verification.uri,\n issuer: verification.issuer,\n subject: verification.subject,\n createdAt: verification.createdAt,\n displayName: verification.displayName,\n handle: verification.handle,\n updatedAt: verification.updatedAt || undefined,\n revokedAt: verification.revokedAt || undefined,\n revokedBy: verification.revokedBy || undefined,\n revokeReason: verification.revokeReason || undefined,\n issuerRepo,\n subjectRepo,\n subjectProfile: subjectProfile\n ? {\n $type: 'app.bsky.actor.defs#profileViewDetailed',\n ...subjectProfile,\n }\n : undefined,\n issuerProfile: issuerProfile\n ? {\n $type: 'app.bsky.actor.defs#profileViewDetailed',\n ...issuerProfile,\n }\n : undefined,\n }\n })\n }\n\n async getFirehoseCursor() {\n const entry = await this.db.db\n .selectFrom('firehose_cursor')\n .select('cursor')\n .where('service', '=', 'verification')\n .executeTakeFirst()\n\n return entry?.cursor || null\n }\n\n createFirehoseCursor() {\n return this.db.db\n .insertInto('firehose_cursor')\n .values({\n service: 'verification',\n cursor: null,\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async updateFirehoseCursor(cursor: number) {\n const updated = await this.db.db\n .updateTable('firehose_cursor')\n .set({ cursor })\n .where('service', '=', 'verification')\n .where((qb) =>\n qb.where('cursor', '<', cursor).orWhere('cursor', 'is', null),\n )\n .returningAll()\n .executeTakeFirst()\n\n return updated?.cursor\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/verification/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAK/D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,eAAO,MAAM,wBAAwB,GACnC,KAAK,UAAU,EACf,UAAU,cAAc,EACxB,YAAY,iBAAiB,EAC7B,MAAM,MAAM,EAAE,EACd,aAAa,OAAO,8HAsCrB,CAAA"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/verification/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAK/D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,eAAO,MAAM,wBAAwB,QAC9B,UAAU,YACL,cAAc,cACZ,iBAAiB,QACvB,MAAM,EAAE,eACD,OAAO,8HAsCrB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/ozone",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "license": "MIT",
5
5
  "description": "Backend service for moderating the Bluesky network.",
6
6
  "keywords": [
@@ -33,15 +33,15 @@
33
33
  "uint8arrays": "^5.0.0",
34
34
  "undici": "^6.14.1",
35
35
  "ws": "^8.12.0",
36
- "@atproto/api": "^0.20.11",
37
- "@atproto/common": "^0.6.1",
38
- "@atproto/crypto": "^0.5.0",
39
- "@atproto/identity": "^0.5.0",
40
- "@atproto/lexicon": "^0.7.1",
41
- "@atproto/ws-client": "^0.1.0",
42
- "@atproto/syntax": "^0.6.1",
43
- "@atproto/xrpc": "^0.8.0",
44
- "@atproto/xrpc-server": "^0.11.1"
36
+ "@atproto/api": "^0.20.16",
37
+ "@atproto/common": "^0.6.3",
38
+ "@atproto/crypto": "^0.5.1",
39
+ "@atproto/identity": "^0.5.1",
40
+ "@atproto/lexicon": "^0.7.2",
41
+ "@atproto/syntax": "^0.6.2",
42
+ "@atproto/ws-client": "^0.1.1",
43
+ "@atproto/xrpc-server": "^0.11.2",
44
+ "@atproto/xrpc": "^0.8.1"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@did-plc/server": "^0.0.1",
@@ -53,9 +53,8 @@
53
53
  "@types/qs": "^6.9.7",
54
54
  "jest": "^30.0.0",
55
55
  "ts-node": "^10.8.2",
56
- "typescript": "^6.0.3",
57
- "@atproto/lex-cli": "^0.10.0",
58
- "@atproto/pds": "^0.5.2"
56
+ "@atproto/lex-cli": "^0.10.1",
57
+ "@atproto/pds": "^0.5.5"
59
58
  },
60
59
  "type": "module",
61
60
  "exports": {
@@ -67,7 +66,7 @@
67
66
  "scripts": {
68
67
  "codegen:lex": "lex gen-server --yes ./src/lexicon ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/*",
69
68
  "prebuild": "[ -f ./src/lexicon/index.ts ] && [ -z \"$(find ../../lexicons -newer ./src/lexicon/index.ts -type f -print -quit)\" ] || pnpm run codegen:lex",
70
- "build": "tsc --build tsconfig.build.json",
69
+ "build": "tsgo --build tsconfig.build.json",
71
70
  "start": "node --enable-source-maps dist/bin.js",
72
71
  "test": "NODE_OPTIONS=--experimental-vm-modules ../dev-infra/with-test-redis-and-db.sh jest",
73
72
  "test:log": "tail -50 test.log | pino-pretty",