app.placita.place
Schema Diff
+120 -0
Compatibility Analysis
Breaking Changes Detected
2 breaking changes, 42 non-breaking changes.
Breaking Changes (2)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.placita.place#osmTag", src: "app.placita.place#osmTag", tgt: "app.placita.place#osmTag.key", kind: "prop", name: Some("key") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.placita.place#osmTag", src: "app.placita.place#osmTag", tgt: "app.placita.place#osmTag.value", kind: "prop", name: Some("value") }
Non-Breaking Changes (42)
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.city" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.country" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.countryCode" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.houseNumber" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.postcode" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.state" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.street" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.suburb" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.address" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.checkedAt" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.editedAt" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.tags" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.tags:items" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmTag" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmTag.key" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place#osmTag.value" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place:body.osm" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place:body.photoCredit" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place:body.placeCode" }
- AddedVertex AddedVertex { vertex_id: "app.placita.place:body.rating" }
- AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.city", kind: "prop", name: Some("city") }
- AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.country", kind: "prop", name: Some("country") }
- AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.countryCode", kind: "prop", name: Some("countryCode") }
- AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.houseNumber", kind: "prop", name: Some("houseNumber") }
- AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.postcode", kind: "prop", name: Some("postcode") }
- AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.state", kind: "prop", name: Some("state") }
- AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.street", kind: "prop", name: Some("street") }
- AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.suburb", kind: "prop", name: Some("suburb") }
- AddedEdge AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.address", kind: "prop", name: Some("address") }
- AddedEdge AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.checkedAt", kind: "prop", name: Some("checkedAt") }
- AddedEdge AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.editedAt", kind: "prop", name: Some("editedAt") }
- AddedEdge AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.tags", kind: "prop", name: Some("tags") }
- AddedEdge AddedEdge { src: "app.placita.place#osmDetails.address", tgt: "app.placita.place#osmAddress", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "app.placita.place#osmDetails.tags", tgt: "app.placita.place#osmDetails.tags:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "app.placita.place#osmDetails.tags:items", tgt: "app.placita.place#osmTag", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.osm", kind: "prop", name: Some("osm") }
- AddedEdge AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.photoCredit", kind: "prop", name: Some("photoCredit") }
- AddedEdge AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.placeCode", kind: "prop", name: Some("placeCode") }
- AddedEdge AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.rating", kind: "prop", name: Some("rating") }
- AddedEdge AddedEdge { src: "app.placita.place:body.osm", tgt: "app.placita.place#osmDetails", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "app.placita.place#osmAddress" }AddedVertex { vertex_id: "app.placita.place#osmAddress.city" }AddedVertex { vertex_id: "app.placita.place#osmAddress.country" }AddedVertex { vertex_id: "app.placita.place#osmAddress.countryCode" }AddedVertex { vertex_id: "app.placita.place#osmAddress.houseNumber" }AddedVertex { vertex_id: "app.placita.place#osmAddress.postcode" }AddedVertex { vertex_id: "app.placita.place#osmAddress.state" }AddedVertex { vertex_id: "app.placita.place#osmAddress.street" }AddedVertex { vertex_id: "app.placita.place#osmAddress.suburb" }AddedVertex { vertex_id: "app.placita.place#osmDetails" }AddedVertex { vertex_id: "app.placita.place#osmDetails.address" }AddedVertex { vertex_id: "app.placita.place#osmDetails.checkedAt" }AddedVertex { vertex_id: "app.placita.place#osmDetails.editedAt" }AddedVertex { vertex_id: "app.placita.place#osmDetails.tags" }AddedVertex { vertex_id: "app.placita.place#osmDetails.tags:items" }AddedVertex { vertex_id: "app.placita.place#osmTag" }AddedVertex { vertex_id: "app.placita.place#osmTag.key" }AddedVertex { vertex_id: "app.placita.place#osmTag.value" }AddedVertex { vertex_id: "app.placita.place:body.osm" }AddedVertex { vertex_id: "app.placita.place:body.photoCredit" }AddedVertex { vertex_id: "app.placita.place:body.placeCode" }AddedVertex { vertex_id: "app.placita.place:body.rating" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "app.placita.place#osmTag", src: "app.placita.place#osmTag", tgt: "app.placita.place#osmTag.key", kind: "prop", name: Some("key") }
- Breaking: RequiredEdgeAdded { vertex_id: "app.placita.place#osmTag", src: "app.placita.place#osmTag", tgt: "app.placita.place#osmTag.value", kind: "prop", name: Some("value") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.city", kind: "prop", name: Some("city") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.country", kind: "prop", name: Some("country") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.countryCode", kind: "prop", name: Some("countryCode") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.houseNumber", kind: "prop", name: Some("houseNumber") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.postcode", kind: "prop", name: Some("postcode") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.state", kind: "prop", name: Some("state") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.street", kind: "prop", name: Some("street") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.suburb", kind: "prop", name: Some("suburb") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.address", kind: "prop", name: Some("address") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.checkedAt", kind: "prop", name: Some("checkedAt") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.editedAt", kind: "prop", name: Some("editedAt") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.tags", kind: "prop", name: Some("tags") }
- Non-breaking: AddedEdge { src: "app.placita.place#osmDetails.address", tgt: "app.placita.place#osmAddress", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "app.placita.place#osmDetails.tags", tgt: "app.placita.place#osmDetails.tags:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "app.placita.place#osmDetails.tags:items", tgt: "app.placita.place#osmTag", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.osm", kind: "prop", name: Some("osm") }
- Non-breaking: AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.photoCredit", kind: "prop", name: Some("photoCredit") }
- Non-breaking: AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.placeCode", kind: "prop", name: Some("placeCode") }
- Non-breaking: AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.rating", kind: "prop", name: Some("rating") }
- Non-breaking: AddedEdge { src: "app.placita.place:body.osm", tgt: "app.placita.place#osmDetails", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
5
"description": "A place saved by a user. The primary entity of Placita: one record per place, stored in the user's own repository.",
6
6
"key": "tid",
7
7
"record": {
8
8
"properties": {
9
9
"category": {
10
10
"description": "Place type from Placita's fixed list, for example restaurant, cafe or museum. Missing or unknown means generic.",
11
11
"knownValues": [
12
12
"generic",
13
13
"restaurant",
14
14
"fastfood",
15
15
"cafe",
16
16
"bar",
17
17
"beer",
18
18
"wine",
19
19
"nightclub",
20
20
"bakery",
21
21
"grocery",
22
22
"clothing",
23
23
"shopping",
24
24
"lodging",
25
25
"campsite",
26
26
"museum",
27
27
"attraction",
28
28
"viewpoint",
29
29
"worship",
30
30
"park",
31
31
"playground",
32
32
"sports",
33
33
"swimming",
34
34
"zoo",
35
35
"cinema",
36
36
"theatre",
37
37
"library",
38
38
"school",
39
39
"college",
40
40
"hospital",
41
41
"pharmacy",
42
42
"doctor",
43
43
"dentist",
44
44
"bank",
45
45
"atm",
46
46
"post",
47
47
"police",
48
48
"fuel",
49
49
"parking",
50
50
"bus",
51
51
"rail",
52
52
"airport",
53
53
"ferry"
54
54
],
55
55
"maxLength": 32,
56
56
"type": "string"
57
57
},
58
58
"createdAt": {
59
59
"description": "When the place was saved.",
60
60
"format": "datetime",
61
61
"type": "string"
62
62
},
63
63
"location": {
64
64
"description": "Where the place is. Normally community.lexicon.location.geo: coordinates as strings, with the street address in its name field when known.",
65
65
"refs": [
66
66
"community.lexicon.location.geo",
67
67
"community.lexicon.location.address"
68
68
],
69
69
"type": "union"
70
70
},
71
71
"name": {
72
72
"description": "Name of the place as the user saved it.",
73
73
"maxGraphemes": 100,
74
74
"maxLength": 300,
75
75
"type": "string"
76
76
},
77
77
"note": {
78
78
"description": "The user's own note about the place.",
79
79
"maxGraphemes": 1000,
80
80
"maxLength": 3000,
81
81
"type": "string"
82
82
},
83
83
"noteTitle": {
84
84
"description": "Optional short title for the note.",
85
85
"maxGraphemes": 100,
86
86
"maxLength": 100,
87
87
"type": "string"
88
88
},
89
89
"openingHours": {
90
90
"description": "Opening hours in OpenStreetMap opening_hours syntax, for example Mo-Su 09:00-18:00.",
91
91
"maxLength": 512,
92
92
"type": "string"
93
93
},
94
+
"osm": {
95
+
"description": "Details in OpenStreetMap's own words (structured address, tags). Copied from OpenStreetMap when the place is linked (see checkedAt), and editable by the person (see editedAt). May also hold details typed for a place with no link. A copy made at a point in time: it is not kept up to date.",
96
+
"ref": "#osmDetails",
97
+
"type": "ref"
98
+
},
94
99
"osmId": {
95
100
"description": "ID of the linked OpenStreetMap feature as a decimal string. Used together with osmType.",
96
101
"maxLength": 32,
97
102
"type": "string"
98
103
},
99
104
"osmType": {
100
105
"description": "Type of the linked OpenStreetMap feature. Set only when the user confirmed the match. Used together with osmId.",
101
106
"knownValues": [
102
107
"node",
103
108
"way",
104
109
"relation"
105
110
],
106
111
"type": "string"
107
112
},
108
113
"phone": {
109
114
"description": "The place's phone number, as entered or taken from OpenStreetMap.",
110
115
"maxLength": 64,
111
116
"type": "string"
112
117
},
113
118
"photo": {
114
119
"accept": [
115
120
"image/png",
116
121
"image/jpeg",
117
122
"image/webp"
118
123
],
119
124
"description": "Legacy single photo. Only older records have it. New records use photos.",
120
125
"maxSize": 2000000,
121
126
"type": "blob"
122
127
},
128
+
"photoCredit": {
129
+
"description": "Who took the photos in photos, when they are not the person who owns this record, for example because they were copied from a public place of another person. Free text such as Photos by @alice.example. Only set together with photos.",
130
+
"maxGraphemes": 100,
131
+
"maxLength": 300,
132
+
"type": "string"
133
+
},
123
134
"photos": {
124
135
"description": "Photos the user uploaded for this place. Up to 4.",
125
136
"items": {
126
137
"accept": [
127
138
"image/png",
128
139
"image/jpeg",
129
140
"image/webp"
130
141
],
131
142
"maxSize": 2000000,
132
143
"type": "blob"
133
144
},
134
145
"maxItems": 4,
135
146
"type": "array"
136
147
},
148
+
"placeCode": {
149
+
"description": "An opaque random code that names the place itself, for a place with no confirmed OpenStreetMap link. The person who first saves such a place makes it; every copy another person saves keeps it unchanged, so copies of one place can be found together. Not set when the place has an OpenStreetMap link, which names the place instead. Lowercase letters and the digits 2 to 7.",
150
+
"maxLength": 64,
151
+
"type": "string"
152
+
},
153
+
"rating": {
154
+
"description": "The user's own rating of the place, from 1 (poor) to 5 (excellent). Only set when status is been. Absent means not rated.",
155
+
"maximum": 5,
156
+
"minimum": 1,
157
+
"type": "integer"
158
+
},
137
159
"source": {
138
160
"description": "Where the place came from: a map or review link the user pasted, an OpenStreetMap search result, or manual entry.",
139
161
"knownValues": [
140
162
"google",
141
163
"foursquare",
142
164
"osm",
143
165
"apple",
144
166
"tripadvisor",
145
167
"manual"
146
168
],
147
169
"type": "string"
148
170
},
149
171
"sourcePhotoAuthor": {
150
172
"description": "Creator or credit text returned by Wikimedia Commons for sourcePhotoUrl.",
151
173
"maxLength": 500,
152
174
"type": "string"
153
175
},
154
176
"sourcePhotoLicense": {
155
177
"description": "License of sourcePhotoUrl, e.g. CC BY-SA 4.0. Attribution duty applies when shown.",
156
178
"maxLength": 64,
157
179
"type": "string"
158
180
},
159
181
"sourcePhotoLicenseUrl": {
160
182
"description": "License details URL returned by Wikimedia Commons.",
161
183
"maxLength": 2048,
162
184
"type": "string"
163
185
},
164
186
"sourcePhotoPageUrl": {
165
187
"description": "Source file page URL for attribution and reuse details.",
166
188
"maxLength": 2048,
167
189
"type": "string"
168
190
},
169
191
"sourcePhotoSourceName": {
170
192
"description": "Origin label for the source photo suggestion.",
171
193
"maxLength": 128,
172
194
"type": "string"
173
195
},
174
196
"sourcePhotoUrl": {
175
197
"description": "URL of a free-licensed photo found for this place (Wikimedia Commons, OSM image tag, Wikidata P18). Not a blob - it is a reference to an external image, with attribution.",
176
198
"maxLength": 2048,
177
199
"type": "string"
178
200
},
179
201
"sourceUrl": {
180
202
"description": "The link the place was created from, when there was one.",
181
203
"maxLength": 2048,
182
204
"type": "string"
183
205
},
184
206
"status": {
185
207
"default": "want",
186
208
"description": "want means the user wants to go there. been means the user has been there.",
187
209
"knownValues": [
188
210
"want",
189
211
"been"
190
212
],
191
213
"type": "string"
192
214
},
193
215
"tags": {
194
216
"description": "The user's tags for this place, as strong references to app.placita.tag records.",
195
217
"items": {
196
218
"ref": "com.atproto.repo.strongRef",
197
219
"type": "ref"
198
220
},
199
221
"maxLength": 50,
200
222
"type": "array"
201
223
},
202
224
"visibility": {
203
225
"default": "hidden",
204
226
"description": "Whether Placita shows this place in public discovery. This is a display hint only: every record in an AT Protocol repository can be read by anyone, including hidden ones.",
205
227
"knownValues": [
206
228
"hidden",
207
229
"public"
208
230
],
209
231
"type": "string"
210
232
},
211
233
"website": {
212
234
"description": "The place's website.",
213
235
"maxLength": 2048,
214
236
"type": "string"
215
237
}
216
238
},
217
239
"required": [
218
240
"name",
219
241
"status",
220
242
"visibility",
221
243
"location",
222
244
"createdAt"
223
245
],
224
246
"type": "object"
225
247
},
226
248
"type": "record"
249
+
},
250
+
"osmAddress": {
251
+
"description": "A structured address, as OpenStreetMap returns it. Every part is optional.",
252
+
"properties": {
253
+
"city": {
254
+
"description": "City, town or village.",
255
+
"maxLength": 200,
256
+
"type": "string"
257
+
},
258
+
"country": {
259
+
"description": "Country name.",
260
+
"maxLength": 200,
261
+
"type": "string"
262
+
},
263
+
"countryCode": {
264
+
"description": "Two-letter ISO 3166-1 country code, upper case.",
265
+
"maxLength": 2,
266
+
"minLength": 2,
267
+
"type": "string"
268
+
},
269
+
"houseNumber": {
270
+
"description": "House or building number.",
271
+
"maxLength": 32,
272
+
"type": "string"
273
+
},
274
+
"postcode": {
275
+
"description": "Postal code.",
276
+
"maxLength": 32,
277
+
"type": "string"
278
+
},
279
+
"state": {
280
+
"description": "Region or state.",
281
+
"maxLength": 200,
282
+
"type": "string"
283
+
},
284
+
"street": {
285
+
"description": "Street or road name.",
286
+
"maxLength": 200,
287
+
"type": "string"
288
+
},
289
+
"suburb": {
290
+
"description": "Neighbourhood, quarter or suburb.",
291
+
"maxLength": 200,
292
+
"type": "string"
293
+
}
294
+
},
295
+
"type": "object"
296
+
},
297
+
"osmDetails": {
298
+
"description": "Address and tags in OpenStreetMap's vocabulary: a copy of what OpenStreetMap knew about the linked feature at checkedAt, and/or what the person typed (editedAt). Data copied from OpenStreetMap is (c) OpenStreetMap contributors, available under the Open Database Licence (ODbL). Treat the values as suggestions: they can be wrong or out of date, and the user's own fields always win.",
299
+
"properties": {
300
+
"address": {
301
+
"description": "The structured address OpenStreetMap has for the feature.",
302
+
"ref": "#osmAddress",
303
+
"type": "ref"
304
+
},
305
+
"checkedAt": {
306
+
"description": "When the details were copied from OpenStreetMap. Absent for details that were only typed.",
307
+
"format": "datetime",
308
+
"type": "string"
309
+
},
310
+
"editedAt": {
311
+
"description": "When the person last changed these details by hand, or typed them. Details with no checkedAt were never copied from OpenStreetMap.",
312
+
"format": "datetime",
313
+
"type": "string"
314
+
},
315
+
"tags": {
316
+
"description": "Raw OpenStreetMap tags (key and value) of the feature, such as cuisine, wheelchair or wikidata. Tags already stored in other fields (name, website, phone, opening hours) and OpenStreetMap-internal tags (source, note, fixme) are left out. At most 60.",
317
+
"items": {
318
+
"ref": "#osmTag",
319
+
"type": "ref"
320
+
},
321
+
"maxLength": 60,
322
+
"type": "array"
323
+
}
324
+
},
325
+
"type": "object"
326
+
},
327
+
"osmTag": {
328
+
"description": "One OpenStreetMap tag.",
329
+
"properties": {
330
+
"key": {
331
+
"description": "The tag key, for example cuisine.",
332
+
"maxLength": 64,
333
+
"type": "string"
334
+
},
335
+
"value": {
336
+
"description": "The tag value, for example italian;pizza. Values over 255 characters are not stored.",
337
+
"maxGraphemes": 255,
338
+
"maxLength": 1024,
339
+
"type": "string"
340
+
}
341
+
},
342
+
"required": [
343
+
"key",
344
+
"value"
345
+
],
346
+
"type": "object"
227
347
}
228
348
},
229
349
"id": "app.placita.place",
230
350
"lexicon": 1
231
351
}