a love letter to tangled (android, iOS, and a search API)
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}