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}