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