···
// Aggregators are autonomous services that can post content to communities after authorization
// Following Bluesky's pattern: app.bsky.feed.generator and app.bsky.labeler.service
9
-
DID string `json:"did" db:"did"` // Aggregator's DID (primary key)
10
-
DisplayName string `json:"displayName" db:"display_name"` // Human-readable name
11
-
Description string `json:"description,omitempty" db:"description"` // What the aggregator does
12
-
AvatarURL string `json:"avatarUrl,omitempty" db:"avatar_url"` // Optional avatar image URL
13
-
ConfigSchema []byte `json:"configSchema,omitempty" db:"config_schema"` // JSON Schema for configuration (JSONB)
14
-
MaintainerDID string `json:"maintainerDid,omitempty" db:"maintainer_did"` // Contact for support/issues
15
-
SourceURL string `json:"sourceUrl,omitempty" db:"source_url"` // Source code URL (transparency)
16
-
CommunitiesUsing int `json:"communitiesUsing" db:"communities_using"` // Auto-updated by trigger
17
-
PostsCreated int `json:"postsCreated" db:"posts_created"` // Auto-updated by trigger
18
-
CreatedAt time.Time `json:"createdAt" db:"created_at"` // When aggregator was created (from lexicon)
19
-
IndexedAt time.Time `json:"indexedAt" db:"indexed_at"` // When we indexed this record
20
-
RecordURI string `json:"recordUri,omitempty" db:"record_uri"` // at://did/social.coves.aggregator.service/self
21
-
RecordCID string `json:"recordCid,omitempty" db:"record_cid"` // Content hash
9
+
CreatedAt time.Time `json:"createdAt" db:"created_at"`
10
+
IndexedAt time.Time `json:"indexedAt" db:"indexed_at"`
11
+
AvatarURL string `json:"avatarUrl,omitempty" db:"avatar_url"`
12
+
DID string `json:"did" db:"did"`
13
+
MaintainerDID string `json:"maintainerDid,omitempty" db:"maintainer_did"`
14
+
SourceURL string `json:"sourceUrl,omitempty" db:"source_url"`
15
+
Description string `json:"description,omitempty" db:"description"`
16
+
DisplayName string `json:"displayName" db:"display_name"`
17
+
RecordURI string `json:"recordUri,omitempty" db:"record_uri"`
18
+
RecordCID string `json:"recordCid,omitempty" db:"record_cid"`
19
+
ConfigSchema []byte `json:"configSchema,omitempty" db:"config_schema"`
20
+
CommunitiesUsing int `json:"communitiesUsing" db:"communities_using"`
21
+
PostsCreated int `json:"postsCreated" db:"posts_created"`
// Authorization represents a community's authorization for an aggregator
// Stored in community's repository: at://community_did/social.coves.aggregator.authorization/{rkey}
type Authorization struct {
27
-
ID int `json:"id" db:"id"` // Database ID
28
-
AggregatorDID string `json:"aggregatorDid" db:"aggregator_did"` // Which aggregator
29
-
CommunityDID string `json:"communityDid" db:"community_did"` // Which community
30
-
Enabled bool `json:"enabled" db:"enabled"` // Current status
31
-
Config []byte `json:"config,omitempty" db:"config"` // Aggregator-specific config (JSONB)
32
-
CreatedBy string `json:"createdBy,omitempty" db:"created_by"` // Moderator DID who enabled it
33
-
DisabledBy string `json:"disabledBy,omitempty" db:"disabled_by"` // Moderator DID who disabled it
34
-
CreatedAt time.Time `json:"createdAt" db:"created_at"` // When authorization was created
35
-
DisabledAt *time.Time `json:"disabledAt,omitempty" db:"disabled_at"` // When authorization was disabled (for modlog/audit)
36
-
IndexedAt time.Time `json:"indexedAt" db:"indexed_at"` // When we indexed this record
37
-
RecordURI string `json:"recordUri,omitempty" db:"record_uri"` // at://community_did/social.coves.aggregator.authorization/{rkey}
38
-
RecordCID string `json:"recordCid,omitempty" db:"record_cid"` // Content hash
27
+
CreatedAt time.Time `json:"createdAt" db:"created_at"`
28
+
IndexedAt time.Time `json:"indexedAt" db:"indexed_at"`
29
+
DisabledAt *time.Time `json:"disabledAt,omitempty" db:"disabled_at"`
30
+
AggregatorDID string `json:"aggregatorDid" db:"aggregator_did"`
31
+
CommunityDID string `json:"communityDid" db:"community_did"`
32
+
CreatedBy string `json:"createdBy,omitempty" db:"created_by"`
33
+
DisabledBy string `json:"disabledBy,omitempty" db:"disabled_by"`
34
+
RecordURI string `json:"recordUri,omitempty" db:"record_uri"`
35
+
RecordCID string `json:"recordCid,omitempty" db:"record_cid"`
36
+
Config []byte `json:"config,omitempty" db:"config"`
37
+
ID int `json:"id" db:"id"`
38
+
Enabled bool `json:"enabled" db:"enabled"`
// AggregatorPost represents tracking of posts created by aggregators
// AppView-only table for rate limiting and statistics
type AggregatorPost struct {
44
-
ID int `json:"id" db:"id"`
44
+
CreatedAt time.Time `json:"createdAt" db:"created_at"`
AggregatorDID string `json:"aggregatorDid" db:"aggregator_did"`
CommunityDID string `json:"communityDid" db:"community_did"`
PostURI string `json:"postUri" db:"post_uri"`
PostCID string `json:"postCid" db:"post_cid"`
49
-
CreatedAt time.Time `json:"createdAt" db:"created_at"`
49
+
ID int `json:"id" db:"id"`
// EnableAggregatorRequest represents input for enabling an aggregator in a community