[READ ONLY MIRROR] Spark Social AppView Server github.com/sprksocial/server
atproto deno hono lexicon
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: stories archives

+789 -30
+2
data-plane/db/models.ts
··· 354 354 media: StoryMedia; 355 355 sound?: RecordRef; 356 356 labels?: Label[]; 357 + archived?: boolean; 357 358 } 358 359 export const storySchema = new Schema<StoryDocument>({ 359 360 ...authoredSchema, ··· 366 367 required: false, 367 368 }, 368 369 labels: { type: [Object], required: false, default: [] }, 370 + archived: { type: Boolean, required: true, default: false }, 369 371 }) 370 372 .index({ authorDid: 1, createdAt: -1 }); 371 373
+6 -4
data-plane/indexing/plugins/story.ts
··· 27 27 tags: obj.tags || [], 28 28 createdAt: normalizeDatetimeAlways(obj.createdAt), 29 29 indexedAt: timestamp, 30 + archived: false, 30 31 }; 31 32 32 33 // Use findOneAndUpdate with upsert to handle potential duplicate key errors ··· 50 51 db: Database, 51 52 uri: AtUri, 52 53 ): Promise<IndexedStory | null> => { 53 - const deleted = await db.models.Story.findOneAndDelete({ 54 - uri: uri.toString(), 55 - }); 56 - return deleted; 54 + return await db.models.Story.findOneAndUpdate( 55 + { uri: uri.toString() }, 56 + { archived: true }, 57 + { new: true }, 58 + ); 57 59 }; 58 60 59 61 const notifsForDelete = () => {
+24 -5
data-plane/routes/stories.ts
··· 11 11 createdAt: string; 12 12 indexedAt: string; 13 13 sortAt: string; 14 + archived: boolean; 14 15 } 15 16 16 17 export class Stories { ··· 23 24 } 24 25 25 26 /** 26 - * Get stories by URIs 27 + * Get active (non-archived, non-expired) stories by URIs 27 28 */ 28 29 async getStories(uris: string[]): Promise<StoryItem[]> { 29 30 if (!uris.length) return []; 30 31 32 + const twentyFourHoursAgo = new Date(); 33 + twentyFourHoursAgo.setHours( 34 + twentyFourHoursAgo.getHours() - STORIES_EXPIRY_HOURS, 35 + ); 36 + const minDate = twentyFourHoursAgo.toISOString(); 37 + 31 38 const stories = await this.db.models.Story.find({ 32 39 uri: { $in: uris }, 40 + archived: { $ne: true }, 41 + indexedAt: { $gte: minDate }, 33 42 }).lean(); 34 43 35 44 return stories.map((story) => ({ ··· 38 47 authorDid: story.authorDid, 39 48 createdAt: story.createdAt, 40 49 indexedAt: story.indexedAt, 50 + archived: story.archived ?? false, 41 51 sortAt: compositeTime(story.createdAt, story.indexedAt) || 42 52 story.createdAt, 43 53 })); ··· 65 75 ); 66 76 const minDate = twentyFourHoursAgo.toISOString(); 67 77 68 - // Build query with expiry filter 78 + // Build query with expiry filter (exclude archived stories) 69 79 const storiesQuery = this.db.models.Story.find({ 70 80 authorDid: { $in: timelineDids }, 71 - indexedAt: { $gte: minDate }, 81 + archived: { $ne: true }, 82 + // Keep this nested to avoid merging with keyset cursor $or filter. 83 + $and: [ 84 + { 85 + $or: [ 86 + { authorDid: actorDid }, 87 + { indexedAt: { $gte: minDate } }, 88 + ], 89 + }, 90 + ], 72 91 }); 73 92 74 93 // Apply pagination ··· 91 110 authorDid: story.authorDid, 92 111 createdAt: story.createdAt, 93 112 indexedAt: story.indexedAt, 113 + archived: story.archived ?? false, 94 114 sortAt: compositeTime(story.createdAt, story.indexedAt) || 95 115 story.createdAt, 96 116 })); ··· 113 133 114 134 /** 115 135 * Filter out expired stories (older than 24 hours) 116 - * Stories from the owner are not filtered 117 136 */ 118 137 filterExpiredStories( 119 138 stories: StoryItem[], ··· 125 144 ); 126 145 127 146 return stories.filter((story) => { 128 - // If the authenticated user is the author, don't apply the 24h expiration filter 147 + if (story.archived) return false; 129 148 if (ownerDid && story.authorDid === ownerDid) return true; 130 149 const storyDate = new Date(story.indexedAt); 131 150 return storyDate >= twentyFourHoursAgo;
+674 -21
deno.lock
··· 32 32 "jsr:@std/streams@^1.0.14": "1.0.16", 33 33 "jsr:@zod/zod@^4.1.13": "4.2.1", 34 34 "npm:@atproto/api@~0.16.11": "0.16.11", 35 + "npm:@atproto/sync@*": "0.1.39", 35 36 "npm:@bufbuild/protobuf@1.5.0": "1.5.0", 36 37 "npm:@ipld/dag-cbor@^9.2.5": "9.2.5", 37 38 "npm:@types/node@24.0.7": "24.0.7", ··· 39 40 "npm:jose@^6.1.3": "6.1.3", 40 41 "npm:lodash@*": "4.17.21", 41 42 "npm:mongodb-memory-server-core@^11.0.1": "11.0.1", 43 + "npm:mongoose@*": "8.22.0", 42 44 "npm:mongoose@^8.22.0": "8.22.0", 43 45 "npm:multiformats@^13.4.1": "13.4.2", 44 46 "npm:multiformats@^13.4.2": "13.4.2", ··· 210 212 "integrity": "sha512-1dhfQNHiclb102RW+Ea8Nft5olfqU0Ev/vlQaSX6mWNo1aP5zT+sPODJ8+BTUOYk3vcuvL7QMkqA/rLYy2PMyw==", 211 213 "dependencies": [ 212 214 "@atproto/common-web", 213 - "@atproto/lexicon", 215 + "@atproto/lexicon@0.5.1", 214 216 "@atproto/syntax", 215 217 "@atproto/xrpc", 216 218 "await-lock", ··· 219 221 "zod" 220 222 ] 221 223 }, 222 - "@atproto/common-web@0.4.3": { 223 - "integrity": "sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg==", 224 + "@atproto/common-web@0.4.15": { 225 + "integrity": "sha512-A4l9gyqUNez8CjZp/Trypz/D3WIQsNj8dN05WR6+RoBbvwc9JhWjKPrm+WoVYc/F16RPdXHLkE3BEJlGIyYIiA==", 226 + "dependencies": [ 227 + "@atproto/lex-data", 228 + "@atproto/lex-json", 229 + "@atproto/syntax", 230 + "zod" 231 + ] 232 + }, 233 + "@atproto/common@0.5.10": { 234 + "integrity": "sha512-A1+4W3JmjZIgmtJFLJBAaoVruZhRL0ANtyjZ91aJR4rjHcZuaQ+v4IFR1UcE6yyTATacLdBk6ADy8OtxXzq14g==", 235 + "dependencies": [ 236 + "@atproto/common-web", 237 + "@atproto/lex-cbor", 238 + "@atproto/lex-data", 239 + "iso-datestring-validator", 240 + "multiformats@9.9.0", 241 + "pino" 242 + ] 243 + }, 244 + "@atproto/crypto@0.4.5": { 245 + "integrity": "sha512-n40aKkMoCatP0u9Yvhrdk6fXyOHFDDbkdm4h4HCyWW+KlKl8iXfD5iV+ECq+w5BM+QH25aIpt3/j6EUNerhLxw==", 246 + "dependencies": [ 247 + "@noble/curves", 248 + "@noble/hashes", 249 + "uint8arrays" 250 + ] 251 + }, 252 + "@atproto/identity@0.4.10": { 253 + "integrity": "sha512-nQbzDLXOhM8p/wo0cTh5DfMSOSHzj6jizpodX37LJ4S1TZzumSxAjHEZa5Rev3JaoD5uSWMVE0MmKEGWkPPvfQ==", 254 + "dependencies": [ 255 + "@atproto/common-web", 256 + "@atproto/crypto" 257 + ] 258 + }, 259 + "@atproto/lex-cbor@0.0.10": { 260 + "integrity": "sha512-5RtV90iIhRNCXXvvETd3KlraV8XGAAAgOmiszUb+l8GySDU/sGk7AlVvArFfXnj/S/GXJq8DP6IaUxCw/sPASA==", 261 + "dependencies": [ 262 + "@atproto/lex-data", 263 + "tslib" 264 + ] 265 + }, 266 + "@atproto/lex-data@0.0.10": { 267 + "integrity": "sha512-FDbcy8VIUVzS9Mi1F8SMxbkL/jOUmRRpqbeM1xB4A0fMxeZJTxf6naAbFt4gYF3quu/+TPJGmio6/7cav05FqQ==", 224 268 "dependencies": [ 225 - "graphemer", 226 269 "multiformats@9.9.0", 270 + "tslib", 227 271 "uint8arrays", 228 - "zod" 272 + "unicode-segmenter" 273 + ] 274 + }, 275 + "@atproto/lex-json@0.0.10": { 276 + "integrity": "sha512-L6MyXU17C5ODMeob8myQ2F3xvgCTvJUtM0ew8qSApnN//iDasB/FDGgd7ty4UVNmx4NQ/rtvz8xV94YpG6kneQ==", 277 + "dependencies": [ 278 + "@atproto/lex-data", 279 + "tslib" 229 280 ] 230 281 }, 231 282 "@atproto/lexicon@0.5.1": { ··· 238 289 "zod" 239 290 ] 240 291 }, 241 - "@atproto/syntax@0.4.1": { 242 - "integrity": "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw==" 292 + "@atproto/lexicon@0.6.1": { 293 + "integrity": "sha512-/vI1kVlY50Si+5MXpvOucelnYwb0UJ6Qto5mCp+7Q5C+Jtp+SoSykAPVvjVtTnQUH2vrKOFOwpb3C375vSKzXw==", 294 + "dependencies": [ 295 + "@atproto/common-web", 296 + "@atproto/syntax", 297 + "iso-datestring-validator", 298 + "multiformats@9.9.0", 299 + "zod" 300 + ] 243 301 }, 244 - "@atproto/xrpc@0.7.5": { 245 - "integrity": "sha512-MUYNn5d2hv8yVegRL0ccHvTHAVj5JSnW07bkbiaz96UH45lvYNRVwt44z+yYVnb0/mvBzyD3/ZQ55TRGt7fHkA==", 302 + "@atproto/repo@0.8.12": { 303 + "integrity": "sha512-QpVTVulgfz5PUiCTELlDBiRvnsnwrFWi+6CfY88VwXzrRHd9NE8GItK7sfxQ6U65vD/idH8ddCgFrlrsn1REPQ==", 246 304 "dependencies": [ 247 - "@atproto/lexicon", 305 + "@atproto/common", 306 + "@atproto/common-web", 307 + "@atproto/crypto", 308 + "@atproto/lexicon@0.6.1", 309 + "@ipld/dag-cbor@7.0.3", 310 + "multiformats@9.9.0", 311 + "uint8arrays", 312 + "varint", 313 + "zod" 314 + ] 315 + }, 316 + "@atproto/sync@0.1.39": { 317 + "integrity": "sha512-JE0flkb6cDHc1dFNclkX6QB2PYXR+Taa1HDP7prI1lyFtkEASO0AOt+VtbL2JKhEa7VEy8ckko1T9glpCwGNYA==", 318 + "dependencies": [ 319 + "@atproto/common", 320 + "@atproto/identity", 321 + "@atproto/lexicon@0.6.1", 322 + "@atproto/repo", 323 + "@atproto/syntax", 324 + "@atproto/xrpc-server", 325 + "multiformats@9.9.0", 326 + "p-queue@6.6.2", 327 + "ws" 328 + ] 329 + }, 330 + "@atproto/syntax@0.4.3": { 331 + "integrity": "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==", 332 + "dependencies": [ 333 + "tslib" 334 + ] 335 + }, 336 + "@atproto/ws-client@0.0.4": { 337 + "integrity": "sha512-dox1XIymuC7/ZRhUqKezIGgooZS45C6vHCfu0PnWjfvsLCK2kAlnvX4IBkA/WpcoijDhQ9ejChnFbo/sLmgvAg==", 338 + "dependencies": [ 339 + "@atproto/common", 340 + "ws" 341 + ] 342 + }, 343 + "@atproto/xrpc-server@0.10.11": { 344 + "integrity": "sha512-7XR+n1G4j1PO33slr2Agl+lmTXbEQzk5iaCJmrcsfTC/0BbCHqSSbm+WHduz3EH4dfFioZsnDo1UesCF0EQEtg==", 345 + "dependencies": [ 346 + "@atproto/common", 347 + "@atproto/crypto", 348 + "@atproto/lex-cbor", 349 + "@atproto/lex-data", 350 + "@atproto/lexicon@0.6.1", 351 + "@atproto/ws-client", 352 + "@atproto/xrpc", 353 + "express", 354 + "http-errors", 355 + "mime-types", 356 + "rate-limiter-flexible@2.4.2", 357 + "ws", 358 + "zod" 359 + ] 360 + }, 361 + "@atproto/xrpc@0.7.7": { 362 + "integrity": "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==", 363 + "dependencies": [ 364 + "@atproto/lexicon@0.6.1", 248 365 "zod" 249 366 ] 250 367 }, 251 368 "@bufbuild/protobuf@1.5.0": { 252 369 "integrity": "sha512-0Jg+B7Vl8YGCi7c3iZ8/38iTbZrwdU7or6QZlsA9lhSrhumaXOTMsGO8gqwDuus/THEkTiY3Uxn+PEJwgsLt0w==" 253 370 }, 371 + "@ipld/dag-cbor@7.0.3": { 372 + "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", 373 + "dependencies": [ 374 + "cborg@1.10.2", 375 + "multiformats@9.9.0" 376 + ] 377 + }, 254 378 "@ipld/dag-cbor@9.2.5": { 255 379 "integrity": "sha512-84wSr4jv30biui7endhobYhXBQzQE4c/wdoWlFrKcfiwH+ofaPg8fwsM8okX9cOzkkrsAsNdDyH3ou+kiLquwQ==", 256 380 "dependencies": [ 257 - "cborg", 381 + "cborg@4.5.8", 258 382 "multiformats@13.4.2" 259 383 ] 260 384 }, ··· 264 388 "sparse-bitfield" 265 389 ] 266 390 }, 391 + "@noble/curves@1.9.7": { 392 + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", 393 + "dependencies": [ 394 + "@noble/hashes" 395 + ] 396 + }, 397 + "@noble/hashes@1.8.0": { 398 + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==" 399 + }, 267 400 "@types/node@24.0.7": { 268 401 "integrity": "sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==", 269 402 "dependencies": [ ··· 285 418 "@types/webidl-conversions" 286 419 ] 287 420 }, 421 + "abort-controller@3.0.0": { 422 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 423 + "dependencies": [ 424 + "event-target-shim" 425 + ] 426 + }, 427 + "accepts@1.3.8": { 428 + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 429 + "dependencies": [ 430 + "mime-types", 431 + "negotiator" 432 + ] 433 + }, 288 434 "agent-base@7.1.4": { 289 435 "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" 290 436 }, 437 + "array-flatten@1.1.1": { 438 + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 439 + }, 291 440 "async-mutex@0.5.0": { 292 441 "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", 293 442 "dependencies": [ 294 443 "tslib" 295 444 ] 445 + }, 446 + "atomic-sleep@1.0.0": { 447 + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" 296 448 }, 297 449 "await-lock@2.2.2": { 298 450 "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" ··· 303 455 "bare-events@2.8.2": { 304 456 "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==" 305 457 }, 458 + "base64-js@1.5.1": { 459 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 460 + }, 461 + "body-parser@1.20.4": { 462 + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", 463 + "dependencies": [ 464 + "bytes", 465 + "content-type", 466 + "debug@2.6.9", 467 + "depd", 468 + "destroy", 469 + "http-errors", 470 + "iconv-lite", 471 + "on-finished", 472 + "qs", 473 + "raw-body", 474 + "type-is", 475 + "unpipe" 476 + ] 477 + }, 306 478 "bson@6.10.4": { 307 479 "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==" 308 480 }, ··· 311 483 }, 312 484 "buffer-crc32@0.2.13": { 313 485 "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" 486 + }, 487 + "buffer@6.0.3": { 488 + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 489 + "dependencies": [ 490 + "base64-js", 491 + "ieee754" 492 + ] 493 + }, 494 + "bytes@3.1.2": { 495 + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 496 + }, 497 + "call-bind-apply-helpers@1.0.2": { 498 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 499 + "dependencies": [ 500 + "es-errors", 501 + "function-bind" 502 + ] 503 + }, 504 + "call-bound@1.0.4": { 505 + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 506 + "dependencies": [ 507 + "call-bind-apply-helpers", 508 + "get-intrinsic" 509 + ] 314 510 }, 315 511 "camelcase@6.3.0": { 316 512 "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" 317 513 }, 514 + "cborg@1.10.2": { 515 + "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==", 516 + "bin": true 517 + }, 318 518 "cborg@4.5.8": { 319 519 "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==", 320 520 "bin": true ··· 322 522 "commondir@1.0.1": { 323 523 "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" 324 524 }, 525 + "content-disposition@0.5.4": { 526 + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 527 + "dependencies": [ 528 + "safe-buffer" 529 + ] 530 + }, 531 + "content-type@1.0.5": { 532 + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 533 + }, 534 + "cookie-signature@1.0.7": { 535 + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" 536 + }, 537 + "cookie@0.7.2": { 538 + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" 539 + }, 540 + "debug@2.6.9": { 541 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 542 + "dependencies": [ 543 + "ms@2.0.0" 544 + ] 545 + }, 325 546 "debug@4.4.3": { 326 547 "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 327 548 "dependencies": [ 328 - "ms" 549 + "ms@2.1.3" 329 550 ] 551 + }, 552 + "depd@2.0.0": { 553 + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 554 + }, 555 + "destroy@1.2.0": { 556 + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 330 557 }, 331 558 "dotenv@17.2.3": { 332 559 "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==" 333 560 }, 561 + "dunder-proto@1.0.1": { 562 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 563 + "dependencies": [ 564 + "call-bind-apply-helpers", 565 + "es-errors", 566 + "gopd" 567 + ] 568 + }, 569 + "ee-first@1.1.1": { 570 + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 571 + }, 572 + "encodeurl@2.0.0": { 573 + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" 574 + }, 575 + "es-define-property@1.0.1": { 576 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" 577 + }, 578 + "es-errors@1.3.0": { 579 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" 580 + }, 581 + "es-object-atoms@1.1.1": { 582 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 583 + "dependencies": [ 584 + "es-errors" 585 + ] 586 + }, 587 + "escape-html@1.0.3": { 588 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 589 + }, 590 + "etag@1.8.1": { 591 + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 592 + }, 593 + "event-target-shim@5.0.1": { 594 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 595 + }, 596 + "eventemitter3@4.0.7": { 597 + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" 598 + }, 334 599 "eventemitter3@5.0.4": { 335 600 "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==" 336 601 }, ··· 340 605 "bare-events" 341 606 ] 342 607 }, 608 + "events@3.3.0": { 609 + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 610 + }, 611 + "express@4.22.1": { 612 + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", 613 + "dependencies": [ 614 + "accepts", 615 + "array-flatten", 616 + "body-parser", 617 + "content-disposition", 618 + "content-type", 619 + "cookie", 620 + "cookie-signature", 621 + "debug@2.6.9", 622 + "depd", 623 + "encodeurl", 624 + "escape-html", 625 + "etag", 626 + "finalhandler", 627 + "fresh", 628 + "http-errors", 629 + "merge-descriptors", 630 + "methods", 631 + "on-finished", 632 + "parseurl", 633 + "path-to-regexp", 634 + "proxy-addr", 635 + "qs", 636 + "range-parser", 637 + "safe-buffer", 638 + "send", 639 + "serve-static", 640 + "setprototypeof", 641 + "statuses", 642 + "type-is", 643 + "utils-merge", 644 + "vary" 645 + ] 646 + }, 343 647 "fast-fifo@1.3.2": { 344 648 "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" 345 649 }, 650 + "fast-redact@3.5.0": { 651 + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==" 652 + }, 653 + "finalhandler@1.3.2": { 654 + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", 655 + "dependencies": [ 656 + "debug@2.6.9", 657 + "encodeurl", 658 + "escape-html", 659 + "on-finished", 660 + "parseurl", 661 + "statuses", 662 + "unpipe" 663 + ] 664 + }, 346 665 "find-cache-dir@3.3.2": { 347 666 "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", 348 667 "dependencies": [ ··· 361 680 "follow-redirects@1.15.11": { 362 681 "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" 363 682 }, 364 - "graphemer@1.4.0": { 365 - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" 683 + "forwarded@0.2.0": { 684 + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 685 + }, 686 + "fresh@0.5.2": { 687 + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 688 + }, 689 + "function-bind@1.1.2": { 690 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 691 + }, 692 + "get-intrinsic@1.3.0": { 693 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 694 + "dependencies": [ 695 + "call-bind-apply-helpers", 696 + "es-define-property", 697 + "es-errors", 698 + "es-object-atoms", 699 + "function-bind", 700 + "get-proto", 701 + "gopd", 702 + "has-symbols", 703 + "hasown", 704 + "math-intrinsics" 705 + ] 706 + }, 707 + "get-proto@1.0.1": { 708 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 709 + "dependencies": [ 710 + "dunder-proto", 711 + "es-object-atoms" 712 + ] 713 + }, 714 + "gopd@1.2.0": { 715 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" 716 + }, 717 + "has-symbols@1.1.0": { 718 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" 719 + }, 720 + "hasown@2.0.2": { 721 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 722 + "dependencies": [ 723 + "function-bind" 724 + ] 725 + }, 726 + "http-errors@2.0.1": { 727 + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", 728 + "dependencies": [ 729 + "depd", 730 + "inherits", 731 + "setprototypeof", 732 + "statuses", 733 + "toidentifier" 734 + ] 366 735 }, 367 736 "https-proxy-agent@7.0.6": { 368 737 "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 369 738 "dependencies": [ 370 739 "agent-base", 371 - "debug" 740 + "debug@4.4.3" 372 741 ] 742 + }, 743 + "iconv-lite@0.4.24": { 744 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 745 + "dependencies": [ 746 + "safer-buffer" 747 + ] 748 + }, 749 + "ieee754@1.2.1": { 750 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 751 + }, 752 + "inherits@2.0.4": { 753 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 754 + }, 755 + "ipaddr.js@1.9.1": { 756 + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 373 757 }, 374 758 "iso-datestring-validator@2.2.2": { 375 759 "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==" ··· 395 779 "semver@6.3.1" 396 780 ] 397 781 }, 782 + "math-intrinsics@1.1.0": { 783 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" 784 + }, 785 + "media-typer@0.3.0": { 786 + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 787 + }, 398 788 "memory-pager@1.5.0": { 399 789 "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 400 790 }, 791 + "merge-descriptors@1.0.3": { 792 + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" 793 + }, 794 + "methods@1.1.2": { 795 + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 796 + }, 797 + "mime-db@1.52.0": { 798 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 799 + }, 800 + "mime-types@2.1.35": { 801 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 802 + "dependencies": [ 803 + "mime-db" 804 + ] 805 + }, 806 + "mime@1.6.0": { 807 + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 808 + "bin": true 809 + }, 401 810 "mongodb-connection-string-url@3.0.2": { 402 811 "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", 403 812 "dependencies": [ ··· 417 826 "dependencies": [ 418 827 "async-mutex", 419 828 "camelcase", 420 - "debug", 829 + "debug@4.4.3", 421 830 "find-cache-dir", 422 831 "follow-redirects", 423 832 "https-proxy-agent", ··· 453 862 "mongodb@6.20.0", 454 863 "mpath", 455 864 "mquery", 456 - "ms", 865 + "ms@2.1.3", 457 866 "sift" 458 867 ] 459 868 }, ··· 463 872 "mquery@5.0.0": { 464 873 "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", 465 874 "dependencies": [ 466 - "debug" 875 + "debug@4.4.3" 467 876 ] 468 877 }, 878 + "ms@2.0.0": { 879 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 880 + }, 469 881 "ms@2.1.3": { 470 882 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 471 883 }, ··· 475 887 "multiformats@9.9.0": { 476 888 "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" 477 889 }, 890 + "negotiator@0.6.3": { 891 + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 892 + }, 478 893 "new-find-package-json@2.0.0": { 479 894 "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", 480 895 "dependencies": [ 481 - "debug" 896 + "debug@4.4.3" 482 897 ] 483 898 }, 899 + "object-inspect@1.13.4": { 900 + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" 901 + }, 902 + "on-exit-leak-free@2.1.2": { 903 + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==" 904 + }, 905 + "on-finished@2.4.1": { 906 + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 907 + "dependencies": [ 908 + "ee-first" 909 + ] 910 + }, 911 + "p-finally@1.0.0": { 912 + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" 913 + }, 484 914 "p-limit@2.3.0": { 485 915 "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 486 916 "dependencies": [ ··· 493 923 "p-limit" 494 924 ] 495 925 }, 926 + "p-queue@6.6.2": { 927 + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", 928 + "dependencies": [ 929 + "eventemitter3@4.0.7", 930 + "p-timeout@3.2.0" 931 + ] 932 + }, 496 933 "p-queue@8.1.1": { 497 934 "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", 498 935 "dependencies": [ 499 - "eventemitter3", 500 - "p-timeout" 936 + "eventemitter3@5.0.4", 937 + "p-timeout@6.1.4" 938 + ] 939 + }, 940 + "p-timeout@3.2.0": { 941 + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", 942 + "dependencies": [ 943 + "p-finally" 501 944 ] 502 945 }, 503 946 "p-timeout@6.1.4": { ··· 506 949 "p-try@2.2.0": { 507 950 "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 508 951 }, 952 + "parseurl@1.3.3": { 953 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 954 + }, 509 955 "path-exists@4.0.0": { 510 956 "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 511 957 }, 958 + "path-to-regexp@0.1.12": { 959 + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" 960 + }, 512 961 "pend@1.2.0": { 513 962 "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" 514 963 }, 964 + "pino-abstract-transport@1.2.0": { 965 + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", 966 + "dependencies": [ 967 + "readable-stream", 968 + "split2" 969 + ] 970 + }, 971 + "pino-std-serializers@6.2.2": { 972 + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" 973 + }, 974 + "pino@8.21.0": { 975 + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", 976 + "dependencies": [ 977 + "atomic-sleep", 978 + "fast-redact", 979 + "on-exit-leak-free", 980 + "pino-abstract-transport", 981 + "pino-std-serializers", 982 + "process-warning", 983 + "quick-format-unescaped", 984 + "real-require", 985 + "safe-stable-stringify", 986 + "sonic-boom", 987 + "thread-stream" 988 + ], 989 + "bin": true 990 + }, 515 991 "pkg-dir@4.2.0": { 516 992 "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 517 993 "dependencies": [ 518 994 "find-up" 519 995 ] 520 996 }, 997 + "process-warning@3.0.0": { 998 + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" 999 + }, 1000 + "process@0.11.10": { 1001 + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" 1002 + }, 1003 + "proxy-addr@2.0.7": { 1004 + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1005 + "dependencies": [ 1006 + "forwarded", 1007 + "ipaddr.js" 1008 + ] 1009 + }, 521 1010 "punycode@2.3.1": { 522 1011 "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" 523 1012 }, 1013 + "qs@6.14.1": { 1014 + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", 1015 + "dependencies": [ 1016 + "side-channel" 1017 + ] 1018 + }, 1019 + "quick-format-unescaped@4.0.4": { 1020 + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" 1021 + }, 1022 + "range-parser@1.2.1": { 1023 + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1024 + }, 1025 + "rate-limiter-flexible@2.4.2": { 1026 + "integrity": "sha512-rMATGGOdO1suFyf/mI5LYhts71g1sbdhmd6YvdiXO2gJnd42Tt6QS4JUKJKSWVVkMtBacm6l40FR7Trjo6Iruw==" 1027 + }, 524 1028 "rate-limiter-flexible@9.1.0": { 525 1029 "integrity": "sha512-0jjTtKWlF4UnMLr64chsKfyQsRlT3lc6KXK2B+N8wPkw2+QMbYN6ft4jNnZuHfllKpk3R5Vr4g7EM+Ms8H1aBw==" 526 1030 }, 1031 + "raw-body@2.5.3": { 1032 + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", 1033 + "dependencies": [ 1034 + "bytes", 1035 + "http-errors", 1036 + "iconv-lite", 1037 + "unpipe" 1038 + ] 1039 + }, 1040 + "readable-stream@4.7.0": { 1041 + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", 1042 + "dependencies": [ 1043 + "abort-controller", 1044 + "buffer", 1045 + "events", 1046 + "process", 1047 + "string_decoder" 1048 + ] 1049 + }, 1050 + "real-require@0.2.0": { 1051 + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" 1052 + }, 1053 + "safe-buffer@5.2.1": { 1054 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1055 + }, 1056 + "safe-stable-stringify@2.5.0": { 1057 + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==" 1058 + }, 1059 + "safer-buffer@2.1.2": { 1060 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1061 + }, 527 1062 "semver@6.3.1": { 528 1063 "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 529 1064 "bin": true ··· 532 1067 "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 533 1068 "bin": true 534 1069 }, 1070 + "send@0.19.2": { 1071 + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", 1072 + "dependencies": [ 1073 + "debug@2.6.9", 1074 + "depd", 1075 + "destroy", 1076 + "encodeurl", 1077 + "escape-html", 1078 + "etag", 1079 + "fresh", 1080 + "http-errors", 1081 + "mime", 1082 + "ms@2.1.3", 1083 + "on-finished", 1084 + "range-parser", 1085 + "statuses" 1086 + ] 1087 + }, 1088 + "serve-static@1.16.3": { 1089 + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", 1090 + "dependencies": [ 1091 + "encodeurl", 1092 + "escape-html", 1093 + "parseurl", 1094 + "send" 1095 + ] 1096 + }, 1097 + "setprototypeof@1.2.0": { 1098 + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1099 + }, 1100 + "side-channel-list@1.0.0": { 1101 + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 1102 + "dependencies": [ 1103 + "es-errors", 1104 + "object-inspect" 1105 + ] 1106 + }, 1107 + "side-channel-map@1.0.1": { 1108 + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 1109 + "dependencies": [ 1110 + "call-bound", 1111 + "es-errors", 1112 + "get-intrinsic", 1113 + "object-inspect" 1114 + ] 1115 + }, 1116 + "side-channel-weakmap@1.0.2": { 1117 + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 1118 + "dependencies": [ 1119 + "call-bound", 1120 + "es-errors", 1121 + "get-intrinsic", 1122 + "object-inspect", 1123 + "side-channel-map" 1124 + ] 1125 + }, 1126 + "side-channel@1.1.0": { 1127 + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 1128 + "dependencies": [ 1129 + "es-errors", 1130 + "object-inspect", 1131 + "side-channel-list", 1132 + "side-channel-map", 1133 + "side-channel-weakmap" 1134 + ] 1135 + }, 535 1136 "sift@17.1.3": { 536 1137 "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" 537 1138 }, 1139 + "sonic-boom@3.8.1": { 1140 + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", 1141 + "dependencies": [ 1142 + "atomic-sleep" 1143 + ] 1144 + }, 538 1145 "sparse-bitfield@3.0.3": { 539 1146 "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 540 1147 "dependencies": [ 541 1148 "memory-pager" 542 1149 ] 543 1150 }, 1151 + "split2@4.2.0": { 1152 + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" 1153 + }, 1154 + "statuses@2.0.2": { 1155 + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" 1156 + }, 544 1157 "streamx@2.23.0": { 545 1158 "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", 546 1159 "dependencies": [ 547 1160 "events-universal", 548 1161 "fast-fifo", 549 1162 "text-decoder" 1163 + ] 1164 + }, 1165 + "string_decoder@1.3.0": { 1166 + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1167 + "dependencies": [ 1168 + "safe-buffer" 550 1169 ] 551 1170 }, 552 1171 "structured-headers@2.0.2": { ··· 566 1185 "b4a" 567 1186 ] 568 1187 }, 1188 + "thread-stream@2.7.0": { 1189 + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", 1190 + "dependencies": [ 1191 + "real-require" 1192 + ] 1193 + }, 569 1194 "tlds@1.260.0": { 570 1195 "integrity": "sha512-78+28EWBhCEE7qlyaHA9OR3IPvbCLiDh3Ckla593TksfFc9vfTsgvH7eS+dr3o9qr31gwGbogcI16yN91PoRjQ==", 571 1196 "bin": true 572 1197 }, 1198 + "toidentifier@1.0.1": { 1199 + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1200 + }, 573 1201 "tr46@5.1.1": { 574 1202 "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", 575 1203 "dependencies": [ ··· 579 1207 "tslib@2.8.1": { 580 1208 "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 581 1209 }, 1210 + "type-is@1.6.18": { 1211 + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1212 + "dependencies": [ 1213 + "media-typer", 1214 + "mime-types" 1215 + ] 1216 + }, 582 1217 "uint8arrays@3.0.0": { 583 1218 "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 584 1219 "dependencies": [ ··· 588 1223 "undici-types@7.8.0": { 589 1224 "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==" 590 1225 }, 1226 + "unicode-segmenter@0.14.5": { 1227 + "integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==" 1228 + }, 1229 + "unpipe@1.0.0": { 1230 + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1231 + }, 1232 + "utils-merge@1.0.1": { 1233 + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1234 + }, 1235 + "varint@6.0.0": { 1236 + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" 1237 + }, 1238 + "vary@1.1.2": { 1239 + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1240 + }, 591 1241 "webidl-conversions@7.0.0": { 592 1242 "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" 593 1243 }, ··· 597 1247 "tr46", 598 1248 "webidl-conversions" 599 1249 ] 1250 + }, 1251 + "ws@8.19.0": { 1252 + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==" 600 1253 }, 601 1254 "yauzl@3.2.0": { 602 1255 "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==",
+83
tests/stories_test.ts
··· 1 + import { assertEquals } from "@std/assert"; 2 + import { createTestContext, TEST_USERS } from "./util.ts"; 3 + 4 + Deno.test({ 5 + name: "Stories", 6 + sanitizeOps: false, 7 + sanitizeResources: false, 8 + fn: async (t) => { 9 + await t.step( 10 + "getStories excludes archived and expired stories", 11 + async () => { 12 + const { ctx, cleanup } = await createTestContext({ 13 + actors: false, 14 + profiles: false, 15 + posts: false, 16 + replies: false, 17 + stories: true, 18 + likes: false, 19 + reposts: false, 20 + follows: false, 21 + blocks: false, 22 + audio: false, 23 + generators: false, 24 + preferences: false, 25 + records: false, 26 + actorSync: false, 27 + }); 28 + 29 + try { 30 + const archivedUri = `at://${TEST_USERS[0].did}/app.sprk.story/story1`; 31 + const expiredUri = `at://${TEST_USERS[2].did}/app.sprk.story/story2`; 32 + const activeUri = `at://${TEST_USERS[1].did}/app.sprk.story/story3`; 33 + 34 + await ctx.db.models.Story.findOneAndUpdate( 35 + { uri: archivedUri }, 36 + { archived: true }, 37 + ); 38 + 39 + const expiredDate = new Date(); 40 + expiredDate.setHours(expiredDate.getHours() - 25); 41 + await ctx.db.models.Story.findOneAndUpdate( 42 + { uri: expiredUri }, 43 + { indexedAt: expiredDate.toISOString() }, 44 + ); 45 + 46 + await ctx.db.models.Story.create({ 47 + uri: activeUri, 48 + cid: "bafyreihivhfhv6rh4x4a4znkqrvqwp5xw4xvqjqstory3", 49 + authorDid: TEST_USERS[1].did, 50 + createdAt: new Date().toISOString(), 51 + indexedAt: new Date().toISOString(), 52 + media: { 53 + $type: "app.sprk.story#imageMedia", 54 + image: { 55 + $type: "blob", 56 + ref: { 57 + $link: "bafyreihivhfhv6rh4x4a4znkqrvqwp5xw4xvqjqstoryimg3", 58 + }, 59 + alt: "Active story image", 60 + aspectRatio: { width: 1080, height: 1920 }, 61 + mimeType: "image/jpeg", 62 + size: 250000, 63 + }, 64 + }, 65 + labels: [], 66 + }); 67 + 68 + const stories = await ctx.dataplane.stories.getStories([ 69 + archivedUri, 70 + expiredUri, 71 + activeUri, 72 + ]); 73 + 74 + assertEquals(stories.length, 1); 75 + assertEquals(stories[0].uri, activeUri); 76 + assertEquals(stories[0].archived, false); 77 + } finally { 78 + await cleanup(); 79 + } 80 + }, 81 + ); 82 + }, 83 + });