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 // Credential Management (for token refresh)
16 UpdateCredentials(ctx context.Context, did, accessToken, refreshToken string) error
17
18 // Listing & Search
19 List(ctx context.Context, req ListCommunitiesRequest) ([]*Community, error)
20 Search(ctx context.Context, req SearchCommunitiesRequest) ([]*Community, int, error)
21
22 // Subscriptions (lightweight feed follows)
23 Subscribe(ctx context.Context, subscription *Subscription) (*Subscription, error)
24 SubscribeWithCount(ctx context.Context, subscription *Subscription) (*Subscription, error) // Atomic: subscribe + increment count
25 Unsubscribe(ctx context.Context, userDID, communityDID string) error
26 UnsubscribeWithCount(ctx context.Context, userDID, communityDID string) error // Atomic: unsubscribe + decrement count
27 GetSubscription(ctx context.Context, userDID, communityDID string) (*Subscription, error)
28 GetSubscriptionByURI(ctx context.Context, recordURI string) (*Subscription, error) // For Jetstream delete operations
29 ListSubscriptions(ctx context.Context, userDID string, limit, offset int) ([]*Subscription, error)
30 ListSubscribers(ctx context.Context, communityDID string, limit, offset int) ([]*Subscription, error)
31
32 // Community Blocks
33 BlockCommunity(ctx context.Context, block *CommunityBlock) (*CommunityBlock, error)
34 UnblockCommunity(ctx context.Context, userDID, communityDID string) error
35 GetBlock(ctx context.Context, userDID, communityDID string) (*CommunityBlock, error)
36 GetBlockByURI(ctx context.Context, recordURI string) (*CommunityBlock, error) // For Jetstream delete operations
37 ListBlockedCommunities(ctx context.Context, userDID string, limit, offset int) ([]*CommunityBlock, error)
38 IsBlocked(ctx context.Context, userDID, communityDID string) (bool, error)
39
40 // Memberships (active participation with reputation)
41 CreateMembership(ctx context.Context, membership *Membership) (*Membership, error)
42 GetMembership(ctx context.Context, userDID, communityDID string) (*Membership, error)
43 UpdateMembership(ctx context.Context, membership *Membership) (*Membership, error)
44 ListMembers(ctx context.Context, communityDID string, limit, offset int) ([]*Membership, error)
45
46 // Moderation (V2 feature, prepared interface)
47 CreateModerationAction(ctx context.Context, action *ModerationAction) (*ModerationAction, error)
48 ListModerationActions(ctx context.Context, communityDID string, limit, offset int) ([]*ModerationAction, error)
49
50 // Statistics
51 IncrementMemberCount(ctx context.Context, communityDID string) error
52 DecrementMemberCount(ctx context.Context, communityDID string) error
53 IncrementSubscriberCount(ctx context.Context, communityDID string) error
54 DecrementSubscriberCount(ctx context.Context, communityDID string) error
55 IncrementPostCount(ctx context.Context, communityDID string) error
56}
57
58// Service defines the interface for community business logic
59// Coordinates between Repository and external services (PDS, identity, etc.)
60type Service interface {
61 // Community operations (write-forward pattern: Service -> PDS -> Firehose -> Consumer -> Repository)
62 CreateCommunity(ctx context.Context, req CreateCommunityRequest) (*Community, error)
63 GetCommunity(ctx context.Context, identifier string) (*Community, error) // identifier can be DID or handle
64 UpdateCommunity(ctx context.Context, req UpdateCommunityRequest) (*Community, error)
65 ListCommunities(ctx context.Context, req ListCommunitiesRequest) ([]*Community, error)
66 SearchCommunities(ctx context.Context, req SearchCommunitiesRequest) ([]*Community, int, error)
67
68 // Subscription operations (write-forward: creates record in user's PDS)
69 SubscribeToCommunity(ctx context.Context, userDID, userAccessToken, communityIdentifier string, contentVisibility int) (*Subscription, error)
70 UnsubscribeFromCommunity(ctx context.Context, userDID, userAccessToken, communityIdentifier string) error
71 GetUserSubscriptions(ctx context.Context, userDID string, limit, offset int) ([]*Subscription, error)
72 GetCommunitySubscribers(ctx context.Context, communityIdentifier string, limit, offset int) ([]*Subscription, error)
73
74 // Block operations (write-forward: creates record in user's PDS)
75 BlockCommunity(ctx context.Context, userDID, userAccessToken, communityIdentifier string) (*CommunityBlock, error)
76 UnblockCommunity(ctx context.Context, userDID, userAccessToken, communityIdentifier string) error
77 GetBlockedCommunities(ctx context.Context, userDID string, limit, offset int) ([]*CommunityBlock, error)
78 IsBlocked(ctx context.Context, userDID, communityIdentifier string) (bool, error)
79
80 // Membership operations (indexed from firehose, reputation managed internally)
81 GetMembership(ctx context.Context, userDID, communityIdentifier string) (*Membership, error)
82 ListCommunityMembers(ctx context.Context, communityIdentifier string, limit, offset int) ([]*Membership, error)
83
84 // Validation helpers
85 ValidateHandle(handle string) error
86 ResolveCommunityIdentifier(ctx context.Context, identifier string) (string, error) // Returns DID from handle or DID
87
88 // Token management (for post service to use when writing to community repos)
89 EnsureFreshToken(ctx context.Context, community *Community) (*Community, error)
90
91 // Direct repository access (for post service)
92 GetByDID(ctx context.Context, did string) (*Community, error)
93}