A community based topic aggregation platform built on atproto
1package communities
2
3import (
4 "time"
5)
6
7// Community represents a Coves community indexed from the firehose
8// Communities are federated, instance-scoped forums built on atProto
9type Community struct {
10 CreatedAt time.Time `json:"createdAt" db:"created_at"`
11 UpdatedAt time.Time `json:"updatedAt" db:"updated_at"`
12 RecordURI string `json:"recordUri,omitempty" db:"record_uri"`
13 FederatedFrom string `json:"federatedFrom,omitempty" db:"federated_from"`
14 DisplayName string `json:"displayName" db:"display_name"`
15 Description string `json:"description" db:"description"`
16 PDSURL string `json:"-" db:"pds_url"`
17 AvatarCID string `json:"avatarCid,omitempty" db:"avatar_cid"`
18 BannerCID string `json:"bannerCid,omitempty" db:"banner_cid"`
19 OwnerDID string `json:"ownerDid" db:"owner_did"`
20 CreatedByDID string `json:"createdByDid" db:"created_by_did"`
21 HostedByDID string `json:"hostedByDid" db:"hosted_by_did"`
22 PDSEmail string `json:"-" db:"pds_email"`
23 PDSPassword string `json:"-" db:"pds_password_encrypted"`
24 Name string `json:"name" db:"name"`
25 RecordCID string `json:"recordCid,omitempty" db:"record_cid"`
26 FederatedID string `json:"federatedId,omitempty" db:"federated_id"`
27 PDSAccessToken string `json:"-" db:"pds_access_token"`
28 SigningKeyPEM string `json:"-" db:"signing_key_encrypted"`
29 ModerationType string `json:"moderationType,omitempty" db:"moderation_type"`
30 Handle string `json:"handle" db:"handle"`
31 PDSRefreshToken string `json:"-" db:"pds_refresh_token"`
32 Visibility string `json:"visibility" db:"visibility"`
33 RotationKeyPEM string `json:"-" db:"rotation_key_encrypted"`
34 DID string `json:"did" db:"did"`
35 ContentWarnings []string `json:"contentWarnings,omitempty" db:"content_warnings"`
36 DescriptionFacets []byte `json:"descriptionFacets,omitempty" db:"description_facets"`
37 PostCount int `json:"postCount" db:"post_count"`
38 SubscriberCount int `json:"subscriberCount" db:"subscriber_count"`
39 MemberCount int `json:"memberCount" db:"member_count"`
40 ID int `json:"id" db:"id"`
41 AllowExternalDiscovery bool `json:"allowExternalDiscovery" db:"allow_external_discovery"`
42}
43
44// Subscription represents a lightweight feed follow (user subscribes to see posts)
45type Subscription struct {
46 SubscribedAt time.Time `json:"subscribedAt" db:"subscribed_at"`
47 UserDID string `json:"userDid" db:"user_did"`
48 CommunityDID string `json:"communityDid" db:"community_did"`
49 RecordURI string `json:"recordUri,omitempty" db:"record_uri"`
50 RecordCID string `json:"recordCid,omitempty" db:"record_cid"`
51 ContentVisibility int `json:"contentVisibility" db:"content_visibility"` // Feed slider: 1-5 (1=best content only, 5=all content)
52 ID int `json:"id" db:"id"`
53}
54
55// CommunityBlock represents a user blocking a community
56// Block records live in the user's repository (at://user_did/social.coves.community.block/{rkey})
57type CommunityBlock struct {
58 BlockedAt time.Time `json:"blockedAt" db:"blocked_at"`
59 UserDID string `json:"userDid" db:"user_did"`
60 CommunityDID string `json:"communityDid" db:"community_did"`
61 RecordURI string `json:"recordUri,omitempty" db:"record_uri"`
62 RecordCID string `json:"recordCid,omitempty" db:"record_cid"`
63 ID int `json:"id" db:"id"`
64}
65
66// Membership represents active participation with reputation tracking
67type Membership struct {
68 JoinedAt time.Time `json:"joinedAt" db:"joined_at"`
69 LastActiveAt time.Time `json:"lastActiveAt" db:"last_active_at"`
70 UserDID string `json:"userDid" db:"user_did"`
71 CommunityDID string `json:"communityDid" db:"community_did"`
72 ID int `json:"id" db:"id"`
73 ReputationScore int `json:"reputationScore" db:"reputation_score"`
74 ContributionCount int `json:"contributionCount" db:"contribution_count"`
75 IsBanned bool `json:"isBanned" db:"is_banned"`
76 IsModerator bool `json:"isModerator" db:"is_moderator"`
77}
78
79// ModerationAction represents a moderation action taken against a community
80type ModerationAction struct {
81 CreatedAt time.Time `json:"createdAt" db:"created_at"`
82 ExpiresAt *time.Time `json:"expiresAt,omitempty" db:"expires_at"`
83 CommunityDID string `json:"communityDid" db:"community_did"`
84 Action string `json:"action" db:"action"`
85 Reason string `json:"reason,omitempty" db:"reason"`
86 InstanceDID string `json:"instanceDid" db:"instance_did"`
87 ID int `json:"id" db:"id"`
88 Broadcast bool `json:"broadcast" db:"broadcast"`
89}
90
91// CreateCommunityRequest represents input for creating a new community
92type CreateCommunityRequest struct {
93 Name string `json:"name"`
94 DisplayName string `json:"displayName,omitempty"`
95 Description string `json:"description"`
96 Language string `json:"language,omitempty"`
97 Visibility string `json:"visibility"`
98 CreatedByDID string `json:"createdByDid"`
99 HostedByDID string `json:"hostedByDid"`
100 AvatarBlob []byte `json:"avatarBlob,omitempty"`
101 BannerBlob []byte `json:"bannerBlob,omitempty"`
102 Rules []string `json:"rules,omitempty"`
103 Categories []string `json:"categories,omitempty"`
104 AllowExternalDiscovery bool `json:"allowExternalDiscovery"`
105}
106
107// UpdateCommunityRequest represents input for updating community metadata
108type UpdateCommunityRequest struct {
109 CommunityDID string `json:"communityDid"`
110 UpdatedByDID string `json:"updatedByDid"` // User making the update (for authorization)
111 DisplayName *string `json:"displayName,omitempty"`
112 Description *string `json:"description,omitempty"`
113 AvatarBlob []byte `json:"avatarBlob,omitempty"`
114 BannerBlob []byte `json:"bannerBlob,omitempty"`
115 Visibility *string `json:"visibility,omitempty"`
116 AllowExternalDiscovery *bool `json:"allowExternalDiscovery,omitempty"`
117 ModerationType *string `json:"moderationType,omitempty"`
118 ContentWarnings []string `json:"contentWarnings,omitempty"`
119}
120
121// ListCommunitiesRequest represents query parameters for listing communities
122type ListCommunitiesRequest struct {
123 Visibility string `json:"visibility,omitempty"`
124 HostedBy string `json:"hostedBy,omitempty"`
125 SortBy string `json:"sortBy,omitempty"`
126 SortOrder string `json:"sortOrder,omitempty"`
127 Limit int `json:"limit"`
128 Offset int `json:"offset"`
129}
130
131// SearchCommunitiesRequest represents query parameters for searching communities
132type SearchCommunitiesRequest struct {
133 Query string `json:"query"`
134 Visibility string `json:"visibility,omitempty"`
135 Limit int `json:"limit"`
136 Offset int `json:"offset"`
137}