A community based topic aggregation platform built on atproto
1package communities 2 3import "context" 4 5// Repository defines the interface for community data persistence 6// This is the AppView's indexed view of communities from the firehose 7type Repository interface { 8 // Community CRUD 9 Create(ctx context.Context, community *Community) (*Community, error) 10 GetByDID(ctx context.Context, did string) (*Community, error) 11 GetByHandle(ctx context.Context, handle string) (*Community, error) 12 Update(ctx context.Context, community *Community) (*Community, error) 13 Delete(ctx context.Context, did string) error 14 15 // Listing & Search 16 List(ctx context.Context, req ListCommunitiesRequest) ([]*Community, int, error) // Returns communities + total count 17 Search(ctx context.Context, req SearchCommunitiesRequest) ([]*Community, int, error) 18 19 // Subscriptions (lightweight feed follows) 20 Subscribe(ctx context.Context, subscription *Subscription) (*Subscription, error) 21 SubscribeWithCount(ctx context.Context, subscription *Subscription) (*Subscription, error) // Atomic: subscribe + increment count 22 Unsubscribe(ctx context.Context, userDID, communityDID string) error 23 UnsubscribeWithCount(ctx context.Context, userDID, communityDID string) error // Atomic: unsubscribe + decrement count 24 GetSubscription(ctx context.Context, userDID, communityDID string) (*Subscription, error) 25 GetSubscriptionByURI(ctx context.Context, recordURI string) (*Subscription, error) // For Jetstream delete operations 26 ListSubscriptions(ctx context.Context, userDID string, limit, offset int) ([]*Subscription, error) 27 ListSubscribers(ctx context.Context, communityDID string, limit, offset int) ([]*Subscription, error) 28 29 // Community Blocks 30 BlockCommunity(ctx context.Context, block *CommunityBlock) (*CommunityBlock, error) 31 UnblockCommunity(ctx context.Context, userDID, communityDID string) error 32 GetBlock(ctx context.Context, userDID, communityDID string) (*CommunityBlock, error) 33 GetBlockByURI(ctx context.Context, recordURI string) (*CommunityBlock, error) // For Jetstream delete operations 34 ListBlockedCommunities(ctx context.Context, userDID string, limit, offset int) ([]*CommunityBlock, error) 35 IsBlocked(ctx context.Context, userDID, communityDID string) (bool, error) 36 37 // Memberships (active participation with reputation) 38 CreateMembership(ctx context.Context, membership *Membership) (*Membership, error) 39 GetMembership(ctx context.Context, userDID, communityDID string) (*Membership, error) 40 UpdateMembership(ctx context.Context, membership *Membership) (*Membership, error) 41 ListMembers(ctx context.Context, communityDID string, limit, offset int) ([]*Membership, error) 42 43 // Moderation (V2 feature, prepared interface) 44 CreateModerationAction(ctx context.Context, action *ModerationAction) (*ModerationAction, error) 45 ListModerationActions(ctx context.Context, communityDID string, limit, offset int) ([]*ModerationAction, error) 46 47 // Statistics 48 IncrementMemberCount(ctx context.Context, communityDID string) error 49 DecrementMemberCount(ctx context.Context, communityDID string) error 50 IncrementSubscriberCount(ctx context.Context, communityDID string) error 51 DecrementSubscriberCount(ctx context.Context, communityDID string) error 52 IncrementPostCount(ctx context.Context, communityDID string) error 53} 54 55// Service defines the interface for community business logic 56// Coordinates between Repository and external services (PDS, identity, etc.) 57type Service interface { 58 // Community operations (write-forward pattern: Service -> PDS -> Firehose -> Consumer -> Repository) 59 CreateCommunity(ctx context.Context, req CreateCommunityRequest) (*Community, error) 60 GetCommunity(ctx context.Context, identifier string) (*Community, error) // identifier can be DID or handle 61 UpdateCommunity(ctx context.Context, req UpdateCommunityRequest) (*Community, error) 62 ListCommunities(ctx context.Context, req ListCommunitiesRequest) ([]*Community, int, error) 63 SearchCommunities(ctx context.Context, req SearchCommunitiesRequest) ([]*Community, int, error) 64 65 // Subscription operations (write-forward: creates record in user's PDS) 66 SubscribeToCommunity(ctx context.Context, userDID, userAccessToken, communityIdentifier string, contentVisibility int) (*Subscription, error) 67 UnsubscribeFromCommunity(ctx context.Context, userDID, userAccessToken, communityIdentifier string) error 68 GetUserSubscriptions(ctx context.Context, userDID string, limit, offset int) ([]*Subscription, error) 69 GetCommunitySubscribers(ctx context.Context, communityIdentifier string, limit, offset int) ([]*Subscription, error) 70 71 // Block operations (write-forward: creates record in user's PDS) 72 BlockCommunity(ctx context.Context, userDID, userAccessToken, communityIdentifier string) (*CommunityBlock, error) 73 UnblockCommunity(ctx context.Context, userDID, userAccessToken, communityIdentifier string) error 74 GetBlockedCommunities(ctx context.Context, userDID string, limit, offset int) ([]*CommunityBlock, error) 75 IsBlocked(ctx context.Context, userDID, communityIdentifier string) (bool, error) 76 77 // Membership operations (indexed from firehose, reputation managed internally) 78 GetMembership(ctx context.Context, userDID, communityIdentifier string) (*Membership, error) 79 ListCommunityMembers(ctx context.Context, communityIdentifier string, limit, offset int) ([]*Membership, error) 80 81 // Validation helpers 82 ValidateHandle(handle string) error 83 ResolveCommunityIdentifier(ctx context.Context, identifier string) (string, error) // Returns DID from handle or DID 84}