social.coves.community.post.create
Schema Diff
+12 -4
Compatibility Analysis
Breaking Changes Detected
1 breaking change, 5 non-breaking changes.
Breaking Changes (1)
- ConstraintAdded ConstraintAdded { vertex_id: "social.coves.community.post.create:input.community", sort: "maxLength", value: "320" }
Non-Breaking Changes (5)
- AddedVertex AddedVertex { vertex_id: "social.coves.community.post.create:output.status" }
- AddedEdge AddedEdge { src: "social.coves.community.post.create:output", tgt: "social.coves.community.post.create:output.status", kind: "prop", name: Some("status") }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.coves.community.post.create:input.community", sort: "format" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "social.coves.community.post.create:input.content", sort: "maxLength", old_value: "100000", new_value: "500000" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "social.coves.community.post.create:input.content", sort: "maxGraphemes", old_value: "10000", new_value: "50000" }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "social.coves.community.post.create:output.status" }
Constraint Changes
- ConstraintAdded ConstraintAdded { vertex_id: "social.coves.community.post.create:input.community", sort: "maxLength", value: "320" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.coves.community.post.create:input.community", sort: "format" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "social.coves.community.post.create:input.content", sort: "maxGraphemes", old_value: "10000", new_value: "50000" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "social.coves.community.post.create:input.content", sort: "maxLength", old_value: "100000", new_value: "500000" }
Additional Notes
- Non-breaking: AddedEdge { src: "social.coves.community.post.create:output", tgt: "social.coves.community.post.create:output.status", kind: "prop", name: Some("status") }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
5
"description": "Create a new post in a community",
6
6
"errors": [
7
7
{
8
8
"description": "Community not found",
9
9
"name": "CommunityNotFound"
10
10
},
11
11
{
12
12
"description": "User is not authorized to post in this community",
13
13
"name": "NotAuthorized"
14
14
},
15
15
{
16
16
"description": "User is banned from this community",
17
17
"name": "Banned"
18
18
},
19
19
{
20
20
"description": "Post content violates community rules",
21
21
"name": "InvalidContent"
22
22
},
23
23
{
24
24
"description": "Post violates community content rules (e.g., embeds not allowed, text too short)",
25
25
"name": "ContentRuleViolation"
26
26
}
27
27
],
28
28
"input": {
29
29
"encoding": "application/json",
30
30
"schema": {
31
31
"properties": {
32
32
"community": {
33
-
"description": "DID or handle of the community to post in",
34
-
"format": "at-identifier",
33
+
"description": "Community identifier (DID, handle, name@origin, or bare local name) of the community to post in",
34
+
"maxLength": 320,
35
35
"type": "string"
36
36
},
37
37
"content": {
38
38
"description": "Post content - supports rich text via facets",
39
-
"maxGraphemes": 10000,
40
-
"maxLength": 100000,
39
+
"maxGraphemes": 50000,
40
+
"maxLength": 500000,
41
41
"type": "string"
42
42
},
43
43
"embed": {
44
44
"description": "Embedded media, external links, or quoted posts",
45
45
"refs": [
46
46
"social.coves.embed.images",
47
47
"social.coves.embed.video",
48
48
"social.coves.embed.external",
49
49
"social.coves.embed.post"
50
50
],
51
51
"type": "union"
52
52
},
53
53
"facets": {
54
54
"description": "Annotations for rich text (mentions, links, formatting, block structure)",
55
55
"items": {
56
56
"ref": "social.coves.richtext.facet",
57
57
"type": "ref"
58
58
},
59
59
"maxLength": 200,
60
60
"type": "array"
61
61
},
62
62
"labels": {
63
63
"description": "Self-applied content labels (NSFW, spoilers, etc.)",
64
64
"ref": "com.atproto.label.defs#selfLabels",
65
65
"type": "ref"
66
66
},
67
67
"langs": {
68
68
"description": "Languages used in the post content (ISO 639-1)",
69
69
"items": {
70
70
"format": "language",
71
71
"type": "string"
72
72
},
73
73
"maxLength": 3,
74
74
"type": "array"
75
75
},
76
76
"tags": {
77
77
"description": "User-applied topic tags",
78
78
"items": {
79
79
"maxGraphemes": 64,
80
80
"maxLength": 640,
81
81
"type": "string"
82
82
},
83
83
"maxLength": 8,
84
84
"type": "array"
85
85
},
86
86
"title": {
87
87
"description": "Post title (optional for media-only posts)",
88
88
"maxGraphemes": 300,
89
89
"maxLength": 3000,
90
90
"type": "string"
91
91
}
92
92
},
93
93
"required": [
94
94
"community"
95
95
],
96
96
"type": "object"
97
97
}
98
98
},
99
99
"output": {
100
100
"encoding": "application/json",
101
101
"schema": {
102
102
"properties": {
103
103
"cid": {
104
104
"description": "CID of the created post",
105
105
"format": "cid",
106
106
"type": "string"
107
107
},
108
+
"status": {
109
+
"description": "The community's decision as of this response. 'accepted' means this host runs the community's admission and a community acceptance now stands for the post; 'pending' means no acceptance covers it yet - either the community is hosted elsewhere and decides for itself, or the synchronous acceptance failed and will be retried. Pending is a SUCCESS, not an error: the post exists in its author's repository either way. Optional, so a client predating the field decodes an unchanged response. knownValues rather than an enum because the vocabulary may grow, and a closed enum would make adding a status a breaking change for every generated client in the network.",
110
+
"knownValues": [
111
+
"accepted",
112
+
"pending"
113
+
],
114
+
"type": "string"
115
+
},
108
116
"uri": {
109
117
"description": "AT-URI of the created post",
110
118
"format": "at-uri",
111
119
"type": "string"
112
120
}
113
121
},
114
122
"required": [
115
123
"uri",
116
124
"cid"
117
125
],
118
126
"type": "object"
119
127
}
120
128
},
121
129
"type": "procedure"
122
130
}
123
131
},
124
132
"id": "social.coves.community.post.create",
125
133
"lexicon": 1
126
134
}