A community based topic aggregation platform built on atproto

feat(lexicon): add vote create and delete lexicons

Add XRPC procedure lexicons for voting on posts/comments:
- social.coves.feed.vote.create: Create/toggle votes with up/down direction
- social.coves.feed.vote.delete: Remove existing votes

Follows atproto lexicon best practices:
- Uses knownValues for direction (not closed enum)
- References com.atproto.repo.strongRef for subject
- UpperCamelCase error names per spec

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

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

+103
+62
internal/atproto/lexicon/social/coves/feed/vote/create.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.coves.feed.vote.create", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Create or toggle a vote on a post or comment. If a vote in the same direction exists, it will be removed (toggled off). If a vote in the opposite direction exists, it will be replaced.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["subject", "direction"], 13 + "properties": { 14 + "subject": { 15 + "type": "ref", 16 + "ref": "com.atproto.repo.strongRef", 17 + "description": "Strong reference to the post or comment being voted on" 18 + }, 19 + "direction": { 20 + "type": "string", 21 + "knownValues": ["up", "down"], 22 + "description": "Vote direction: up for upvote, down for downvote" 23 + } 24 + } 25 + } 26 + }, 27 + "output": { 28 + "encoding": "application/json", 29 + "schema": { 30 + "type": "object", 31 + "required": ["uri", "cid"], 32 + "properties": { 33 + "uri": { 34 + "type": "string", 35 + "format": "at-uri", 36 + "description": "AT-URI of the created vote (empty string if vote was toggled off)" 37 + }, 38 + "cid": { 39 + "type": "string", 40 + "format": "cid", 41 + "description": "CID of the created vote (empty string if vote was toggled off)" 42 + } 43 + } 44 + } 45 + }, 46 + "errors": [ 47 + { 48 + "name": "SubjectNotFound", 49 + "description": "The subject post or comment was not found" 50 + }, 51 + { 52 + "name": "NotAuthorized", 53 + "description": "User is not authorized to vote on this content" 54 + }, 55 + { 56 + "name": "InvalidSubject", 57 + "description": "The subject reference is invalid or malformed" 58 + } 59 + ] 60 + } 61 + } 62 + }
+41
internal/atproto/lexicon/social/coves/feed/vote/delete.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.coves.feed.vote.delete", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Delete a vote on a post or comment", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["subject"], 13 + "properties": { 14 + "subject": { 15 + "type": "ref", 16 + "ref": "com.atproto.repo.strongRef", 17 + "description": "Strong reference to the post or comment to remove the vote from" 18 + } 19 + } 20 + } 21 + }, 22 + "output": { 23 + "encoding": "application/json", 24 + "schema": { 25 + "type": "object", 26 + "properties": {} 27 + } 28 + }, 29 + "errors": [ 30 + { 31 + "name": "VoteNotFound", 32 + "description": "No vote found for this subject" 33 + }, 34 + { 35 + "name": "NotAuthorized", 36 + "description": "User is not authorized to delete this vote" 37 + } 38 + ] 39 + } 40 + } 41 + }