a love letter to tangled (android, iOS, and a search API)
at main 135 lines 4.3 kB view raw
1package store 2 3import "context" 4 5// Document is the denormalized search document stored in the database. 6type Document struct { 7 ID string 8 DID string 9 Collection string 10 RKey string 11 ATURI string 12 CID string 13 RecordType string 14 Title string 15 Body string 16 Summary string 17 RepoDID string 18 RepoName string 19 AuthorHandle string 20 TagsJSON string 21 Language string 22 CreatedAt string 23 UpdatedAt string 24 IndexedAt string 25 WebURL string 26 DeletedAt string 27} 28 29// SyncState tracks the Tap consumer cursor for resuming on restart. 30type SyncState struct { 31 ConsumerName string 32 Cursor string 33 HighWaterMark string 34 UpdatedAt string 35} 36 37// RecordState caches issue/PR open-closed-merged state. 38type RecordState struct { 39 SubjectURI string 40 State string 41 UpdatedAt string 42} 43 44// IndexingJob stores queued read-through indexing work fetched through the API. 45type IndexingJob struct { 46 DocumentID string 47 DID string 48 Collection string 49 RKey string 50 CID string 51 RecordJSON string 52 Source string 53 Attempts int 54 Status string 55 LastError string 56 ScheduledAt string 57 UpdatedAt string 58 LeaseOwner string 59 LeaseUntil string 60 CompletedAt string 61} 62 63// JetstreamEvent is a cached JetStream activity event. 64type JetstreamEvent struct { 65 ID int64 66 TimeUS int64 67 DID string 68 Kind string 69 Collection string 70 RKey string 71 Operation string 72 Payload string 73 ReceivedAt string 74} 75 76// JetstreamEventFilter scopes a ListJetstreamEvents query. 77type JetstreamEventFilter struct { 78 Collection string 79 DID string 80 Operation string 81 Limit int 82 Offset int 83} 84 85// IndexingJobInput is the payload used to enqueue or refresh an indexing job. 86type IndexingJobInput struct { 87 DocumentID string 88 DID string 89 Collection string 90 RKey string 91 CID string 92 RecordJSON string 93 Source string 94} 95 96// DocumentFilter scopes a ListDocuments query to a subset of documents. 97type DocumentFilter struct { 98 // filter by collection NSID 99 Collection string 100 // filter by author DID 101 DID string 102 // filter to a single document by stable ID 103 DocumentID string 104} 105 106// Store is the persistence interface for Twister. 107type Store interface { 108 UpsertDocument(ctx context.Context, doc *Document) error 109 GetDocument(ctx context.Context, id string) (*Document, error) 110 MarkDeleted(ctx context.Context, id string) error 111 ListDocuments(ctx context.Context, filter DocumentFilter) ([]*Document, error) 112 OptimizeSearchIndex(ctx context.Context) error 113 GetSyncState(ctx context.Context, consumer string) (*SyncState, error) 114 SetSyncState(ctx context.Context, consumer string, cursor string) error 115 UpdateRecordState(ctx context.Context, subjectURI string, state string) error 116 UpsertIdentityHandle(ctx context.Context, did, handle string, isActive bool, status string) error 117 GetIdentityHandle(ctx context.Context, did string) (string, error) 118 GetIndexingJob(ctx context.Context, documentID string) (*IndexingJob, error) 119 EnqueueIndexingJob(ctx context.Context, input IndexingJobInput) error 120 ClaimIndexingJob(ctx context.Context, workerID string, leaseUntil string) (*IndexingJob, error) 121 CompleteIndexingJob(ctx context.Context, documentID string) error 122 RetryIndexingJob(ctx context.Context, documentID string, nextScheduledAt string, lastError string) error 123 FailIndexingJob(ctx context.Context, documentID string, status string, lastError string) error 124 ListIndexingJobs(ctx context.Context, filter IndexingJobFilter) ([]*IndexingJob, error) 125 GetIndexingJobStats(ctx context.Context) (*IndexingJobStats, error) 126 AppendIndexingAudit(ctx context.Context, input IndexingAuditInput) error 127 ListIndexingAudit(ctx context.Context, filter IndexingAuditFilter) ([]*IndexingAuditEntry, error) 128 GetFollowSubjects(ctx context.Context, did string) ([]string, error) 129 GetRepoCollaborators(ctx context.Context, repoOwnerDID string) ([]string, error) 130 CountDocuments(ctx context.Context) (int64, error) 131 CountPendingIndexingJobs(ctx context.Context) (int64, error) 132 InsertJetstreamEvent(ctx context.Context, event *JetstreamEvent, maxEvents int) error 133 ListJetstreamEvents(ctx context.Context, filter JetstreamEventFilter) ([]*JetstreamEvent, error) 134 Ping(ctx context.Context) error 135}