A community based topic aggregation platform built on atproto
1package aggregators
2
3import "time"
4
5// Aggregator represents a service declaration record indexed from the firehose
6// Aggregators are autonomous services that can post content to communities after authorization
7// Following Bluesky's pattern: app.bsky.feed.generator and app.bsky.labeler.service
8type Aggregator struct {
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"`
22}
23
24// Authorization represents a community's authorization for an aggregator
25// Stored in community's repository: at://community_did/social.coves.aggregator.authorization/{rkey}
26type Authorization struct {
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"`
39}
40
41// AggregatorPost represents tracking of posts created by aggregators
42// AppView-only table for rate limiting and statistics
43type AggregatorPost struct {
44 CreatedAt time.Time `json:"createdAt" db:"created_at"`
45 AggregatorDID string `json:"aggregatorDid" db:"aggregator_did"`
46 CommunityDID string `json:"communityDid" db:"community_did"`
47 PostURI string `json:"postUri" db:"post_uri"`
48 PostCID string `json:"postCid" db:"post_cid"`
49 ID int `json:"id" db:"id"`
50}
51
52// EnableAggregatorRequest represents input for enabling an aggregator in a community
53type EnableAggregatorRequest struct {
54 CommunityDID string `json:"communityDid"` // Which community (resolved from identifier)
55 AggregatorDID string `json:"aggregatorDid"` // Which aggregator
56 Config map[string]interface{} `json:"config,omitempty"` // Aggregator-specific configuration
57 EnabledByDID string `json:"enabledByDid"` // Moderator making the change (from JWT)
58 EnabledByToken string `json:"-"` // User's access token for PDS write
59}
60
61// DisableAggregatorRequest represents input for disabling an aggregator
62type DisableAggregatorRequest struct {
63 CommunityDID string `json:"communityDid"` // Which community (resolved from identifier)
64 AggregatorDID string `json:"aggregatorDid"` // Which aggregator
65 DisabledByDID string `json:"disabledByDid"` // Moderator making the change (from JWT)
66 DisabledByToken string `json:"-"` // User's access token for PDS write
67}
68
69// UpdateConfigRequest represents input for updating an aggregator's configuration
70type UpdateConfigRequest struct {
71 CommunityDID string `json:"communityDid"` // Which community (resolved from identifier)
72 AggregatorDID string `json:"aggregatorDid"` // Which aggregator
73 Config map[string]interface{} `json:"config"` // New configuration
74 UpdatedByDID string `json:"updatedByDid"` // Moderator making the change (from JWT)
75 UpdatedByToken string `json:"-"` // User's access token for PDS write
76}
77
78// GetServicesRequest represents query parameters for fetching aggregator details
79type GetServicesRequest struct {
80 DIDs []string `json:"dids"` // List of aggregator DIDs to fetch
81}
82
83// GetAuthorizationsRequest represents query parameters for listing authorizations
84type GetAuthorizationsRequest struct {
85 AggregatorDID string `json:"aggregatorDid"` // Which aggregator
86 EnabledOnly bool `json:"enabledOnly,omitempty"` // Only return enabled authorizations
87 Limit int `json:"limit"`
88 Offset int `json:"offset"`
89}
90
91// ListForCommunityRequest represents query parameters for listing aggregators for a community
92type ListForCommunityRequest struct {
93 CommunityDID string `json:"communityDid"` // Which community (resolved from identifier)
94 EnabledOnly bool `json:"enabledOnly,omitempty"` // Only return enabled aggregators
95 Limit int `json:"limit"`
96 Offset int `json:"offset"`
97}