[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.

use indexedAt as sort method

+26 -26
+15 -15
data-plane/db/pagination.ts
··· 127 127 } 128 128 } 129 129 130 - type SortedAtCidResult = { sortAt?: string; cid: string }; 130 + type IndexedAtCidResult = { indexedAt?: string; cid: string }; 131 131 type TimeCidLabeledResult = KeysetCursor; 132 132 133 133 export class TimeCidKeyset< 134 - TimeCidResult = SortedAtCidResult, 134 + TimeCidResult = IndexedAtCidResult, 135 135 > extends GenericKeyset<TimeCidResult, TimeCidLabeledResult> { 136 136 constructor() { 137 - super("sortAt", "cid"); 137 + super("indexedAt", "cid"); 138 138 } 139 139 140 140 labelResult(result: TimeCidResult): TimeCidLabeledResult; 141 - labelResult<TimeCidResult extends SortedAtCidResult>(result: TimeCidResult) { 142 - // Use current time as fallback if sortAt is missing 143 - const sortAt = result.sortAt || new Date().toISOString(); 144 - return { primary: sortAt, secondary: result.cid }; 141 + labelResult<TimeCidResult extends IndexedAtCidResult>(result: TimeCidResult) { 142 + // Use current time as fallback if indexedAt is missing 143 + const indexedAt = result.indexedAt || new Date().toISOString(); 144 + return { primary: indexedAt, secondary: result.cid }; 145 145 } 146 146 labeledResultToCursor(labeled: TimeCidLabeledResult) { 147 147 const timestamp = new Date(labeled.primary).getTime(); ··· 307 307 } 308 308 } 309 309 310 - type SortAtResult = { sortAt: string }; 310 + type IndexedAtResult = { indexedAt: string }; 311 311 type TimeLabeledResult = SingleKeyCursor; 312 312 313 - export class IsoTimeKey<TimeResult = SortAtResult> extends GenericSingleKey< 313 + export class IsoTimeKey<TimeResult = IndexedAtResult> extends GenericSingleKey< 314 314 TimeResult, 315 315 TimeLabeledResult 316 316 > { 317 317 constructor() { 318 - super("sortAt"); 318 + super("indexedAt"); 319 319 } 320 320 321 321 labelResult(result: TimeResult): TimeLabeledResult; 322 - labelResult<TimeResult extends SortAtResult>(result: TimeResult) { 323 - return { primary: result.sortAt }; 322 + labelResult<TimeResult extends IndexedAtResult>(result: TimeResult) { 323 + return { primary: result.indexedAt }; 324 324 } 325 325 labeledResultToCursor(labeled: TimeLabeledResult) { 326 326 const primaryDate = new Date(labeled.primary); ··· 343 343 } 344 344 345 345 export class IsoSortAtKey extends IsoTimeKey<{ 346 - sortAt: string; 346 + indexedAt: string; 347 347 }> { 348 348 constructor() { 349 349 super(); 350 350 } 351 351 352 - override labelResult(result: { sortAt: string }) { 353 - return { primary: result.sortAt }; 352 + override labelResult(result: { indexedAt: string }) { 353 + return { primary: result.indexedAt }; 354 354 } 355 355 } 356 356
+1 -1
data-plane/routes/feeds.ts
··· 1 1 import { Database } from "../db/index.ts"; 2 2 import { TimeCidKeyset } from "../db/pagination.ts"; 3 - import { compositeTime } from "./records.ts"; 3 + import { compositeTime } from "../util.ts"; 4 4 5 5 // Helper function to format feed items 6 6 function feedItemFromRow(
+1 -8
data-plane/routes/records.ts
··· 2 2 import { AtUri } from "@atp/syntax"; 3 3 import { ids } from "../../lex/lexicons.ts"; 4 4 import { keyBy } from "@atp/common"; 5 - import { Code, DataPlaneError } from "../util.ts"; 5 + import { Code, DataPlaneError, compositeTime } from "../util.ts"; 6 6 7 7 export type Record = { 8 8 record: string; ··· 96 96 ]); 97 97 98 98 return { records }; 99 - } 100 - 101 - // Helper function for composite time 102 - export function compositeTime(ts1?: string, ts2?: string): string | undefined { 103 - if (!ts1) return ts2; 104 - if (!ts2) return ts1; 105 - return new Date(ts1) < new Date(ts2) ? ts1 : ts2; 106 99 } 107 100 108 101 export class Records {
+1 -1
data-plane/routes/search.ts
··· 1 1 import { Database } from "../db/index.ts"; 2 2 import { IndexedAtDidKeyset, TimeCidKeyset } from "../db/pagination.ts"; 3 3 import { parsePostSearchQuery } from "../util.ts"; 4 - import { compositeTime } from "./records.ts"; 4 + import { compositeTime } from "../util.ts"; 5 5 6 6 // Remove leading @ in case a handle is input that way 7 7 const cleanQuery = (query: string) => query.trim().replace(/^@/g, "");
+1 -1
data-plane/routes/stories.ts
··· 1 1 import { Database } from "../db/index.ts"; 2 2 import { TimeCidKeyset } from "../db/pagination.ts"; 3 - import { compositeTime } from "./records.ts"; 3 + import { compositeTime } from "../util.ts"; 4 4 5 5 const STORIES_EXPIRY_HOURS = 24; 6 6
+7
data-plane/util.ts
··· 281 281 author, 282 282 }; 283 283 }; 284 + 285 + // Helper function for composite time 286 + export function compositeTime(ts1?: string, ts2?: string): string | undefined { 287 + if (!ts1) return ts2; 288 + if (!ts2) return ts1; 289 + return new Date(ts1) < new Date(ts2) ? ts1 : ts2; 290 + }