A community based topic aggregation platform built on atproto

feat(lexicon): add subscription record type with contentVisibility

Add atProto-compliant subscription lexicon following Bluesky conventions:
- Collection: social.coves.community.subscription (singular namespace)
- Field: subject (not community) per atProto graph record standards
- ContentVisibility: 1-5 scale for feed slider (default: 3)

Migration 008 adds content_visibility column:
- INTEGER with CHECK constraint (1-5 range)
- Indexed for feed generation queries
- Composite index (user_did, content_visibility) for performance

Follows atProto naming guidelines from bluesky-social/atproto#4245

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Changed files
+62
internal
atproto
lexicon
social
coves
community
db
+39
internal/atproto/lexicon/social/coves/community/subscription.json
···
···
+
{
+
"lexicon": 1,
+
"id": "social.coves.community.subscription",
+
"defs": {
+
"main": {
+
"type": "record",
+
"description": "A subscription to a community",
+
"key": "tid",
+
"record": {
+
"type": "object",
+
"required": ["subject", "createdAt"],
+
"properties": {
+
"subject": {
+
"type": "string",
+
"format": "at-identifier",
+
"description": "DID or handle of the community being subscribed to"
+
},
+
"createdAt": {
+
"type": "string",
+
"format": "datetime",
+
"description": "When the subscription started"
+
},
+
"endedAt": {
+
"type": "string",
+
"format": "datetime",
+
"description": "When the subscription ended (null if current)"
+
},
+
"contentVisibility": {
+
"type": "integer",
+
"minimum": 1,
+
"maximum": 5,
+
"default": 3,
+
"description": "Content visibility level (1=only best content, 5=all content)"
+
}
+
}
+
}
+
}
+
}
+
}
+23
internal/db/migrations/008_add_content_visibility_to_subscriptions.sql
···
···
+
-- +goose Up
+
-- Add content_visibility column to community_subscriptions table
+
-- This implements the feed slider (1-5 scale) from DOMAIN_KNOWLEDGE.md
+
-- 1 = Only show the best/most popular content from this community
+
-- 5 = Show all content from this community
+
-- Default = 3 (balanced)
+
ALTER TABLE community_subscriptions
+
ADD COLUMN content_visibility INTEGER NOT NULL DEFAULT 3
+
CHECK (content_visibility >= 1 AND content_visibility <= 5);
+
+
-- Index for feed generation queries (filter by visibility level)
+
CREATE INDEX idx_subscriptions_visibility ON community_subscriptions(content_visibility);
+
+
-- Composite index for user feed queries (user_did + visibility level)
+
CREATE INDEX idx_subscriptions_user_visibility ON community_subscriptions(user_did, content_visibility);
+
+
COMMENT ON COLUMN community_subscriptions.content_visibility IS 'Feed slider: 1=only best content, 5=all content (see social.coves.community.subscription lexicon)';
+
+
-- +goose Down
+
-- Remove content_visibility column and indexes
+
DROP INDEX IF EXISTS idx_subscriptions_user_visibility;
+
DROP INDEX IF EXISTS idx_subscriptions_visibility;
+
ALTER TABLE community_subscriptions DROP COLUMN content_visibility;