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 ListSubscriptions(ctx context.Context, userDID string, limit, offset int) ([]*Subscription, error)
26 ListSubscribers(ctx context.Context, communityDID string, limit, offset int) ([]*Subscription, error)
27
28 // Memberships (active participation with reputation)
29 CreateMembership(ctx context.Context, membership *Membership) (*Membership, error)
30 GetMembership(ctx context.Context, userDID, communityDID string) (*Membership, error)
31 UpdateMembership(ctx context.Context, membership *Membership) (*Membership, error)
32 ListMembers(ctx context.Context, communityDID string, limit, offset int) ([]*Membership, error)
33
34 // Moderation (V2 feature, prepared interface)
35 CreateModerationAction(ctx context.Context, action *ModerationAction) (*ModerationAction, error)
36 ListModerationActions(ctx context.Context, communityDID string, limit, offset int) ([]*ModerationAction, error)
37
38 // Statistics
39 IncrementMemberCount(ctx context.Context, communityDID string) error
40 DecrementMemberCount(ctx context.Context, communityDID string) error
41 IncrementSubscriberCount(ctx context.Context, communityDID string) error
42 DecrementSubscriberCount(ctx context.Context, communityDID string) error
43 IncrementPostCount(ctx context.Context, communityDID string) error
44}
45
46// Service defines the interface for community business logic
47// Coordinates between Repository and external services (PDS, identity, etc.)
48type Service interface {
49 // Community operations (write-forward pattern: Service -> PDS -> Firehose -> Consumer -> Repository)
50 CreateCommunity(ctx context.Context, req CreateCommunityRequest) (*Community, error)
51 GetCommunity(ctx context.Context, identifier string) (*Community, error) // identifier can be DID or handle
52 UpdateCommunity(ctx context.Context, req UpdateCommunityRequest) (*Community, error)
53 ListCommunities(ctx context.Context, req ListCommunitiesRequest) ([]*Community, int, error)
54 SearchCommunities(ctx context.Context, req SearchCommunitiesRequest) ([]*Community, int, error)
55
56 // Subscription operations (write-forward: creates record in user's PDS)
57 SubscribeToCommunity(ctx context.Context, userDID, communityIdentifier string) (*Subscription, error)
58 UnsubscribeFromCommunity(ctx context.Context, userDID, communityIdentifier string) error
59 GetUserSubscriptions(ctx context.Context, userDID string, limit, offset int) ([]*Subscription, error)
60 GetCommunitySubscribers(ctx context.Context, communityIdentifier string, limit, offset int) ([]*Subscription, error)
61
62 // Membership operations (indexed from firehose, reputation managed internally)
63 GetMembership(ctx context.Context, userDID, communityIdentifier string) (*Membership, error)
64 ListCommunityMembers(ctx context.Context, communityIdentifier string, limit, offset int) ([]*Membership, error)
65
66 // Validation helpers
67 ValidateHandle(handle string) error
68 ResolveCommunityIdentifier(ctx context.Context, identifier string) (string, error) // Returns DID from handle or DID
69}