diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index dd6b37a9..c2804410 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -28,7 +28,7 @@ export default defineConfig({ { base: 'api-reference', label: 'API Reference', - schema: 'wanderer.openapi.yaml', + schema: 'wanderer.openapi.json', sidebar: { operations: { diff --git a/docs/wanderer.openapi.json b/docs/wanderer.openapi.json new file mode 100644 index 00000000..7ed72ee5 --- /dev/null +++ b/docs/wanderer.openapi.json @@ -0,0 +1,6616 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Wanderer API", + "version": "v0.19.0", + "description": "API documentation for wanderer backend" + }, + "servers": [], + "paths": { + "/api/v1/waypoint": { + "get": { + "summary": "List waypoints", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of waypoints", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create waypoint", + "tags": [ + "Waypoints" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WaypointInput" + } + } + } + }, + "responses": { + "201": { + "description": "Waypoint created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Waypoint" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/waypoint/{id}": { + "get": { + "summary": "Get waypoint", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Waypoint details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Waypoint" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update waypoint", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WaypointUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Waypoint updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Waypoint" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete waypoint", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Waypoint deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/waypoint/{id}/file": { + "post": { + "summary": "Upload waypoint file", + "description": "Uploads a file (photo) for a waypoint", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded, waypoint updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Waypoint" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/valhalla/route": { + "post": { + "summary": "Get route data", + "description": "Queries Valhalla service for routing data", + "tags": [ + "Valhalla" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Route data from Valhalla", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/valhalla/height": { + "post": { + "summary": "Get elevation data", + "description": "Queries Valhalla service for elevation data at coordinates", + "tags": [ + "Valhalla" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Elevation data from Valhalla", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/user": { + "put": { + "summary": "Create user (sign up)", + "tags": [ + "Users" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserCreateInput" + } + } + } + }, + "responses": { + "201": { + "description": "User created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Bad Request - Signup disabled or invalid data" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/user/{id}": { + "get": { + "summary": "Get user by ID", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "User details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update user", + "description": "Updates a user. Handles password changes and email change requests", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "User updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete user", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "User deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/user/{id}/file": { + "post": { + "summary": "Upload user file", + "description": "Uploads a file (avatar) for a user", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded, user updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-share": { + "get": { + "summary": "List trail shares", + "description": "Retrieves a paginated list of trail shares with optional ActivityPub actor resolution", + "tags": [ + "Trail Shares" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListResult" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create trail share", + "description": "Creates a new trail share. Converts ActivityPub actor IRI to ID", + "tags": [ + "Trail Shares" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailShareInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail share created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-share/{id}": { + "get": { + "summary": "Get trail share", + "description": "Retrieves a trail share by ID", + "tags": [ + "Trail Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "TrailShare" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update trail share", + "tags": [ + "Trail Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailShareUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Trail share updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete trail share", + "tags": [ + "Trail Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Trail share deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-link-share": { + "get": { + "summary": "List trail link shares", + "tags": [ + "Trail Link Shares" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of trail link shares", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create trail link share", + "tags": [ + "Trail Link Shares" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLinkShareInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail link share created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLinkShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-link-share/{id}": { + "get": { + "summary": "Get trail link share", + "description": "Retrieves a trail link share by ID", + "tags": [ + "Trail Link Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "TrailLinkShare" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update trail link share", + "tags": [ + "Trail Link Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLinkShareUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Trail link share updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLinkShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete trail link share", + "tags": [ + "Trail Link Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Trail link share deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-like": { + "get": { + "summary": "List trail likes", + "tags": [ + "Trail Likes" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of trail likes", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create trail like", + "tags": [ + "Trail Likes" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLikeInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail like created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLike" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-like/delete": { + "post": { + "summary": "Delete trail like by actor and trail", + "description": "Deletes a trail like without needing to know its ID. Uses actor and trail IDs to find and delete", + "tags": [ + "Trail Likes" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLikeInput" + } + } + } + }, + "responses": { + "200": { + "description": "Trail like deleted" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-like/{id}": { + "get": { + "summary": "Get trail like", + "description": "Retrieves a trail like by ID", + "tags": [ + "Trail Likes" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "TrailLike" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete trail like", + "tags": [ + "Trail Likes" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Trail like deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail": { + "get": { + "summary": "List trails", + "description": "Retrieves a paginated list of trails with optional filtering and sorting", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListResult" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create trail", + "tags": [ + "Trails" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailCreateInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/upload": { + "put": { + "summary": "Upload and parse GPX file as trail", + "description": "Uploads a GPX file, parses it to extract trail data, performs duplicate detection, and indexes in search", + "tags": [ + "Trails" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + }, + "name": { + "type": "string" + }, + "ignoreDuplicates": { + "type": "boolean" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Trail created from GPX", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request - Invalid or empty GPX file" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/recommend": { + "get": { + "summary": "Get trail recommendations", + "description": "Retrieves random trail recommendations from Meilisearch", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "query", + "name": "size", + "schema": { + "type": "integer", + "default": 10 + } + } + ], + "responses": { + "200": { + "description": "Array of recommended trails", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Trail" + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/form": { + "put": { + "summary": "Create trail with file upload", + "description": "Creates a new trail with file upload (GPX/photos) and date normalization", + "tags": [ + "Trails" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/TrailCreateInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/form/{id}": { + "post": { + "summary": "Update trail with file upload", + "description": "Updates a trail with file upload (GPX/photos) and date normalization", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/TrailUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Trail updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/filter": { + "get": { + "summary": "Get trail filter values", + "description": "Retrieves min/max values for trail filtering (distance, elevation gain/loss)", + "tags": [ + "Trails" + ], + "responses": { + "200": { + "description": "Trail filter values (min/max for distance, elevation)", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "min_distance": { + "type": "number" + }, + "max_distance": { + "type": "number" + }, + "min_elevation_gain": { + "type": "number" + }, + "max_elevation_gain": { + "type": "number" + }, + "min_elevation_loss": { + "type": "number" + }, + "max_elevation_loss": { + "type": "number" + } + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/download": { + "post": { + "summary": "Download file from URL", + "description": "Downloads a file from a URL and returns it as a blob", + "tags": [ + "Trails" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "url" + ], + "properties": { + "url": { + "type": "string", + "format": "uri" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File blob", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/bounding-box": { + "get": { + "summary": "Get trail bounding box", + "description": "Retrieves geographic bounding box (lat/lon bounds) for user's trails", + "tags": [ + "Trails" + ], + "responses": { + "200": { + "description": "Bounding box coordinates", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "max_lat": { + "type": "number" + }, + "min_lat": { + "type": "number" + }, + "max_lon": { + "type": "number" + }, + "min_lon": { + "type": "number" + } + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/{id}": { + "get": { + "summary": "Get trail", + "description": "Retrieves a trail by ID. Supports federated queries via handle parameter, fetching from remote instances and remapping file URLs", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "share", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Trail with optional federated data" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/{id}/file": { + "post": { + "summary": "Upload trail file", + "description": "Uploads a file for a trail", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/tag": { + "get": { + "summary": "List tags", + "tags": [ + "Tags" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of tags", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create tag", + "tags": [ + "Tags" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TagInput" + } + } + } + }, + "responses": { + "201": { + "description": "Tag created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Tag" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/tag/{id}": { + "get": { + "summary": "Get tag", + "tags": [ + "Tags" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Tag details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Tag" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update tag", + "tags": [ + "Tags" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TagUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Tag updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Tag" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete tag", + "tags": [ + "Tags" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Tag deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log": { + "get": { + "summary": "List summit logs", + "description": "Retrieves a paginated list of summit logs with deduplication of federated data", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListResult with local/remote items deduplicated" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create summit log", + "tags": [ + "Summit Logs" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLogInput" + } + } + } + }, + "responses": { + "201": { + "description": "Summit log created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log/form": { + "put": { + "summary": "Create summit log with file upload", + "description": "Creates a new summit log with file upload (photos/GPX) and date normalization", + "tags": [ + "Summit Logs" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/SummitLogInput" + } + } + } + }, + "responses": { + "201": { + "description": "Summit log created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log/form/{id}": { + "post": { + "summary": "Update summit log with file upload", + "description": "Updates a summit log with file upload (photos/GPX) and date normalization", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/SummitLogUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Summit log updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log/{id}": { + "get": { + "summary": "Get summit log", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Summit log details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update summit log", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLogUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Summit log updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete summit log", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Summit log deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log/{id}/file": { + "post": { + "summary": "Upload summit log file", + "description": "Uploads a file (photo or GPX) for a summit log", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded, summit log updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/settings": { + "put": { + "summary": "Create settings", + "tags": [ + "Settings" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingsInput" + } + } + } + }, + "responses": { + "201": { + "description": "Settings created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Settings" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/settings/{id}": { + "get": { + "summary": "Get settings", + "tags": [ + "Settings" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Settings details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Settings" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update settings", + "tags": [ + "Settings" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingsInput" + } + } + } + }, + "responses": { + "200": { + "description": "Settings updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Settings" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete settings", + "tags": [ + "Settings" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Settings deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/search/multi": { + "post": { + "summary": "Multi-index search", + "description": "Performs batch searches across multiple Meilisearch indices", + "tags": [ + "Search" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "queries" + ], + "properties": { + "queries": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Combined Meilisearch results", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/search/actor": { + "get": { + "summary": "Search actors", + "description": "Searches for ActivityPub actors by username, combining local and federated results", + "tags": [ + "Search" + ], + "parameters": [ + { + "in": "query", + "name": "q", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "includeSelf", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Array of matching actors", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/search/{index}": { + "post": { + "summary": "Search Meilisearch index", + "description": "Performs a search on a specific Meilisearch index", + "tags": [ + "Search" + ], + "parameters": [ + { + "in": "path", + "name": "index", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "q" + ], + "properties": { + "q": { + "type": "string" + }, + "options": { + "type": "object" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Meilisearch search results", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}": { + "get": { + "summary": "Get user profile", + "description": "Retrieves a user's profile by handle, with optional federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Profile and actor data", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}/trails": { + "post": { + "summary": "Search user trails", + "description": "Searches a user's trails via Meilisearch, with federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "q" + ], + "properties": { + "q": { + "type": "string" + }, + "options": { + "type": "object" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Meilisearch response with trail results", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}/stats": { + "get": { + "summary": "Get user summit statistics", + "description": "Retrieves summit log statistics for a user, with federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "SummitLog statistics", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}/lists": { + "post": { + "summary": "Search user lists", + "description": "Searches a user's lists via Meilisearch, with federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "q" + ], + "properties": { + "q": { + "type": "string" + }, + "options": { + "type": "object" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Meilisearch response with list results", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}/feed": { + "get": { + "summary": "Get user activity feed", + "description": "Retrieves activity feed for a user, with federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "FeedItem list", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/notification": { + "get": { + "summary": "List notifications", + "tags": [ + "Notifications" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of notifications", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/notification/{id}": { + "post": { + "summary": "Update notification", + "description": "Updates a notification by ID (typically to mark as read)", + "tags": [ + "Notifications" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Notification" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list-share": { + "get": { + "summary": "List list shares", + "description": "Retrieves a paginated list of list shares with optional ActivityPub actor resolution", + "tags": [ + "List Shares" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListResult" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create list share", + "description": "Creates a new list share. Converts ActivityPub actor IRI to ID", + "tags": [ + "List Shares" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListShareInput" + } + } + } + }, + "responses": { + "201": { + "description": "List share created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list-share/{id}": { + "get": { + "summary": "Get list share", + "description": "Retrieves a list share by ID", + "tags": [ + "List Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListShare" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update list share", + "tags": [ + "List Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListShareUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "List share updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete list share", + "tags": [ + "List Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List share deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list": { + "get": { + "summary": "List all lists", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of lists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create list", + "tags": [ + "Lists" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInput" + } + } + } + }, + "responses": { + "201": { + "description": "List created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/List" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list/form": { + "put": { + "summary": "Create list with file upload", + "description": "Creates a new list with file upload (avatar)", + "tags": [ + "Lists" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "201": { + "description": "List" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list/form/{id}": { + "post": { + "summary": "Update list with file upload", + "description": "Updates a list with file upload (avatar)", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "List" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list/{id}": { + "get": { + "summary": "Get list", + "description": "Retrieves a list by ID. Supports federated queries via handle parameter, fetching from remote instances and remapping file URLs", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List with optional federated data" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update list", + "description": "Updates a list by ID", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "List" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete list", + "description": "Deletes a list by ID", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list/{id}/file": { + "post": { + "summary": "Upload list file", + "description": "Uploads a file (cover image) for a list", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded, list updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/List" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration": { + "get": { + "summary": "List integrations", + "tags": [ + "Integrations" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of integrations", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create integration", + "tags": [ + "Integrations" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationInput" + } + } + } + }, + "responses": { + "201": { + "description": "Integration created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration/komoot/login": { + "get": { + "summary": "Get Komoot login endpoint", + "description": "Proxies to backend to get Komoot login configuration", + "tags": [ + "Integrations" + ], + "responses": { + "200": { + "description": "Komoot login endpoint", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration/hammerhead/upload": { + "post": { + "summary": "Upload via Hammerhead integration", + "description": "Proxies file upload to backend Hammerhead integration", + "tags": [ + "Integrations" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "required": [ + "file" + ], + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Upload result", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration/hammerhead/login": { + "get": { + "summary": "Get Hammerhead login endpoint", + "description": "Proxies to backend to get Hammerhead login configuration", + "tags": [ + "Integrations" + ], + "responses": { + "200": { + "description": "Hammerhead login endpoint", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration/{id}": { + "get": { + "summary": "Get integration", + "tags": [ + "Integrations" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Integration details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update integration", + "tags": [ + "Integrations" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Integration updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete integration", + "tags": [ + "Integrations" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Integration deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/follow": { + "get": { + "summary": "List follows", + "description": "Retrieves follows or ActivityPub follower/following collections. Supports federated queries via handle parameter", + "tags": [ + "Follows" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "type", + "schema": { + "type": "string", + "enum": [ + "followers", + "following" + ] + } + } + ], + "responses": { + "200": { + "description": "List of follows or ActivityPub collection", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/follow/{id}": { + "delete": { + "summary": "Delete follow", + "tags": [ + "Follows" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Follow deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/files/{collection}/{record}/{file}": { + "get": { + "summary": "Download file", + "description": "Downloads a file from a record with optional thumbnail generation", + "tags": [ + "Files" + ], + "parameters": [ + { + "in": "path", + "name": "collection", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "record", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "file", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "thumb", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "File download", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/feed": { + "get": { + "summary": "Get activity feed", + "description": "Retrieves the user's activity feed", + "tags": [ + "Feed" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Activity feed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/comment": { + "get": { + "summary": "List comments", + "tags": [ + "Comments" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string", + "description": "Federated query parameter" + } + } + ], + "responses": { + "200": { + "description": "List of comments", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/comment/{id}": { + "get": { + "summary": "Get comment", + "tags": [ + "Comments" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Comment details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Comment" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update comment", + "tags": [ + "Comments" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommentUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Comment updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Comment" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete comment", + "tags": [ + "Comments" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Comment deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/category": { + "get": { + "summary": "List categories", + "description": "Retrieves a paginated list of activity categories", + "tags": [ + "Categories" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of categories", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/auth/reset": { + "post": { + "summary": "Request password reset", + "description": "Sends a password reset email", + "tags": [ + "Authentication" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "email" + ], + "properties": { + "email": { + "type": "string", + "format": "email" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Password reset email sent" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/auth/oauth": { + "get": { + "summary": "List OAuth providers", + "description": "Lists available OAuth2 authentication methods with provider images", + "tags": [ + "Authentication" + ], + "responses": { + "200": { + "description": "OAuth2 providers and configuration", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/auth/login": { + "post": { + "summary": "Authenticate user", + "description": "Authenticates a user with email or username and password", + "tags": [ + "Authentication" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "password" + ], + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "User authenticated with auth token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Bad Request - Invalid credentials" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/auth/confirm-reset": { + "post": { + "summary": "Confirm password reset", + "description": "Confirms and applies a password reset with a valid token", + "tags": [ + "Authentication" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Password reset completed" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/api-token": { + "get": { + "summary": "List API tokens", + "description": "Retrieves a paginated list of API tokens with optional filtering and sorting", + "tags": [ + "API Tokens" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer", + "default": 1 + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer", + "default": 30 + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "page": { + "type": "integer" + }, + "perPage": { + "type": "integer" + }, + "totalItems": { + "type": "integer" + }, + "totalPages": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIToken" + } + } + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create API token", + "description": "Creates a new API token", + "tags": [ + "API Tokens" + ], + "parameters": [ + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APITokenInput" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIToken" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/api-token/{id}": { + "delete": { + "summary": "Delete API token", + "description": "Deletes an API token by ID", + "tags": [ + "API Tokens" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "description": "API token ID (15 chars)" + } + } + ], + "responses": { + "200": { + "description": "Success" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}": { + "get": { + "summary": "Get ActivityPub actor profile", + "description": "Retrieves an ActivityPub Person object for a user with public key", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub Person object with publicKey", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}/outbox": { + "get": { + "summary": "Get ActivityPub outbox collection", + "description": "Retrieves an OrderedCollection paginated list of activities published by this user", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub OrderedCollectionPage", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}/inbox": { + "post": { + "summary": "Receive ActivityPub activities", + "description": "Receives and processes incoming ActivityPub activities (Create, Update, Delete, Follow, etc.)", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Activity processed" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}/following": { + "get": { + "summary": "Get ActivityPub following collection", + "description": "Retrieves an OrderedCollection paginated list of accounts the user follows", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub OrderedCollectionPage", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}/followers": { + "get": { + "summary": "Get ActivityPub followers collection", + "description": "Retrieves an OrderedCollection paginated list of followers for a user", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub OrderedCollectionPage", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/trail/{id}": { + "get": { + "summary": "Get ActivityPub trail", + "description": "Retrieves an ActivityPub Trail object by ID (proxied from backend)", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub Trail object", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/comment/{id}": { + "get": { + "summary": "Get ActivityPub comment", + "description": "Retrieves an ActivityPub Comment object by ID (proxied from backend)", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub Comment object", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/activity/{id}": { + "get": { + "summary": "Get ActivityPub activity", + "description": "Retrieves an ActivityPub Activity object by ID", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub Activity object", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + } + }, + "components": { + "schemas": { + "APIToken": { + "type": "object", + "required": [ + "id", + "name", + "user" + ], + "properties": { + "id": { + "type": "string", + "description": "Token ID (15 chars)" + }, + "name": { + "type": "string", + "description": "Token name" + }, + "user": { + "type": "string", + "description": "User ID that owns this token" + }, + "expiration": { + "type": "string", + "format": "date-time", + "description": "Optional expiration date" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "APITokenInput": { + "type": "object", + "required": [ + "name", + "user" + ], + "properties": { + "name": { + "type": "string", + "minLength": 1, + "description": "Token name" + }, + "expiration": { + "type": "string", + "format": "date-time", + "description": "Optional expiration date (must be in future)" + }, + "user": { + "type": "string", + "description": "User ID (15 chars)" + } + } + }, + "User": { + "type": "object", + "required": [ + "id", + "username", + "email" + ], + "properties": { + "id": { + "type": "string", + "description": "User ID (15 chars)" + }, + "username": { + "type": "string", + "description": "Username (3+ chars, alphanumeric with dots)" + }, + "email": { + "type": "string", + "format": "email", + "description": "User email address" + }, + "avatar": { + "type": "string", + "description": "Avatar file path" + }, + "verified": { + "type": "boolean", + "description": "Email verification status" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "UserCreateInput": { + "type": "object", + "required": [ + "username", + "email", + "password" + ], + "properties": { + "username": { + "type": "string", + "minLength": 3, + "pattern": "^\\w[\\w\\.]*$", + "description": "Username (3+ chars, starts with word char)" + }, + "email": { + "type": "string", + "format": "email", + "description": "User email address" + }, + "password": { + "type": "string", + "minLength": 8, + "maxLength": 72, + "description": "Password (8-72 chars)" + }, + "passwordConfirm": { + "type": "string", + "description": "Password confirmation (must match password)" + } + } + }, + "UserUpdateInput": { + "type": "object", + "properties": { + "username": { + "type": "string", + "minLength": 3, + "pattern": "^\\w[\\w\\.]*$" + }, + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string", + "minLength": 8, + "maxLength": 72 + }, + "oldPassword": { + "type": "string", + "description": "Required when changing password" + }, + "passwordConfirm": { + "type": "string", + "description": "Must match password" + } + } + }, + "Tag": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "string", + "description": "Tag ID (15 chars)" + }, + "name": { + "type": "string", + "description": "Tag name" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "TagInput": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Tag name" + } + } + }, + "TagUpdateInput": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tag name" + } + } + }, + "Trail": { + "type": "object", + "required": [ + "id", + "name", + "author", + "public" + ], + "properties": { + "id": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "name": { + "type": "string", + "description": "Trail name" + }, + "description": { + "type": "string" + }, + "location": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID" + }, + "date": { + "type": "string", + "format": "date" + }, + "public": { + "type": "boolean" + }, + "difficulty": { + "type": "string", + "enum": [ + "easy", + "moderate", + "difficult" + ] + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance": { + "type": "number", + "description": "Distance in meters" + }, + "elevation_gain": { + "type": "number", + "description": "Elevation gain in meters" + }, + "elevation_loss": { + "type": "number", + "description": "Elevation loss in meters" + }, + "duration": { + "type": "number", + "description": "Duration in seconds" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "thumbnail": { + "type": "integer", + "description": "Index of thumbnail photo" + }, + "like_count": { + "type": "integer", + "default": 0 + }, + "category": { + "type": "string", + "description": "Category ID (15 chars)" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "gpx": { + "type": "string", + "description": "GPX file path" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "TrailCreateInput": { + "type": "object", + "required": [ + "name", + "author", + "public" + ], + "properties": { + "id": { + "type": "string", + "description": "Optional custom ID (15 chars)" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "description": { + "type": "string" + }, + "location": { + "type": "string" + }, + "date": { + "type": "string", + "format": "date" + }, + "public": { + "type": "boolean" + }, + "difficulty": { + "type": "string", + "enum": [ + "easy", + "moderate", + "difficult" + ] + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "thumbnail": { + "type": "integer" + }, + "like_count": { + "type": "integer", + "default": 0 + }, + "category": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "gpx": { + "type": "string" + } + } + }, + "TrailUpdateInput": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "location": { + "type": "string" + }, + "date": { + "type": "string", + "format": "date" + }, + "public": { + "type": "boolean" + }, + "difficulty": { + "type": "string", + "enum": [ + "easy", + "moderate", + "difficult" + ] + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "photos-": { + "type": "string", + "description": "Remove photo by name" + }, + "photos+": { + "type": "string", + "description": "Add photo by name" + }, + "thumbnail": { + "type": "integer" + }, + "like_count": { + "type": "integer", + "default": 0 + }, + "category": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "gpx": { + "type": "string" + } + } + }, + "Comment": { + "type": "object", + "required": [ + "id", + "text", + "author", + "trail" + ], + "properties": { + "id": { + "type": "string", + "description": "Comment ID (15 chars)" + }, + "text": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "CommentInput": { + "type": "object", + "required": [ + "text", + "author", + "trail" + ], + "properties": { + "text": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + } + } + }, + "CommentUpdateInput": { + "type": "object", + "properties": { + "text": { + "type": "string" + } + } + }, + "SummitLog": { + "type": "object", + "required": [ + "id", + "date", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Summit log ID (15 chars)" + }, + "date": { + "type": "string", + "format": "date" + }, + "text": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Associated trail ID" + }, + "gpx": { + "type": "string" + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "SummitLogInput": { + "type": "object", + "required": [ + "date", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Optional custom ID (15 chars)" + }, + "date": { + "type": "string", + "format": "date" + }, + "text": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "gpx": { + "type": "string" + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + } + }, + "SummitLogUpdateInput": { + "type": "object", + "properties": { + "date": { + "type": "string", + "format": "date" + }, + "text": { + "type": "string" + }, + "gpx": { + "type": "string" + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "photos-": { + "type": "string", + "description": "Remove photo by name" + }, + "photos+": { + "type": "string", + "description": "Add photo by name" + } + } + }, + "Waypoint": { + "type": "object", + "required": [ + "id", + "lat", + "lon", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Waypoint ID (15 chars)" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance_from_start": { + "type": "number", + "description": "Distance from trail start in meters" + }, + "icon": { + "type": "string", + "description": "Icon identifier" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "WaypointInput": { + "type": "object", + "required": [ + "lat", + "lon", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Optional custom ID (15 chars)" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance_from_start": { + "type": "number" + }, + "icon": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "trail": { + "type": "string" + } + } + }, + "WaypointUpdateInput": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance_from_start": { + "type": "number" + }, + "icon": { + "type": "string" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "photos-": { + "type": "string", + "description": "Remove photo by name" + }, + "photos+": { + "type": "string", + "description": "Add photo by name" + } + } + }, + "List": { + "type": "object", + "required": [ + "id", + "name", + "author", + "public" + ], + "properties": { + "id": { + "type": "string", + "description": "List ID (15 chars)" + }, + "name": { + "type": "string" + }, + "public": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID" + }, + "trails": { + "type": "array", + "items": { + "type": "string", + "description": "Trail IDs (15 chars)" + } + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "ListInput": { + "type": "object", + "required": [ + "name", + "public", + "trails", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Optional custom ID (15 chars)" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "public": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "trails": { + "type": "array", + "items": { + "type": "string", + "description": "Trail ID (15 chars)" + } + }, + "author": { + "type": "string" + } + } + }, + "ListUpdateInput": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "public": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "trails": { + "type": "array", + "items": { + "type": "string" + } + }, + "trails-": { + "type": "string", + "description": "Remove trail by ID" + }, + "trails+": { + "type": "string", + "description": "Add trail by ID" + } + } + }, + "TrailShare": { + "type": "object", + "required": [ + "id", + "actor", + "trail", + "permission" + ], + "properties": { + "id": { + "type": "string", + "description": "Share ID (15 chars)" + }, + "actor": { + "type": "string", + "format": "uri", + "description": "ActivityPub actor IRI" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "TrailShareInput": { + "type": "object", + "required": [ + "actor", + "trail", + "permission" + ], + "properties": { + "actor": { + "type": "string", + "format": "uri", + "description": "ActivityPub actor IRI" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "TrailShareUpdateInput": { + "type": "object", + "required": [ + "permission" + ], + "properties": { + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "ListShare": { + "type": "object", + "required": [ + "id", + "actor", + "list", + "permission" + ], + "properties": { + "id": { + "type": "string", + "description": "Share ID (15 chars)" + }, + "actor": { + "type": "string", + "format": "uri", + "description": "ActivityPub actor IRI" + }, + "list": { + "type": "string", + "description": "List ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "ListShareInput": { + "type": "object", + "required": [ + "actor", + "list", + "permission" + ], + "properties": { + "actor": { + "type": "string", + "format": "uri", + "description": "ActivityPub actor IRI" + }, + "list": { + "type": "string", + "description": "List ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "ListShareUpdateInput": { + "type": "object", + "required": [ + "permission" + ], + "properties": { + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "TrailLinkShare": { + "type": "object", + "required": [ + "id", + "trail", + "permission" + ], + "properties": { + "id": { + "type": "string", + "description": "Share ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "TrailLinkShareInput": { + "type": "object", + "required": [ + "trail", + "permission" + ], + "properties": { + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "TrailLinkShareUpdateInput": { + "type": "object", + "required": [ + "permission" + ], + "properties": { + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "TrailLike": { + "type": "object", + "required": [ + "id", + "actor", + "trail" + ], + "properties": { + "id": { + "type": "string", + "description": "Like ID (15 chars)" + }, + "actor": { + "type": "string", + "description": "User ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "created": { + "type": "string", + "format": "date-time" + } + } + }, + "TrailLikeInput": { + "type": "object", + "required": [ + "actor", + "trail" + ], + "properties": { + "actor": { + "type": "string", + "description": "User ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + } + } + }, + "Follow": { + "type": "object", + "required": [ + "id", + "follower", + "followee" + ], + "properties": { + "id": { + "type": "string", + "description": "Follow ID (15 chars)" + }, + "follower": { + "type": "string", + "description": "Follower user ID" + }, + "followee": { + "type": "string", + "description": "Followee user ID (15 chars)" + }, + "created": { + "type": "string", + "format": "date-time" + } + } + }, + "FollowInput": { + "type": "object", + "required": [ + "followee" + ], + "properties": { + "followee": { + "type": "string", + "description": "Followee user ID (15 chars)" + } + } + }, + "Integration": { + "type": "object", + "required": [ + "id", + "user" + ], + "properties": { + "id": { + "type": "string", + "description": "Integration ID (15 chars)" + }, + "user": { + "type": "string", + "description": "User ID (15 chars)" + }, + "strava": { + "type": "object", + "properties": { + "clientId": { + "type": "integer" + }, + "clientSecret": { + "type": "string" + }, + "routes": { + "type": "boolean" + }, + "activities": { + "type": "boolean" + }, + "active": { + "type": "boolean" + }, + "after": { + "type": "string", + "format": "date" + }, + "privacy": { + "type": "string", + "enum": [ + "original", + "settings" + ] + } + } + }, + "komoot": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string" + }, + "completed": { + "type": "boolean" + }, + "planned": { + "type": "boolean" + }, + "active": { + "type": "boolean" + }, + "privacy": { + "type": "string", + "enum": [ + "original", + "settings" + ] + } + } + }, + "hammerhead": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string" + }, + "completed": { + "type": "boolean" + }, + "planned": { + "type": "boolean" + }, + "active": { + "type": "boolean" + }, + "after": { + "type": "string", + "format": "date" + } + } + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "IntegrationInput": { + "type": "object", + "required": [ + "user" + ], + "properties": { + "user": { + "type": "string", + "description": "User ID (15 chars)" + }, + "strava": { + "type": "object" + }, + "komoot": { + "type": "object" + }, + "hammerhead": { + "type": "object" + } + } + }, + "IntegrationUpdateInput": { + "type": "object", + "properties": { + "strava": { + "type": "object", + "nullable": true + }, + "komoot": { + "type": "object", + "nullable": true + }, + "hammerhead": { + "type": "object", + "nullable": true + } + } + }, + "Notification": { + "type": "object", + "required": [ + "id", + "user", + "type", + "seen" + ], + "properties": { + "id": { + "type": "string", + "description": "Notification ID (15 chars)" + }, + "user": { + "type": "string", + "description": "User ID (15 chars)" + }, + "type": { + "type": "string", + "description": "Notification type" + }, + "seen": { + "type": "boolean", + "default": false + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "NotificationUpdateInput": { + "type": "object", + "required": [ + "seen" + ], + "properties": { + "seen": { + "type": "boolean", + "const": true, + "description": "Mark as read" + } + } + }, + "Settings": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "Settings ID (15 chars)" + }, + "unit": { + "type": "string", + "enum": [ + "metric", + "imperial" + ] + }, + "language": { + "type": "string", + "description": "Language code" + }, + "bio": { + "type": "string", + "nullable": true + }, + "mapFocus": { + "type": "string", + "enum": [ + "trails", + "location" + ] + }, + "location": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "lat": { + "type": "number" + }, + "lon": { + "type": "number" + } + }, + "nullable": true + }, + "category": { + "type": "string" + }, + "tilesets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + } + } + }, + "nullable": true + }, + "terrain": { + "type": "object", + "properties": { + "terrain": { + "type": "string", + "format": "uri" + }, + "hillshading": { + "type": "string", + "format": "uri" + } + }, + "nullable": true + }, + "user": { + "type": "string" + }, + "privacy": { + "type": "object", + "properties": { + "account": { + "type": "string", + "enum": [ + "public", + "private" + ] + }, + "trails": { + "type": "string", + "enum": [ + "public", + "private" + ] + }, + "lists": { + "type": "string", + "enum": [ + "public", + "private" + ] + } + }, + "nullable": true + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "SettingsInput": { + "type": "object", + "properties": { + "unit": { + "type": "string", + "enum": [ + "metric", + "imperial" + ] + }, + "language": { + "type": "string" + }, + "bio": { + "type": "string", + "nullable": true + }, + "mapFocus": { + "type": "string", + "enum": [ + "trails", + "location" + ] + }, + "location": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "lat": { + "type": "number" + }, + "lon": { + "type": "number" + } + }, + "nullable": true + }, + "category": { + "type": "string" + }, + "tilesets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + } + } + }, + "nullable": true + }, + "terrain": { + "type": "object", + "properties": { + "terrain": { + "type": "string", + "format": "uri" + }, + "hillshading": { + "type": "string", + "format": "uri" + } + }, + "nullable": true + }, + "user": { + "type": "string" + }, + "privacy": { + "type": "object", + "properties": { + "account": { + "type": "string", + "enum": [ + "public", + "private" + ] + }, + "trails": { + "type": "string", + "enum": [ + "public", + "private" + ] + }, + "lists": { + "type": "string", + "enum": [ + "public", + "private" + ] + } + }, + "nullable": true + } + } + }, + "ListResult": { + "type": "object", + "properties": { + "page": { + "type": "integer" + }, + "perPage": { + "type": "integer" + }, + "totalItems": { + "type": "integer" + }, + "totalPages": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "Error": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + }, + "code": { + "type": "integer" + }, + "data": { + "type": "object" + } + } + } + } + } +} \ No newline at end of file diff --git a/docs/wanderer.openapi.yaml b/docs/wanderer.openapi.yaml deleted file mode 100644 index c7c89f2c..00000000 --- a/docs/wanderer.openapi.yaml +++ /dev/null @@ -1,18486 +0,0 @@ -{ - "openapi": "3.0.1", - "info": { - "title": "wanderer", - "description": "", - "version": "1.0.0" - }, - "tags": [ - { - "name": "auth" - }, - { - "name": "category" - }, - { - "name": "comment" - }, - { - "name": "follow" - }, - { - "name": "trail-share" - }, - { - "name": "user" - }, - { - "name": "waypoint" - }, - { - "name": "list" - }, - { - "name": "list-share" - }, - { - "name": "notification" - }, - { - "name": "summit-log" - }, - { - "name": "trail" - } - ], - "paths": { - "/activitypub/activity/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "", - "required": true, - "example": "", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "actor": { - "type": "string" - }, - "type": { - "type": "string" - }, - "to": { - "type": "array", - "items": { - "type": "string" - } - }, - "cc": { - "type": "string" - }, - "published": { - "type": "string" - }, - "object": { - "type": "object", - "properties": {}, - "description": "ActivityPub object" - } - }, - "required": [ - "id", - "actor", - "to", - "cc", - "published", - "object", - "type" - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/comment/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "", - "required": true, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "type": { - "type": "string" - }, - "content": { - "type": "string" - }, - "attributedTo": { - "type": "string" - }, - "inReplyTo": { - "type": "string" - }, - "published": { - "type": "string" - } - }, - "required": [ - "@context", - "id", - "type", - "content", - "attributedTo", - "inReplyTo", - "published" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "id": "https://demo.wanderer.to/api/v1/comment/32wf88038cb800i", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Ja, echt toll!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af", - "published": "2025-06-18T18:48:15Z" - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/trail/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "", - "required": true, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "content": { - "type": "string" - }, - "attachment": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "mediaType": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "type", - "mediaType", - "url" - ] - } - }, - "attributedTo": { - "type": "string" - }, - "location": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "latitude": { - "type": "number" - }, - "longitude": { - "type": "number" - } - }, - "required": [ - "type", - "name", - "latitude", - "longitude" - ] - }, - "tag": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "content": { - "type": "string" - } - }, - "required": [ - "type", - "name", - "content" - ] - } - }, - "url": { - "type": "string" - }, - "published": { - "type": "string" - }, - "startTime": { - "type": "string" - } - }, - "required": [ - "@context", - "id", - "type", - "name", - "content", - "attachment", - "attributedTo", - "location", - "tag", - "url", - "published", - "startTime" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "id": "https://demo.wanderer.to/api/v1/trail/2ce3af7a2e80f52", - "type": "Note", - "name": "12 days in the Zugspitz region on the peak hiking trail", - "content": "

12 days in the Zugspitz region on the peak hiking trail

https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/route_ldv172t0my.webp" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/12_days_in_the_zugspitz_region_on_the_peak_hiking_trail_5ts04zgsuk.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Murnau am Staffelsee, Bayern, Deutschland", - "latitude": 47.678592, - "longitude": 11.196068 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "8902.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "8906.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "202403.824936m" - }, - { - "type": "Note", - "name": "duration", - "content": "4037.183333m" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52", - "published": "2025-06-17T21:40:02Z", - "startTime": "2025-06-14T00:00:00Z" - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}/followers": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "partOf": { - "type": "string" - }, - "totalItems": { - "type": "integer" - }, - "orderedItems": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "@context", - "type", - "first", - "partOf", - "totalItems", - "orderedItems" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "type": "OrderedCollectionPage", - "first": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers?page=1", - "partOf": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "totalItems": 3, - "orderedItems": [ - "https://social.tchncs.de/users/flomp", - "https://trails.magdeburg.jetzt/api/v1/activitypub/user/momar", - "https://darmstadt.social/users/stormii" - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}/outbox": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "next": { - "type": "string" - }, - "partOf": { - "type": "string" - }, - "totalItems": { - "type": "integer" - }, - "orderedItems": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "actor": { - "type": "string" - }, - "type": { - "type": "string" - }, - "to": { - "type": "array", - "items": { - "type": "string" - } - }, - "cc": { - "type": "array", - "items": { - "type": "string" - } - }, - "published": { - "type": "string" - }, - "object": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - }, - "content": { - "type": "string" - }, - "attachment": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "mediaType": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "type", - "mediaType", - "url" - ] - } - }, - "attributedTo": { - "type": "string" - }, - "inReplyTo": { - "type": "string" - }, - "tag": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "content": { - "type": "string" - }, - "id": { - "type": "string" - }, - "href": { - "type": "string" - } - }, - "required": [ - "type", - "name", - "content", - "id", - "href" - ] - } - }, - "url": { - "type": "string" - }, - "published": { - "type": "string" - }, - "startTime": { - "type": "string" - }, - "name": { - "type": "string" - }, - "location": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "latitude": { - "type": "number" - }, - "longitude": { - "type": "number" - } - }, - "required": [ - "type", - "name", - "latitude", - "longitude" - ] - } - }, - "required": [ - "id", - "type", - "name", - "content", - "attachment", - "attributedTo", - "location", - "tag", - "url", - "published", - "startTime" - ] - } - }, - "required": [ - "id", - "actor", - "type", - "to", - "cc", - "published", - "object" - ] - } - } - }, - "required": [ - "@context", - "type", - "first", - "next", - "partOf", - "totalItems", - "orderedItems" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "type": "OrderedCollectionPage", - "first": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox?page=1", - "next": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox?page=2", - "partOf": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox", - "totalItems": 21, - "orderedItems": [ - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/ypx6zhvsaonmkos", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": "https://www.w3.org/ns/activitystreams#Public", - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "https://social.tchncs.de/users/flomp/inbox" - ], - "published": "2025-06-18 18:50:02.518Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/summit-log/75md7yw7099j5rh", - "type": "Note", - "content": "

@flomp@social.tchncs.de

", - "attachment": [], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af", - "tag": [ - { - "type": "Note", - "name": "elevation_gain", - "content": "0.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "0.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "0.000000m" - }, - { - "type": "Note", - "name": "duration", - "content": "0.000000m" - }, - { - "id": "https://social.tchncs.de/users/flomp", - "type": "Mention", - "name": "@flomp@social.tchncs.de", - "href": "https://social.tchncs.de/users/flomp" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/23fd1747a29c3af", - "published": "2025-06-18T18:50:02Z", - "startTime": "2025-06-18T00:00:00Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/k6h3nxcgcg8ztjt", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://social.tchncs.de/users/flomp/inbox", - "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox" - ], - "published": "2025-06-18 18:48:15.481Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/comment/32wf88038cb800i", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Ja, echt toll!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af", - "tag": [ - { - "id": "https://social.tchncs.de/users/flomp", - "type": "Mention", - "name": "@flomp@social.tchncs.de", - "href": "https://social.tchncs.de/users/flomp" - } - ], - "published": "2025-06-18T18:48:15Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/ll0f2ectiohy55d", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "https://social.tchncs.de/users/flomp/inbox" - ], - "published": "2025-06-18 18:46:54.717Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af", - "type": "Note", - "name": "Radfernweg Berlin-Usedom", - "content": "

Radfernweg Berlin-Usedom

Auf nach Usedom!

@flomp@social.tchncs.de

https://demo.wanderer.to/trail/view/@demo/23fd1747a29c3af

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/23fd1747a29c3af/default_thumbnail_fz982rp32o.webp" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/23fd1747a29c3af/radfernweg_berlin_usedom_c1ftlwpxqq.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Berlin, Deutschland", - "latitude": 52.516379, - "longitude": 13.402514 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "1755.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "1795.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "340287.513156m" - }, - { - "type": "Note", - "name": "duration", - "content": "1298.616667m" - }, - { - "id": "https://social.tchncs.de/users/flomp", - "type": "Mention", - "name": "@flomp@social.tchncs.de", - "href": "https://social.tchncs.de/users/flomp" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/23fd1747a29c3af", - "published": "2025-06-18T18:46:54Z", - "startTime": "2020-07-27T00:00:00Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/2ok0a8jk137niua", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://social.tchncs.de/users/flomp/inbox", - "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox" - ], - "published": "2025-06-18 14:38:11.150Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/comment/i2xy97z4kmy8wj5", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Genau!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/c7fba19d7f3121e", - "published": "2025-06-18T14:38:11Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/um1cjums1ls0vhr", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers" - ], - "published": "2025-06-18 14:37:03.367Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/trail/c7fba19d7f3121e", - "type": "Note", - "name": "Herzogstand", - "content": "Schöne Route

https://demo.wanderer.to/trail/view/@demo/c7fba19d7f3121e

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/c7fba19d7f3121e/bard_bunny_fkdoahvxn3.svg" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/c7fba19d7f3121e/herzogstand_8itqbamj9j.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Kochel am See, Bayern, Deutschland", - "latitude": 47.62039, - "longitude": 11.34908 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "950.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "950.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "14040.219641m" - }, - { - "type": "Note", - "name": "duration", - "content": "84.333333m" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/c7fba19d7f3121e", - "published": "2025-06-18T14:37:03Z", - "startTime": "2010-01-01T00:00:00Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/zhum5i1znle0u5s", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://social.tchncs.de/users/flomp/inbox", - "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox" - ], - "published": "2025-06-18 14:32:29.664Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/comment/9jk7qjtv177hlf2", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Stimmt!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/activitypub/trail/2ce3af7a2e80f52", - "published": "2025-06-18T14:32:29Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/8zcj46423elzpbk", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://social.tchncs.de/users/flomp/inbox", - "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox" - ], - "published": "2025-06-18 14:05:12.530Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/comment/lf95x0w2h0s51l3", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Stimmt, echt lang!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/2ce3af7a2e80f52", - "published": "2025-06-18T14:05:12Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/wokmv9tfpu7uvm7", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers" - ], - "published": "2025-06-18 09:12:01.344Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/activitypub/trail/a0965dc31384a2b", - "type": "Note", - "name": "test", - "content": "

https://demo.wanderer.to/trail/view/@demo/a0965dc31384a2b

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/a0965dc31384a2b/route_zqddtv52qk.webp" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/a0965dc31384a2b/blob_vxtu95acms.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Prien am Chiemsee, Bavaria, Germany", - "latitude": 47.858914, - "longitude": 12.364729 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "259.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "185.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "16314.394386m" - }, - { - "type": "Note", - "name": "duration", - "content": "94.749000m" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/a0965dc31384a2b", - "published": "2025-06-18T09:12:01Z", - "startTime": "2025-06-18T00:00:00Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/fgizij4fvb9s5v6", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo" - ], - "published": "2025-06-17 21:53:23.738Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/activitypub/comment/3tn68g135406duj", - "type": "Note", - "content": "

Ja, ist echt so!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/activitypub/trail/2ce3af7a2e80f52", - "published": "2025-06-17T21:53:23Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/nix8x5h1hvh75bf", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers" - ], - "published": "2025-06-17 21:40:02.336Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/activitypub/trail/2ce3af7a2e80f52", - "type": "Note", - "name": "12 days in the Zugspitz region on the peak hiking trail", - "content": "

https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/route_ldv172t0my.webp" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/12_days_in_the_zugspitz_region_on_the_peak_hiking_trail_5ts04zgsuk.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Murnau am Staffelsee, Bayern, Deutschland", - "latitude": 47.678592, - "longitude": 11.196068 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "8902.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "8906.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "202403.824936m" - }, - { - "type": "Note", - "name": "duration", - "content": "4037.183333m" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52", - "published": "2025-06-17T21:40:02Z", - "startTime": "2025-06-14T00:00:00Z" - } - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}/inbox": { - "post": { - "summary": "show", - "deprecated": false, - "description": "Expects a valid, signed ActivityPub activity as json input", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": {} - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": {} - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}/following": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "partOf": { - "type": "string" - }, - "totalItems": { - "type": "integer" - }, - "orderedItems": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "@context", - "type", - "first", - "partOf", - "totalItems", - "orderedItems" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "type": "OrderedCollectionPage", - "first": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers?page=1", - "partOf": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "totalItems": 3, - "orderedItems": [ - "https://social.tchncs.de/users/flomp", - "https://trails.magdeburg.jetzt/api/v1/activitypub/user/momar", - "https://darmstadt.social/users/stormii" - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "type": { - "type": "string" - }, - "inbox": { - "type": "string" - }, - "outbox": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "name": { - "type": "string" - }, - "preferredUsername": { - "type": "string" - }, - "followers": { - "type": "string" - }, - "following": { - "type": "string" - }, - "url": { - "type": "string" - }, - "published": { - "type": "string" - }, - "icon": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "type", - "url" - ] - }, - "publicKey": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "owner": { - "type": "string" - }, - "publicKeyPem": { - "type": "string" - } - }, - "required": [ - "id", - "owner", - "publicKeyPem" - ] - } - }, - "required": [ - "@context", - "id", - "type", - "inbox", - "outbox", - "summary", - "name", - "preferredUsername", - "followers", - "following", - "url", - "published", - "icon", - "publicKey" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "id": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Person", - "inbox": "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox", - "outbox": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox", - "summary": "Born the day we installed the site.", - "name": "demo", - "preferredUsername": "demo", - "followers": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "following": "https://demo.wanderer.to/api/v1/activitypub/user/demo/following", - "url": "https://demo.wanderer.to/profile/@demo", - "published": "2025-05-05T15:07:59.943Z", - "icon": { - "type": "Image", - "url": "https://demo.wanderer.to/api/v1/files/users/26b1si1344ficl6/wlezq_um7vh2722q.jpg" - }, - "publicKey": { - "id": "https://demo.wanderer.to/api/v1/activitypub/user/demo#main-key", - "owner": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0xyaRWP5X955bwSnUbr\nmwEF/2Fdmn5nlRRmEvej1BR0oBcPMVPYrrK4sz37mrAJ7Wbmg4KjmSDEROD4sApr\nM5FmKeU1OBsV2O3bL1DSW/8PXaf4JQRgl0AO+LiSAd7A/GO0viAzJXyJT4Rpaamf\n8Naclh7YR5E4JXrsjahPEWtUWcQ4g8Yhc6n2ptQ33ACI7Q1R3+U7q1tMaRCKAbdT\nbRahzqGs3iSxV+FjnsMR109KqDQJDMjwRB11USJTA4/nMpV6w8RS+171xNHl12Sg\nGpiuusmXMYYuoECdKDtLY7AsntusYMzXUjPzKfE+5EqPmIj5OTbg3A24p9hWIv5s\nmwIDAQAB\n-----END PUBLIC KEY-----\n" - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/auth/login": { - "post": { - "summary": "login", - "deprecated": false, - "description": "Authenticates a registered user. The session is returned in a cookie named `pb_auth`. You need to include this cookie in subsequent requests.", - "operationId": "login", - "tags": [ - "auth" - ], - "parameters": [ - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "username": { - "type": "string", - "minLength": 3 - }, - "password": { - "type": "string", - "minLength": 8 - } - }, - "required": [ - "username", - "password" - ] - }, - "example": { - "username": "admin", - "password": "12345678" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "record": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "email": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "collectionId", - "collectionName", - "created", - "email", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "token": { - "type": "string" - } - }, - "required": [ - "record", - "token" - ] - }, - "example": { - "record": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "email": "notmymail@googlemail.com", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - }, - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MzY4MDEwMjksImlkIjoiM211Z2Y5NTN3NGE5Zmc1IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.LBMx7FuCR4eRC6zG96TDX6BfEKMHBoo-9eQ9LvpU0rg" - } - } - }, - "headers": { - "set-cookie": { - "example": "pb_auth=%7B%22token%22%3A%22eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MzcxMjY5MjQsImlkIjoiM211Z2Y5NTN3NGE5Zmc1IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.F-gRu-w_oUvt9GqjjGKZe18smdhtMO6oYhB36KJ5odo%22%2C%22model%22%3A%7B%22avatar%22%3A%2223xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg%22%2C%22bio%22%3A%22Enim%20beatae%20labore%20vel.%20Pariatur%20hic%20doloribus%20quia%20quasi%20eos.%20Cumque%20error%20nobis.%22%2C%22collectionId%22%3A%22_pb_users_auth_%22%2C%22collectionName%22%3A%22users%22%2C%22created%22%3A%222024-06-29%2019%3A23%3A47.731Z%22%2C%22email%22%3A%22mymail%40gmail.com%22%2C%22emailVisibility%22%3Afalse%2C%22id%22%3A%223mugf953w4a9fg5%22%2C%22token%22%3A%22eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA%22%2C%22updated%22%3A%222025-01-03%2012%3A32%3A15.270Z%22%2C%22username%22%3A%22Flomp%22%2C%22verified%22%3Atrue%7D%7D; Path=/; Expires=Fri, 17 Jan 2025 15:15:24 GMT; SameSite=Strict", - "required": false, - "description": "Contains the authentication cookie", - "schema": { - "type": "string" - } - } - } - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to authenticate.", - "detail": { - "code": 400, - "message": "Failed to authenticate.", - "data": {} - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "undefined", - "path": [ - "password" - ], - "message": "Required" - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid JSON": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ] - }, - "example": { - "message": "invalid_json" - } - } - }, - "headers": {} - } - }, - "security": [] - } - }, - "/category": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all categories.", - "operationId": "listCategories", - "tags": [ - "category" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "name=\"abc\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "id", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "img": { - "type": "string" - }, - "name": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "img", - "name", - "updated" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "example": { - "page": 1, - "perPage": 5, - "totalItems": 6, - "totalPages": 2, - "items": [ - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.632Z", - "id": "8m2qclsl6p8at9k", - "img": "hiking_EwOAWJFKCg.jpg", - "name": "Hiking", - "updated": "2024-06-29 19:23:12.632Z" - }, - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.648Z", - "id": "x5y2ikswxzoznek", - "img": "walking_YOtlMqoDps.jpg", - "name": "Walking", - "updated": "2024-06-29 19:23:12.648Z" - }, - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.658Z", - "id": "9ecf7bunl88bt4k", - "img": "climbing_vRyCdFwURk.jpg", - "name": "Climbing", - "updated": "2024-06-29 19:23:12.658Z" - }, - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.669Z", - "id": "pbwx1lg2nmcih0w", - "img": "skiing_KdUASbxv4C.jpg", - "name": "Skiing", - "updated": "2024-06-29 19:23:12.669Z" - }, - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.679Z", - "id": "7sqwezntokmbvdr", - "img": "canoeing_QBmwxRx6uh.jpg", - "name": "Canoeing", - "updated": "2024-06-29 19:23:12.679Z" - } - ] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 0, - "type": "number", - "inclusive": false, - "exact": false, - "message": "Number must be greater than 0", - "path": [ - "page" - ] - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - } - }, - "/comment": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all comments.", - "operationId": "listComments", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "text=\"abc\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "trail", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "iri": { - "type": "string" - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "id", - "iri", - "text", - "trail", - "updated" - ] - } - }, - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - } - }, - "required": [ - "items", - "page", - "perPage", - "totalItems", - "totalPages" - ] - }, - "example": { - "items": [ - { - "author": "8uvv7d6dh667xh1", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-05-27 07:58:10.194Z", - "id": "224z7nsu3m35b6k", - "iri": "", - "text": "https://readerclub.my.id/book.php?isbn=216156650-rewind-it-back", - "trail": "072fba5eaee0e2b", - "updated": "2025-05-27 07:58:10.194Z" - }, - { - "author": "l1a076cl9w16g9b", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-06-17 21:40:20.796Z", - "id": "2wrgay454lu7t08", - "iri": "https://social.tchncs.de/users/flomp/statuses/114700872618854877", - "text": "

@demo

Ganz schön lang!

", - "trail": "2ce3af7a2e80f52", - "updated": "2025-06-17 21:40:20.796Z" - }, - { - "author": "pnat0l9g6p3nh2a", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-05-31 14:14:40.077Z", - "id": "30h73u05t60ku3u", - "iri": "", - "text": "Fixe!", - "trail": "c0ec3039d47cc48", - "updated": "2025-05-31 14:14:40.077Z" - }, - { - "author": "pnat0l9g6p3nh2a", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-06-18 18:48:15.477Z", - "id": "32wf88038cb800i", - "iri": "", - "text": "

@flomp@social.tchncs.de

Ja, echt toll!

", - "trail": "23fd1747a29c3af", - "updated": "2025-06-18 18:48:15.477Z" - }, - { - "author": "pnat0l9g6p3nh2a", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-05-31 13:01:03.235Z", - "id": "5nm8og6umaiipc8", - "iri": "", - "text": "stuff", - "trail": "8beaf58dbf3ce95", - "updated": "2025-05-31 13:01:03.235Z" - } - ], - "page": 1, - "perPage": 5, - "totalItems": 14, - "totalPages": 3 - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 0, - "type": "number", - "inclusive": false, - "exact": false, - "message": "Number must be greater than 0", - "path": [ - "page" - ] - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a comment. ", - "operationId": "createComment", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string", - "minLength": 15, - "maxLength": 15 - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - "required": [ - "text", - "author", - "trail" - ] - }, - "example": { - "text": "test", - "trail": "3zdz20mt9243f60", - "author": "z014o6bpcg680mg" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "trail": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - } - }, - "required": [ - "author", - "trail" - ] - }, - "id": { - "type": "string" - }, - "rating": { - "type": "integer" - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "expand", - "id", - "rating", - "text", - "trail", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-01-02 20:48:00.278Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - }, - "trail": { - "author": "3mugf953w4a9fg5", - "category": "pbwx1lg2nmcih0w", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-12-30 18:57:35.453Z", - "date": "2024-12-30 00:00:00.000Z", - "description": "", - "difficulty": "moderate", - "distance": 5631.307320599051, - "duration": 0, - "elevation_gain": 76, - "elevation_loss": 76, - "gpx": "blob_0E0x721wan.gpx", - "id": "z94vgei3jdc37k4", - "lat": 47.385232, - "location": "", - "lon": 9.655863, - "name": "Die Pottsau", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_2SQmCCI6DV.jpg", - "caret_right_solid_9154Rrvk6B.svg" - ], - "public": false, - "summit_logs": [ - "95bb1d77c8dfa98" - ], - "thumbnail": 1, - "updated": "2024-12-30 18:59:56.924Z", - "waypoints": [ - "7f6d2a8c9d50136", - "60c2d435a5b66ed" - ] - } - }, - "id": "sv3finqrp3951av", - "rating": 0, - "text": "API comment", - "trail": "z94vgei3jdc37k4", - "updated": "2025-01-02 20:48:00.278Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/comment/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single comment.", - "operationId": "showComment", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "iri": { - "type": "string" - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "id", - "iri", - "text", - "trail", - "updated" - ] - }, - "example": { - "author": "pnat0l9g6p3nh2a", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-06-18 18:48:15.477Z", - "id": "32wf88038cb800i", - "iri": "", - "text": "

@flomp@social.tchncs.de

Ja, echt toll!

", - "trail": "23fd1747a29c3af", - "updated": "2025-06-18 18:48:15.477Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a comment.", - "operationId": "updateComment", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "author": { - "type": "string" - } - }, - "required": [ - "text", - "trail", - "author" - ] - }, - "example": "" - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "rating": { - "type": "integer" - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "id", - "rating", - "text", - "trail", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-01-02 20:43:00.030Z", - "id": "tmof4bjvtw0sqqu", - "rating": 0, - "text": "API comment updated", - "trail": "z94vgei3jdc37k4", - "updated": "2025-01-02 21:00:03.866Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a comment.", - "operationId": "deleteComment", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/follow": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all follows.", - "operationId": "listFollows", - "tags": [ - "follow" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "follower=\"3mugf953w4a9fg5\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "follower", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - }, - { - "name": "type", - "in": "query", - "description": "Return followers or following", - "required": true, - "schema": { - "type": "string", - "enum": [ - "followers", - "following" - ] - } - }, - { - "name": "handle", - "in": "query", - "description": "Handle of the actor in question (@user@domain)", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "followee": { - "type": "string" - }, - "follower": { - "type": "string" - }, - "id": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "follower": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - }, - "followee": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "follower", - "followee" - ] - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "followee", - "follower", - "id", - "updated", - "expand" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "example": { - "page": 1, - "perPage": 5, - "totalItems": 1, - "totalPages": 1, - "items": [ - { - "collectionId": "8obn1ukumze565i", - "collectionName": "follows", - "created": "2024-12-20 23:22:18.445Z", - "followee": "3mugf953w4a9fg5", - "follower": "znhd3hgrxl85c9f", - "id": "xajdtx5j8l10wov", - "updated": "2024-12-20 23:22:18.445Z", - "expand": { - "follower": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - }, - "followee": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 0, - "type": "number", - "inclusive": false, - "exact": false, - "message": "Number must be greater than 0", - "path": [ - "page" - ] - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a follow.", - "operationId": "createFollow", - "tags": [ - "follow" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "follower": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id of person following" - }, - "followee": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id of person being followed" - } - }, - "required": [ - "follower", - "followee" - ] - }, - "example": { - "text": "test", - "trail": "3zdz20mt9243f60", - "author": "z014o6bpcg680mg" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "follower": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - } - }, - "required": [ - "follower" - ] - }, - "followee": { - "type": "string" - }, - "follower": { - "type": "string" - }, - "id": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "expand", - "followee", - "follower", - "id", - "updated" - ] - }, - "example": { - "collectionId": "8obn1ukumze565i", - "collectionName": "follows", - "created": "2025-01-02 22:01:46.741Z", - "expand": { - "follower": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - } - }, - "followee": "znhd3hgrxl85c9f", - "follower": "3mugf953w4a9fg5", - "id": "0vfwhxsdvhf2jn5", - "updated": "2025-01-02 22:01:46.741Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "followee" - ] - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/follow/{id}": { - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a follow.", - "operationId": "deleteFollow", - "tags": [ - "follow" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Follow Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail-share": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all trail-shares.", - "operationId": "listTrailShares", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "permission=\"view\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "user", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "user": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "user" - ] - } - } - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 30, - "totalPages": 6, - "items": [ - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-11-15 20:00:10.603Z", - "id": "027pf52phm4a5vx", - "permission": "view", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-11-15 20:00:10.603Z", - "user": "3mugf953w4a9fg5", - "expand": { - "user": { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-09-14 14:36:36.470Z", - "id": "0q3pknqtbf5zsmu", - "permission": "view", - "trail": "2o9c3pxfvrzclud", - "updated": "2024-09-14 14:36:36.470Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-09-14 13:05:39.661Z", - "id": "1n7oo2f14d2bwi5", - "permission": "view", - "trail": "yesm2tqc6jok8jq", - "updated": "2024-09-14 13:05:39.661Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-12-02 17:46:13.399Z", - "id": "23mpznfesfbyha1", - "permission": "view", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:46:13.399Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-09-14 14:36:36.155Z", - "id": "2lhw2wak0i71rmr", - "permission": "view", - "trail": "oy1auygew9fvha0", - "updated": "2024-09-14 14:36:36.155Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 5, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 21:43:09.964Z", - "id": "13ikooi1f6tgjvd", - "rating": 0, - "text": "Comment", - "trail": "267r63tmbyezpck", - "updated": "2024-12-20 21:43:09.964Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 20:37:33.558Z", - "id": "1rjjl1riy4jrdmm", - "rating": 0, - "text": "C", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-12-20 20:37:33.558Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-19 21:18:30.979Z", - "id": "6vcudpc4wgc0cku", - "rating": 0, - "text": "Zehn Ziegen zogen zehn Zentner Zucker zum Zoo!", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-19 21:18:30.979Z", - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-02 17:43:26.303Z", - "id": "p4r2x69bq7iz8ah", - "rating": 0, - "text": "Geht das?", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:43:26.303Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-21 00:37:08.033Z", - "id": "vkwrak7tytf9vur", - "rating": 0, - "text": "Anim minim consequat veniam ad laboris velit magna veniam dolor. Incididunt in non fugiat aliqua. Ullamco sint ipsum cupidatat Lorem deserunt id quis. Irure minim duis pariatur irure commodo non officia cillum et exercitation laborum. Enim nisi ipsum velit nisi. Consectetur et ad enim laboris.\n\nLorem commodo ex deserunt deserunt fugiat et consequat sit ad consequat nulla quis reprehenderit. Commodo sit eu consequat reprehenderit elit labore Lorem pariatur enim do ad irure ex ad. Nisi magna irure est dolore elit laboris commodo consectetur sint aliquip sit. Do exercitation ullamco incididunt culpa eu dolore dolore sint esse laboris elit enim cillum excepteur. Sit veniam veniam ex deserunt Lorem Lorem ut incididunt dolor sint nulla eiusmod magna adipisicing.", - "trail": "267r63tmbyezpck", - "updated": "2024-12-21 00:37:08.033Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a trail share. ", - "operationId": "createTrailShare", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "trail": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "Trail Id" - }, - "user": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id" - }, - "permission": { - "type": "string", - "enum": [ - "view", - "edit" - ], - "description": "Permissions for user" - } - }, - "required": [ - "trail", - "user", - "permission" - ] - }, - "example": { - "trail": "z94vgei3jdc37k4", - "user": "z014o6bpcg680mg", - "permission": "view" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "trail": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - } - }, - "required": [ - "author" - ] - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "expand", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - } - }, - "required": [ - "trail" - ] - }, - "id": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "expand", - "id", - "permission", - "trail", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2025-01-03 12:41:01.998Z", - "expand": { - "trail": { - "author": "3mugf953w4a9fg5", - "category": "pbwx1lg2nmcih0w", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-12-30 18:57:35.453Z", - "date": "2024-12-30 00:00:00.000Z", - "description": "", - "difficulty": "moderate", - "distance": 5631.307320599051, - "duration": 0, - "elevation_gain": 76, - "elevation_loss": 76, - "expand": { - "author": { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2025-01-03 12:32:15.270Z", - "username": "Flomp", - "verified": true - } - }, - "gpx": "blob_0E0x721wan.gpx", - "id": "z94vgei3jdc37k4", - "lat": 47.385232, - "location": "", - "lon": 9.655863, - "name": "Die Pottsau", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_2SQmCCI6DV.jpg", - "caret_right_solid_9154Rrvk6B.svg" - ], - "public": false, - "summit_logs": [ - "95bb1d77c8dfa98" - ], - "thumbnail": 1, - "updated": "2024-12-30 18:59:56.924Z", - "waypoints": [ - "7f6d2a8c9d50136", - "60c2d435a5b66ed" - ] - } - }, - "id": "93jrstjcngapleb", - "permission": "view", - "trail": "z94vgei3jdc37k4", - "updated": "2025-01-03 12:41:01.998Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail-share/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single trail share.", - "operationId": "showTrailShare", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "permission", - "trail", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-12-08 21:48:07.886Z", - "id": "98ksbvxgqlp45jl", - "permission": "view", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-08 21:48:07.886Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a trail share.", - "operationId": "updateTrailShare", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "permission": { - "type": "string", - "enum": [ - "view", - "edit" - ] - } - } - }, - "example": { - "permission": "view" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "permission", - "trail", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2025-01-03 12:41:01.998Z", - "id": "93jrstjcngapleb", - "permission": "edit", - "trail": "z94vgei3jdc37k4", - "updated": "2025-01-03 12:42:13.052Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a trail share.", - "operationId": "deleteTrailShare", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/user/anonymous": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all anonymized users (email and token are hidden).", - "operationId": "listUsersAnonymous", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "username=\"Flomp\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "id", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 2, - "totalPages": 1, - "items": [ - { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - }, - { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 5, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 21:43:09.964Z", - "id": "13ikooi1f6tgjvd", - "rating": 0, - "text": "Comment", - "trail": "267r63tmbyezpck", - "updated": "2024-12-20 21:43:09.964Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 20:37:33.558Z", - "id": "1rjjl1riy4jrdmm", - "rating": 0, - "text": "C", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-12-20 20:37:33.558Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-19 21:18:30.979Z", - "id": "6vcudpc4wgc0cku", - "rating": 0, - "text": "Zehn Ziegen zogen zehn Zentner Zucker zum Zoo!", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-19 21:18:30.979Z", - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-02 17:43:26.303Z", - "id": "p4r2x69bq7iz8ah", - "rating": 0, - "text": "Geht das?", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:43:26.303Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-21 00:37:08.033Z", - "id": "vkwrak7tytf9vur", - "rating": 0, - "text": "Anim minim consequat veniam ad laboris velit magna veniam dolor. Incididunt in non fugiat aliqua. Ullamco sint ipsum cupidatat Lorem deserunt id quis. Irure minim duis pariatur irure commodo non officia cillum et exercitation laborum. Enim nisi ipsum velit nisi. Consectetur et ad enim laboris.\n\nLorem commodo ex deserunt deserunt fugiat et consequat sit ad consequat nulla quis reprehenderit. Commodo sit eu consequat reprehenderit elit labore Lorem pariatur enim do ad irure ex ad. Nisi magna irure est dolore elit laboris commodo consectetur sint aliquip sit. Do exercitation ullamco incididunt culpa eu dolore dolore sint esse laboris elit enim cillum excepteur. Sit veniam veniam ex deserunt Lorem Lorem ut incididunt dolor sint nulla eiusmod magna adipisicing.", - "trail": "267r63tmbyezpck", - "updated": "2024-12-21 00:37:08.033Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/user/anonymous/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single anonymized user (email and token are hidden).", - "operationId": "showUserAnonymous", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "User Id", - "required": true, - "example": "3mugf953w4a9fg5", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - }, - "example": { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/user/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single user. The only valid id is the one of the logged-in user. Use the \"user/anonymous/{id}\" endpoint for all other users.", - "operationId": "showUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "User Id", - "required": true, - "example": "3mugf953w4a9fg5", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "email": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "email", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "example": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "email": "notmymail@googlemail.com", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a user.", - "operationId": "updateUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "User Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "username": { - "type": "string", - "minLength": 3 - }, - "password": { - "type": "string", - "minLength": 8 - }, - "passwordConfirm": { - "type": "string", - "minLength": 8, - "description": "Must be equal to \"password\"" - }, - "email": { - "type": "string", - "format": "email" - }, - "bio": { - "type": "string", - "description": "User biography" - } - } - }, - "example": { - "username": "Kim_Hettinger23", - "password": "minim elit", - "passwordConfirm": "minim elit", - "email": "Theodora_Kovacek@yahoo.com", - "bio": "A sed velit cum esse. Delectus minus nulla animi fugit minima omnis. Perspiciatis voluptas iure ipsa a dignissimos. Sequi magni odio beatae quisquam." - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "email": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "email", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "example": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "email": "mymail@gmail.com", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2025-01-03 12:29:55.103Z", - "username": "Flomp", - "verified": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a user.", - "operationId": "deleteUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/user": { - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a user. ", - "operationId": "createUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "username": { - "type": "string", - "minLength": 3 - }, - "password": { - "type": "string", - "minLength": 8 - }, - "passwordConfirm": { - "type": "string", - "minLength": 8, - "description": "Must be equal to \"password\"" - }, - "email": { - "type": "string", - "format": "email" - } - }, - "required": [ - "username", - "password", - "passwordConfirm", - "email" - ] - }, - "example": { - "username": "Angela.Pacocha95", - "password": "deserunt", - "passwordConfirm": "deserunt", - "email": "Braulio98@gmail.com" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "example": { - "avatar": "", - "bio": "", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2025-01-03 12:23:01.865Z", - "emailVisibility": false, - "id": "nfynp8jhat2o4sy", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSBuZnlucDhqaGF0Mm80c3kgT1Igc2hhcmVzID0gbmZ5bnA4amhhdDJvNHN5In19fQ.RtK_w6Bjqni720FEjVqIwaWhtrqqy5rFPA7qAdPd0iA", - "updated": "2025-01-03 12:23:01.867Z", - "username": "Dewayne33", - "verified": false - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [] - } - }, - "/user/{id}/file": { - "post": { - "summary": "file", - "deprecated": false, - "description": "Uploads an avatar file for a user.", - "operationId": "fileUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "User Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "format": "binary", - "description": "Avatar image file. Allowed file types: PNG, JPG, WEBP, SVG", - "example": "file:///Users/christianbeutel/Downloads/23xxesym0e9w18z2904frnpgy7.jpg" - } - }, - "required": [ - "avatar" - ] - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "email": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "email", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "example": { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "email": "mymail@gmail.com", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2025-01-03 12:32:15.270Z", - "username": "Flomp", - "verified": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/waypoint": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all waypoints.", - "operationId": "listWaypoints", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "name=\"abc\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "description", - "icon", - "id", - "lat", - "lon", - "name", - "photos", - "updated" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 96, - "totalPages": 20, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-11-09 10:33:45.943Z", - "description": "", - "icon": "circle", - "id": "035691efaa5cf0a", - "lat": 47.71415538, - "lon": 11.98004365, - "name": "Kesselalm (1275 m)", - "photos": [], - "updated": "2024-11-09 10:33:45.943Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-10-06 09:33:11.379Z", - "description": "", - "icon": "circle", - "id": "04328b07923294e", - "lat": 47.71415538, - "lon": 11.98004365, - "name": "Kesselalm (1275 m)", - "photos": [], - "updated": "2024-10-06 09:33:11.379Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-11-09 10:31:37.884Z", - "description": "", - "icon": "circle", - "id": "056510042fb882d", - "lat": 47.71215663291514, - "lon": 11.964081572368741, - "name": "Birkenstein (850 m)", - "photos": [], - "updated": "2024-11-09 10:31:37.884Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-09-07 11:11:29.646Z", - "description": "", - "icon": "circle", - "id": "0b8bb0a2c97b669", - "lat": 47.449586391448975, - "lon": 11.238069534301758, - "name": "St. Anton (Restaurant)", - "photos": [], - "updated": "2024-09-07 11:11:29.646Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-09-07 11:11:29.459Z", - "description": "", - "icon": "circle", - "id": "0c4fb8ae0465eb1", - "lat": 47.44074583053589, - "lon": 11.212363243103027, - "name": "Ferchensee (Bushaltestelle)", - "photos": [], - "updated": "2024-09-07 11:11:29.459Z" - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 5, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 21:43:09.964Z", - "id": "13ikooi1f6tgjvd", - "rating": 0, - "text": "Comment", - "trail": "267r63tmbyezpck", - "updated": "2024-12-20 21:43:09.964Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 20:37:33.558Z", - "id": "1rjjl1riy4jrdmm", - "rating": 0, - "text": "C", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-12-20 20:37:33.558Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-19 21:18:30.979Z", - "id": "6vcudpc4wgc0cku", - "rating": 0, - "text": "Zehn Ziegen zogen zehn Zentner Zucker zum Zoo!", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-19 21:18:30.979Z", - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-02 17:43:26.303Z", - "id": "p4r2x69bq7iz8ah", - "rating": 0, - "text": "Geht das?", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:43:26.303Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-21 00:37:08.033Z", - "id": "vkwrak7tytf9vur", - "rating": 0, - "text": "Anim minim consequat veniam ad laboris velit magna veniam dolor. Incididunt in non fugiat aliqua. Ullamco sint ipsum cupidatat Lorem deserunt id quis. Irure minim duis pariatur irure commodo non officia cillum et exercitation laborum. Enim nisi ipsum velit nisi. Consectetur et ad enim laboris.\n\nLorem commodo ex deserunt deserunt fugiat et consequat sit ad consequat nulla quis reprehenderit. Commodo sit eu consequat reprehenderit elit labore Lorem pariatur enim do ad irure ex ad. Nisi magna irure est dolore elit laboris commodo consectetur sint aliquip sit. Do exercitation ullamco incididunt culpa eu dolore dolore sint esse laboris elit enim cillum excepteur. Sit veniam veniam ex deserunt Lorem Lorem ut incididunt dolor sint nulla eiusmod magna adipisicing.", - "trail": "267r63tmbyezpck", - "updated": "2024-12-21 00:37:08.033Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a waypoint. ", - "operationId": "createWaypoint", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "lat": { - "type": "number", - "minimum": -90, - "maximum": 90 - }, - "lon": { - "type": "number", - "minimum": -180, - "maximum": 180 - }, - "icon": { - "type": "string", - "description": "Fontawesome icon string (https://fontawesome.com/v6/search?o=r&m=free)" - }, - "author": { - "type": "string", - "description": "User Id", - "minLength": 15, - "maxLength": 15 - } - }, - "required": [ - "lon", - "lat", - "author" - ] - }, - "example": { - "name": "non repellat possimus", - "description": "Impedit modi nisi quibusdam eum rerum illo. Minus mollitia delectus vitae optio vero. Maiores praesentium dolores nostrum laborum saepe. Dolorem qui non. Dolorem dolores facere facere reiciendis ab doloribus.", - "lat": -81.44545573482735, - "lon": 178.9999004930424, - "icon": "pen", - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "description", - "icon", - "id", - "lat", - "lon", - "name", - "photos", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2025-01-03 13:07:25.852Z", - "description": "Impedit modi nisi quibusdam eum rerum illo. Minus mollitia delectus vitae optio vero. Maiores praesentium dolores nostrum laborum saepe. Dolorem qui non. Dolorem dolores facere facere reiciendis ab doloribus.", - "icon": "pen", - "id": "fjqcwd17fawiy83", - "lat": -81.44545573482735, - "lon": 178.9999004930424, - "name": "non repellat possimus", - "photos": [], - "updated": "2025-01-03 13:07:25.852Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/waypoint/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single waypoint.", - "operationId": "showWaypoint", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Waypoint Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "description", - "icon", - "id", - "lat", - "lon", - "name", - "photos", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-11-09 10:33:45.943Z", - "description": "", - "icon": "circle", - "id": "035691efaa5cf0a", - "lat": 47.71415538, - "lon": 11.98004365, - "name": "Kesselalm (1275 m)", - "photos": [], - "updated": "2024-11-09 10:33:45.943Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a waypoint.", - "operationId": "updateWaypoint", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Waypoint Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "lat": { - "type": "number", - "minimum": -90, - "maximum": 90 - }, - "lon": { - "type": "number", - "minimum": -180, - "maximum": 180 - }, - "icon": { - "type": "string", - "description": "Fontawesome icon string (https://fontawesome.com/v6/search?o=r&m=free)" - } - } - }, - "example": { - "name": "molestias suscipit asperiores", - "description": "Quidem illum labore illum quo doloribus ratione temporibus. Voluptatem voluptatum tempore deleniti amet voluptate. Consectetur soluta repellat accusantium blanditiis. Quis sapiente inventore. Sed excepturi cum incidunt dolores tempora illum neque. Non nostrum alias ut facere assumenda.", - "lat": -78.53460271991707, - "lon": 112.79017323734126, - "icon": "house" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "description", - "icon", - "id", - "lat", - "lon", - "name", - "photos", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2025-01-03 13:07:25.852Z", - "description": "Quidem illum labore illum quo doloribus ratione temporibus. Voluptatem voluptatum tempore deleniti amet voluptate. Consectetur soluta repellat accusantium blanditiis. Quis sapiente inventore. Sed excepturi cum incidunt dolores tempora illum neque. Non nostrum alias ut facere assumenda.", - "icon": "house", - "id": "fjqcwd17fawiy83", - "lat": -78.53460271991707, - "lon": 112.79017323734126, - "name": "molestias suscipit asperiores", - "photos": [], - "updated": "2025-01-03 13:09:45.168Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a waypoint.", - "operationId": "deleteWaypoint", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Waypoint Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all lists.", - "operationId": "listLists", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "name=\"abc\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated", - "expand" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "example": { - "page": 1, - "perPage": 5, - "totalItems": 4, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "640px_mont_saint_michel_vu_du_ciel_MvWoudBkPE.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-09-09 22:10:07.972Z", - "description": "La Véloscénie is a 450-kilometre (280 mi) cycle route that takes you on an adventure from Paris to Mont-Saint-Michel on the Channel coast. From the capital to the beaches, passing through numerous hamlets and stunning towns such as Chartres, this journey westwards has many surprises in store.\r\n\r\nWe suggest you complete this journey in seven stages. This is a challenging pace, but should still leave you time to discover the many attractions en route. Cathedrals, castles, lakes, stunning landscapes and historic villages will show you that you don't have to wait for Mont-Saint-Michel to be amazed.\r\n\r\nThe itinerary alternates between little-used secondary roads, greenways and trails. This trip is best ridden on a bike that can handle rougher trails, like a touring, hybrid or gravel bike.\r\n\r\nParis is easy to reach from anywhere in France, but the choice is more limited if you want to leave from Mont-Saint-Michel. The nearest railway station is in Pontorson, 10 kilometres (6 mi) from Mont-Saint-Michel. From Pontorson, direct trains to Paris leave every evening, around 6pm on weekdays and at weekends, only between June and the end of September. Bikes can be taken on board free of charge by prior arrangement. Apart from this seasonal service, there are other ways of returning to Paris, with at least one train change required. For more information: veloscenic.com/reaching-the-veloscenic-cycle-route\r\n\r\nAlthough the route is accessible all year round, some accommodation and tourist attractions are likely to close in the low season, so it’s best to ride in spring or summer. While some stages end in big cities, others end in more rural areas and you’ll need to book your accommodation in advance. It’s not necessary to book restaurants along the route, but it is best to plan stops for refreshments, as not all the villages you pass through have restaurants or shops.", - "id": "bdv9iukn4d2lf2i", - "name": "From Paris to Mont-Saint-Michel — La Véloscénie", - "public": false, - "trails": [ - "jou2tcf0y8jj9m3", - "ilyvsa4xr52lxlr", - "2y8o7bwmor4yltt", - "gmh81mczhjp834l", - "6hpvcyosmqr8uk8", - "iql9fifaxnb5u6m", - "y9hjysn5xhbmi86", - "fehuzqkfi49hkwn", - "fmin7pbj8urtxx0", - "14y4qxqbqh0n10m", - "6fv6krwusycttbl", - "66jj108gizquc2r", - "wbuwzu8tp48hljg", - "x3lo6ru4ly753w6", - "h91u3vl8n5ekune", - "bzodytd0vd2e56g", - "oy1auygew9fvha0", - "6atd6i73bzle0ar", - "iz2ohx9hbn8irrc", - "2o9c3pxfvrzclud", - "btn09xkl7ab0n9k", - "ek2cb00tw4v4fav" - ], - "updated": "2024-12-27 00:55:25.917Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "caret_right_solid_iUtggzDoh7.svg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2024-12-27 00:55:21.456Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 0, - "type": "number", - "inclusive": false, - "exact": false, - "message": "Number must be greater than 0", - "path": [ - "page" - ] - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a list. ", - "operationId": "createList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name of the list" - }, - "description": { - "type": "string", - "description": "Description of the list" - }, - "public": { - "type": "boolean", - "description": "Visible for everyone" - }, - "trails": { - "type": "array", - "items": { - "type": "string", - "description": "Trail Id", - "minLength": 15, - "maxLength": 15 - }, - "description": "List of trail Ids contained in the list", - "minItems": 0 - }, - "author": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id" - } - }, - "required": [ - "name", - "public", - "trails", - "author" - ] - }, - "example": { - "name": "API List", - "description": "A list created via the wanderer API", - "public": true, - "trails": [], - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "A list created via the wanderer API", - "id": "4yql7587j64qdo5", - "name": "API List", - "public": true, - "trails": [], - "updated": "2025-01-02 22:29:19.092Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "name" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single list.", - "operationId": "showList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated", - "expand" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a list.", - "operationId": "updateList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name of the list" - }, - "description": { - "type": "string", - "description": "Description of the list" - }, - "public": { - "type": "boolean", - "description": "Visible for everyone" - }, - "trails": { - "type": "array", - "items": { - "type": "string", - "description": "Trail Id", - "minLength": 15, - "maxLength": 15 - }, - "description": "List of trail Ids contained in the list", - "minItems": 0 - } - } - }, - "example": { - "name": "API List", - "description": "A list created via the wanderer API", - "public": true, - "trails": [], - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a list.", - "operationId": "deleteList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list/{id}/file": { - "post": { - "summary": "file", - "deprecated": false, - "description": "Uploads an avatar file for a list.", - "operationId": "fileList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "format": "binary", - "description": "Avatar image file. Allowed file types: PNG, JPG, WEBP, SVG", - "example": "file:///Users/christianbeutel/Downloads/23xxesym0e9w18z2904frnpgy7.jpg" - } - }, - "required": [ - "avatar" - ] - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "avatar": "23xxesym0e9w18z2904frnpgy7_bmAvN4NpoA.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2025-01-02 23:06:30.788Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list-share": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all list-shares.", - "operationId": "listListShares", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "permission=\"view\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "user", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "user": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "user" - ] - } - } - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 1, - "totalPages": 1, - "items": [ - { - "collectionId": "1kot7t9na3hi0gl", - "collectionName": "list_share", - "created": "2024-11-15 16:34:15.333Z", - "id": "xjn56wlra4rqdtl", - "list": "bdv9iukn4d2lf2i", - "permission": "view", - "updated": "2024-11-15 16:34:15.333Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 5, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 21:43:09.964Z", - "id": "13ikooi1f6tgjvd", - "rating": 0, - "text": "Comment", - "trail": "267r63tmbyezpck", - "updated": "2024-12-20 21:43:09.964Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 20:37:33.558Z", - "id": "1rjjl1riy4jrdmm", - "rating": 0, - "text": "C", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-12-20 20:37:33.558Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-19 21:18:30.979Z", - "id": "6vcudpc4wgc0cku", - "rating": 0, - "text": "Zehn Ziegen zogen zehn Zentner Zucker zum Zoo!", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-19 21:18:30.979Z", - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-02 17:43:26.303Z", - "id": "p4r2x69bq7iz8ah", - "rating": 0, - "text": "Geht das?", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:43:26.303Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-21 00:37:08.033Z", - "id": "vkwrak7tytf9vur", - "rating": 0, - "text": "Anim minim consequat veniam ad laboris velit magna veniam dolor. Incididunt in non fugiat aliqua. Ullamco sint ipsum cupidatat Lorem deserunt id quis. Irure minim duis pariatur irure commodo non officia cillum et exercitation laborum. Enim nisi ipsum velit nisi. Consectetur et ad enim laboris.\n\nLorem commodo ex deserunt deserunt fugiat et consequat sit ad consequat nulla quis reprehenderit. Commodo sit eu consequat reprehenderit elit labore Lorem pariatur enim do ad irure ex ad. Nisi magna irure est dolore elit laboris commodo consectetur sint aliquip sit. Do exercitation ullamco incididunt culpa eu dolore dolore sint esse laboris elit enim cillum excepteur. Sit veniam veniam ex deserunt Lorem Lorem ut incididunt dolor sint nulla eiusmod magna adipisicing.", - "trail": "267r63tmbyezpck", - "updated": "2024-12-21 00:37:08.033Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a list share. ", - "operationId": "createListShare", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "list": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "List Id" - }, - "user": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id" - }, - "permission": { - "type": "string", - "enum": [ - "view", - "edit" - ], - "description": "Permissions for user" - } - }, - "required": [ - "list", - "user", - "permission" - ] - }, - "example": { - "list": "dci7qk44birm2bn", - "user": "z014o6bpcg680mg", - "permission": "view" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "list": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - } - }, - "required": [ - "author" - ] - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "expand", - "id", - "name", - "public", - "trails", - "updated" - ] - } - }, - "required": [ - "list" - ] - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "expand", - "id", - "list", - "permission", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1kot7t9na3hi0gl", - "collectionName": "list_share", - "created": "2025-01-03 10:36:23.596Z", - "expand": { - "list": { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - } - }, - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z" - } - }, - "id": "r8r938af52vdae1", - "list": "dci7qk44birm2bn", - "permission": "view", - "updated": "2025-01-03 10:36:23.596Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list-share/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single list share.", - "operationId": "showListShare", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "list", - "permission", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1kot7t9na3hi0gl", - "collectionName": "list_share", - "created": "2024-11-15 16:34:15.333Z", - "id": "xjn56wlra4rqdtl", - "list": "bdv9iukn4d2lf2i", - "permission": "view", - "updated": "2024-11-15 16:34:15.333Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a list share.", - "operationId": "updateListShare", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "permission": { - "type": "string", - "enum": [ - "view", - "edit" - ] - } - } - }, - "example": { - "permission": "view" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "list", - "permission", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1kot7t9na3hi0gl", - "collectionName": "list_share", - "created": "2025-01-03 10:36:23.596Z", - "id": "r8r938af52vdae1", - "list": "dci7qk44birm2bn", - "permission": "edit", - "updated": "2025-01-03 10:39:28.597Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a list share.", - "operationId": "deleteListShare", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/notification": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all notifications.", - "operationId": "listNotifications", - "tags": [ - "notification" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "recipient=\"r8r938af52vdae1\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "metadata": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - } - }, - "required": [ - "author", - "id", - "list" - ] - }, - "recipient": { - "type": "string" - }, - "seen": { - "type": "boolean" - }, - "type": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "recipient": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - }, - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "recipient", - "author" - ] - } - } - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 1, - "totalPages": 1, - "items": [ - { - "author": "znhd3hgrxl85c9f", - "collectionId": "khrcci2uqknny8h", - "collectionName": "notifications", - "created": "2025-01-03 10:36:23.603Z", - "id": "yu9vp1kbid56s6u", - "metadata": { - "author": "Flomp", - "id": "dci7qk44birm2bn", - "list": "Liste mit Oachkatzerl" - }, - "recipient": "3mugf953w4a9fg5", - "seen": false, - "type": "list_share", - "updated": "2025-01-03 10:49:22.945Z", - "expand": { - "recipient": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - }, - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 4, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "640px_mont_saint_michel_vu_du_ciel_MvWoudBkPE.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-09-09 22:10:07.972Z", - "description": "La Véloscénie is a 450-kilometre (280 mi) cycle route that takes you on an adventure from Paris to Mont-Saint-Michel on the Channel coast. From the capital to the beaches, passing through numerous hamlets and stunning towns such as Chartres, this journey westwards has many surprises in store.\r\n\r\nWe suggest you complete this journey in seven stages. This is a challenging pace, but should still leave you time to discover the many attractions en route. Cathedrals, castles, lakes, stunning landscapes and historic villages will show you that you don't have to wait for Mont-Saint-Michel to be amazed.\r\n\r\nThe itinerary alternates between little-used secondary roads, greenways and trails. This trip is best ridden on a bike that can handle rougher trails, like a touring, hybrid or gravel bike.\r\n\r\nParis is easy to reach from anywhere in France, but the choice is more limited if you want to leave from Mont-Saint-Michel. The nearest railway station is in Pontorson, 10 kilometres (6 mi) from Mont-Saint-Michel. From Pontorson, direct trains to Paris leave every evening, around 6pm on weekdays and at weekends, only between June and the end of September. Bikes can be taken on board free of charge by prior arrangement. Apart from this seasonal service, there are other ways of returning to Paris, with at least one train change required. For more information: veloscenic.com/reaching-the-veloscenic-cycle-route\r\n\r\nAlthough the route is accessible all year round, some accommodation and tourist attractions are likely to close in the low season, so it’s best to ride in spring or summer. While some stages end in big cities, others end in more rural areas and you’ll need to book your accommodation in advance. It’s not necessary to book restaurants along the route, but it is best to plan stops for refreshments, as not all the villages you pass through have restaurants or shops.", - "id": "bdv9iukn4d2lf2i", - "name": "From Paris to Mont-Saint-Michel — La Véloscénie", - "public": false, - "trails": [ - "jou2tcf0y8jj9m3", - "ilyvsa4xr52lxlr", - "2y8o7bwmor4yltt", - "gmh81mczhjp834l", - "6hpvcyosmqr8uk8", - "iql9fifaxnb5u6m", - "y9hjysn5xhbmi86", - "fehuzqkfi49hkwn", - "fmin7pbj8urtxx0", - "14y4qxqbqh0n10m", - "6fv6krwusycttbl", - "66jj108gizquc2r", - "wbuwzu8tp48hljg", - "x3lo6ru4ly753w6", - "h91u3vl8n5ekune", - "bzodytd0vd2e56g", - "oy1auygew9fvha0", - "6atd6i73bzle0ar", - "iz2ohx9hbn8irrc", - "2o9c3pxfvrzclud", - "btn09xkl7ab0n9k", - "ek2cb00tw4v4fav" - ], - "updated": "2024-12-27 00:55:25.917Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "caret_right_solid_iUtggzDoh7.svg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2024-12-27 00:55:21.456Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/notification/{id}": { - "post": { - "summary": "update", - "deprecated": false, - "description": "Marks a notification as seen.", - "operationId": "updateNotification", - "tags": [ - "notification" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Notification Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "seen": { - "type": "boolean", - "default": true - } - }, - "required": [ - "seen" - ] - }, - "example": { - "seen": true - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "metadata": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - } - }, - "required": [ - "author", - "id", - "list" - ] - }, - "recipient": { - "type": "string" - }, - "seen": { - "type": "boolean" - }, - "type": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "id", - "metadata", - "recipient", - "seen", - "type", - "updated" - ] - }, - "example": { - "author": "znhd3hgrxl85c9f", - "collectionId": "khrcci2uqknny8h", - "collectionName": "notifications", - "created": "2025-01-03 10:36:23.603Z", - "id": "yu9vp1kbid56s6u", - "metadata": { - "author": "Flomp", - "id": "dci7qk44birm2bn", - "list": "Liste mit Oachkatzerl" - }, - "recipient": "3mugf953w4a9fg5", - "seen": true, - "type": "list_share", - "updated": "2025-01-03 10:57:22.899Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/summit-log": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all summit logs.", - "operationId": "listSummitLogs", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "distance>=500", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "integer" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 14, - "totalPages": 3, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-12-02 00:06:13.761Z", - "date": "2024-12-02 00:00:00.000Z", - "distance": 0, - "duration": 0, - "elevation_gain": 0, - "elevation_loss": 0, - "gpx": "", - "id": "22879d2ce902f57", - "photos": [ - "wanderer_stats_QbRDtbqXp8.png" - ], - "text": "Heute war auch nicht schlecht!", - "updated": "2024-12-02 00:06:13.802Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-11-11 15:34:42.149Z", - "date": "2024-11-11 00:00:00.000Z", - "distance": 0, - "duration": 0, - "elevation_gain": 0, - "elevation_loss": 0, - "gpx": "", - "id": "282aa2f6aa2901d", - "photos": [], - "text": "", - "updated": "2024-11-11 15:34:42.149Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-12-30 18:42:22.407Z", - "date": "2010-06-26 00:00:00.000Z", - "distance": 17.272892451353634, - "duration": 19, - "elevation_gain": 0.48071279999999916, - "elevation_loss": 3.845214800000001, - "gpx": "blob_li_rt_ludnm5_CTr98mgc40.tcx", - "id": "4p1gjllhdrhnuyr", - "photos": [], - "text": "", - "updated": "2024-12-30 18:42:22.463Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-12-26 21:35:23.376Z", - "date": "2024-12-26 00:00:00.000Z", - "distance": 14055.576293821563, - "duration": 5060, - "elevation_gain": 1197, - "elevation_loss": 1194, - "gpx": "herzogstand_4uFe02QqSL.gpx", - "id": "5yftqj5opprl9ju", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_hR8ogccdVG.jpg" - ], - "text": "", - "updated": "2024-12-26 21:35:23.458Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-11-05 22:05:43.778Z", - "date": "2024-11-02 00:00:00.000Z", - "distance": 12452.945922907797, - "duration": 16993, - "elevation_gain": 770.0000000000002, - "elevation_loss": 770.4800000000002, - "gpx": "kranzberg_tzNjcOwhf2.gpx", - "id": "7072f62edbb8e62", - "photos": [], - "text": "", - "updated": "2024-11-05 22:06:19.100Z" - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 4, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "640px_mont_saint_michel_vu_du_ciel_MvWoudBkPE.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-09-09 22:10:07.972Z", - "description": "La Véloscénie is a 450-kilometre (280 mi) cycle route that takes you on an adventure from Paris to Mont-Saint-Michel on the Channel coast. From the capital to the beaches, passing through numerous hamlets and stunning towns such as Chartres, this journey westwards has many surprises in store.\r\n\r\nWe suggest you complete this journey in seven stages. This is a challenging pace, but should still leave you time to discover the many attractions en route. Cathedrals, castles, lakes, stunning landscapes and historic villages will show you that you don't have to wait for Mont-Saint-Michel to be amazed.\r\n\r\nThe itinerary alternates between little-used secondary roads, greenways and trails. This trip is best ridden on a bike that can handle rougher trails, like a touring, hybrid or gravel bike.\r\n\r\nParis is easy to reach from anywhere in France, but the choice is more limited if you want to leave from Mont-Saint-Michel. The nearest railway station is in Pontorson, 10 kilometres (6 mi) from Mont-Saint-Michel. From Pontorson, direct trains to Paris leave every evening, around 6pm on weekdays and at weekends, only between June and the end of September. Bikes can be taken on board free of charge by prior arrangement. Apart from this seasonal service, there are other ways of returning to Paris, with at least one train change required. For more information: veloscenic.com/reaching-the-veloscenic-cycle-route\r\n\r\nAlthough the route is accessible all year round, some accommodation and tourist attractions are likely to close in the low season, so it’s best to ride in spring or summer. While some stages end in big cities, others end in more rural areas and you’ll need to book your accommodation in advance. It’s not necessary to book restaurants along the route, but it is best to plan stops for refreshments, as not all the villages you pass through have restaurants or shops.", - "id": "bdv9iukn4d2lf2i", - "name": "From Paris to Mont-Saint-Michel — La Véloscénie", - "public": false, - "trails": [ - "jou2tcf0y8jj9m3", - "ilyvsa4xr52lxlr", - "2y8o7bwmor4yltt", - "gmh81mczhjp834l", - "6hpvcyosmqr8uk8", - "iql9fifaxnb5u6m", - "y9hjysn5xhbmi86", - "fehuzqkfi49hkwn", - "fmin7pbj8urtxx0", - "14y4qxqbqh0n10m", - "6fv6krwusycttbl", - "66jj108gizquc2r", - "wbuwzu8tp48hljg", - "x3lo6ru4ly753w6", - "h91u3vl8n5ekune", - "bzodytd0vd2e56g", - "oy1auygew9fvha0", - "6atd6i73bzle0ar", - "iz2ohx9hbn8irrc", - "2o9c3pxfvrzclud", - "btn09xkl7ab0n9k", - "ek2cb00tw4v4fav" - ], - "updated": "2024-12-27 00:55:25.917Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "caret_right_solid_iUtggzDoh7.svg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2024-12-27 00:55:21.456Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a summit log. ", - "operationId": "createSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "date": { - "type": "string", - "description": "Date of the summit log", - "format": "date" - }, - "text": { - "type": "string", - "description": "Description of the summit log" - }, - "distance": { - "type": "number", - "minimum": 0, - "description": "Distance in meters" - }, - "elevation_gain": { - "type": "number", - "minimum": 0, - "description": "Elevation gain in vertical meters" - }, - "elevation_loss": { - "type": "number", - "minimum": 0, - "description": "Elevation loss in vertical meters" - }, - "duration": { - "type": "number", - "minimum": 0, - "description": "Duration in seconds" - }, - "author": { - "type": "string", - "description": "User Id", - "minLength": 15, - "maxLength": 15 - } - }, - "required": [ - "date", - "author" - ] - }, - "example": { - "date": "2025-01-01", - "text": "Created by wanderer API", - "distance": 12, - "elevation_gain": 34, - "elevation_loss": 42, - "duration": 21, - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "integer" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2025-01-03 09:56:37.620Z", - "date": "2025-01-01 00:00:00.000Z", - "distance": 12, - "duration": 21, - "elevation_gain": 34, - "elevation_loss": 42, - "gpx": "", - "id": "58iuq9j30qbbwmq", - "photos": [], - "text": "Created by wanderer API", - "updated": "2025-01-03 09:56:37.620Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "validation": { - "type": "string" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "code", - "message", - "path" - ] - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_string", - "validation": "date", - "message": "Invalid date", - "path": [ - "date" - ] - }, - { - "code": "custom", - "message": "invalid-date", - "path": [ - "date" - ] - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/summit-log/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single summit log.", - "operationId": "showSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "95bb1d77c8dfa98", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated", - "expand" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-12-30 18:58:04.809Z", - "date": "2024-12-10 00:00:00.000Z", - "distance": 283396.31855792465, - "duration": 0, - "elevation_gain": 0, - "elevation_loss": 0, - "gpx": "2024_10_22_04_28_2024_10_22_21_29_AicYbqRkLD.gpx", - "id": "95bb1d77c8dfa98", - "photos": [ - "dscn0010_7MuzM5ExLa.jpg", - "caret_right_solid_OLanLqeV1l.svg" - ], - "text": "", - "updated": "2024-12-30 18:59:56.822Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a summit log.", - "operationId": "updateSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "date": { - "type": "string", - "description": "Date of the summit log", - "format": "date" - }, - "text": { - "type": "string", - "description": "Description of the summit log" - }, - "distance": { - "type": "number", - "minimum": 0, - "description": "Distance in meters" - }, - "elevation_gain": { - "type": "number", - "minimum": 0, - "description": "Elevation gain in vertical meters" - }, - "elevation_loss": { - "type": "number", - "minimum": 0, - "description": "Elevation loss in vertical meters" - }, - "duration": { - "type": "number", - "minimum": 0, - "description": "Duration in seconds" - } - } - }, - "example": "{\n \"date\": \"2025-12-12\",\n \"text\": \"Updated by wanderer API\",\n \"distance\": 32,\n \"elevation_gain\": 45,\n \"elevation_loss\": 21,\n \"duration\": 29,\n}" - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2025-01-03 09:56:37.620Z", - "date": "2025-01-02 00:00:00.000Z", - "distance": 36983010.25256769, - "duration": 68163654.92949024, - "elevation_gain": 44389248.880456366, - "elevation_loss": 6494274.720874871, - "gpx": "", - "id": "58iuq9j30qbbwmq", - "photos": [], - "text": "et magna veniam anim cillum", - "updated": "2025-01-03 10:11:22.553Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a summit log.", - "operationId": "deleteSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/summit-log/{id}/file": { - "post": { - "summary": "file", - "deprecated": false, - "description": "Uploads or removes photos, uploads GPS data file for a summit log.", - "operationId": "fileSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "photos": { - "format": "binary", - "type": "string", - "description": "List of image files to add. Allowed file types: PNG, JPG, WEBP, SVG", - "example": [ - "" - ] - }, - "photos-": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of file names to delete.", - "example": "" - }, - "gpx": { - "type": "string", - "format": "binary", - "minLength": 0, - "maxLength": 1, - "description": "File containing GPS track data. Allowed file types: GPX, JSON, FIT, KML", - "example": "file:///Users/christianbeutel/Downloads/2021-10-24_536064034_Essen-Mitte.nach.Bochum-Hauptbahnhof.gpx" - } - } - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2025-01-03 09:56:37.620Z", - "date": "2025-01-02 00:00:00.000Z", - "distance": 36983010.25256769, - "duration": 68163654.92949024, - "elevation_gain": 44389248.880456366, - "elevation_loss": 6494274.720874871, - "gpx": "2021_11_14_564807964_dusseldorf_angermund_nach_n4R1NcyDsY.Neuss-Hamm.gpx", - "id": "58iuq9j30qbbwmq", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_CTPOstkHAC.jpg" - ], - "text": "et magna veniam anim cillum", - "updated": "2025-01-03 10:22:09.893Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all trails.", - "operationId": "listTrails", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "name=\"MyTrail\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints", - "expand" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 53, - "totalPages": 11, - "items": [ - { - "author": "3mugf953w4a9fg5", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-10-06 09:33:11.404Z", - "date": "2024-10-06 00:00:00.000Z", - "description": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", - "difficulty": "easy", - "distance": 7504.162098327643, - "duration": 0, - "elevation_gain": 840.19189453125, - "elevation_loss": 0, - "gpx": "breitenstein_3_DvymxgjEm5.gpx", - "id": "074jf18neqwfbsr", - "lat": 47.71215663291514, - "location": "", - "lon": 11.964081572368741, - "name": "Breitenstein", - "photos": [], - "public": false, - "summit_logs": [], - "thumbnail": 0, - "updated": "2024-11-05 21:54:20.799Z", - "waypoints": [ - "43570e9537dd83a", - "2efed4a4b90e8b3", - "d1ae45c1f4e6353", - "69de69fdb3b47b5", - "162d22a68a1a98b", - "04328b07923294e" - ], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-09-14 14:18:27.538Z", - "date": "2024-09-14 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 18487.660615835353, - "duration": 0, - "elevation_gain": 209.55000000000015, - "elevation_loss": 0, - "gpx": "blob_BaoYdHnfYw.gpx", - "id": "14y4qxqbqh0n10m", - "lat": 48.311547246, - "location": "", - "lon": 0.993056622, - "name": "Thiron-Gardais - Nogent-le-Rotrou", - "photos": [], - "public": true, - "summit_logs": [], - "thumbnail": 0, - "updated": "2024-12-08 21:26:17.269Z", - "waypoints": [], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-11-15 18:50:36.223Z", - "date": "2024-11-15 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 283396.31855792465, - "duration": 0, - "elevation_gain": 0, - "elevation_loss": 0, - "gpx": "2024_10_22_04_28_2024_10_22_21_29_UUGET8zBuk.gpx", - "id": "267r63tmbyezpck", - "lat": 41.754053, - "location": "", - "lon": -2.484733, - "name": "Gassi", - "photos": [], - "public": true, - "summit_logs": [ - "e980ffa422f1603" - ], - "thumbnail": 0, - "updated": "2024-11-16 12:49:33.814Z", - "waypoints": [], - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-09-14 14:18:26.946Z", - "date": "2024-09-14 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 10942.463179990422, - "duration": 0, - "elevation_gain": 66.64999999999999, - "elevation_loss": 0, - "gpx": "blob_ZjF1DuT8Rl.gpx", - "id": "2o9c3pxfvrzclud", - "lat": 48.626390603, - "location": "", - "lon": -0.960178937, - "name": "Mortain - St-Hilaire-du-Harcouët", - "photos": [], - "public": true, - "summit_logs": [], - "thumbnail": 0, - "updated": "2024-12-08 21:26:17.888Z", - "waypoints": [], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-09-14 14:18:27.604Z", - "date": "2024-09-14 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 23920.21858179372, - "duration": 0, - "elevation_gain": 238.07999999999996, - "elevation_loss": 0, - "gpx": "blob_oyW3EXsfqS.gpx", - "id": "2y8o7bwmor4yltt", - "lat": 48.8029381, - "location": "", - "lon": 2.1264017, - "name": "Versailles - St-Rémy-lès-Chevreuse", - "photos": [], - "public": true, - "summit_logs": [], - "thumbnail": 0, - "updated": "2024-12-08 21:26:16.840Z", - "waypoints": [], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 4, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "640px_mont_saint_michel_vu_du_ciel_MvWoudBkPE.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-09-09 22:10:07.972Z", - "description": "La Véloscénie is a 450-kilometre (280 mi) cycle route that takes you on an adventure from Paris to Mont-Saint-Michel on the Channel coast. From the capital to the beaches, passing through numerous hamlets and stunning towns such as Chartres, this journey westwards has many surprises in store.\r\n\r\nWe suggest you complete this journey in seven stages. This is a challenging pace, but should still leave you time to discover the many attractions en route. Cathedrals, castles, lakes, stunning landscapes and historic villages will show you that you don't have to wait for Mont-Saint-Michel to be amazed.\r\n\r\nThe itinerary alternates between little-used secondary roads, greenways and trails. This trip is best ridden on a bike that can handle rougher trails, like a touring, hybrid or gravel bike.\r\n\r\nParis is easy to reach from anywhere in France, but the choice is more limited if you want to leave from Mont-Saint-Michel. The nearest railway station is in Pontorson, 10 kilometres (6 mi) from Mont-Saint-Michel. From Pontorson, direct trains to Paris leave every evening, around 6pm on weekdays and at weekends, only between June and the end of September. Bikes can be taken on board free of charge by prior arrangement. Apart from this seasonal service, there are other ways of returning to Paris, with at least one train change required. For more information: veloscenic.com/reaching-the-veloscenic-cycle-route\r\n\r\nAlthough the route is accessible all year round, some accommodation and tourist attractions are likely to close in the low season, so it’s best to ride in spring or summer. While some stages end in big cities, others end in more rural areas and you’ll need to book your accommodation in advance. It’s not necessary to book restaurants along the route, but it is best to plan stops for refreshments, as not all the villages you pass through have restaurants or shops.", - "id": "bdv9iukn4d2lf2i", - "name": "From Paris to Mont-Saint-Michel — La Véloscénie", - "public": false, - "trails": [ - "jou2tcf0y8jj9m3", - "ilyvsa4xr52lxlr", - "2y8o7bwmor4yltt", - "gmh81mczhjp834l", - "6hpvcyosmqr8uk8", - "iql9fifaxnb5u6m", - "y9hjysn5xhbmi86", - "fehuzqkfi49hkwn", - "fmin7pbj8urtxx0", - "14y4qxqbqh0n10m", - "6fv6krwusycttbl", - "66jj108gizquc2r", - "wbuwzu8tp48hljg", - "x3lo6ru4ly753w6", - "h91u3vl8n5ekune", - "bzodytd0vd2e56g", - "oy1auygew9fvha0", - "6atd6i73bzle0ar", - "iz2ohx9hbn8irrc", - "2o9c3pxfvrzclud", - "btn09xkl7ab0n9k", - "ek2cb00tw4v4fav" - ], - "updated": "2024-12-27 00:55:25.917Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "caret_right_solid_iUtggzDoh7.svg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2024-12-27 00:55:21.456Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a trail.", - "operationId": "createTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name of the trail" - }, - "public": { - "type": "boolean", - "description": "Visible for everyone" - }, - "category": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "Category Id" - }, - "date": { - "type": "string", - "format": "date", - "description": "Date of the trail" - }, - "description": { - "type": "string", - "description": "Description of the trail" - }, - "difficulty": { - "type": "string", - "enum": [ - "easy", - "moderate", - "hard" - ], - "description": "Difficulty of the trail" - }, - "distance": { - "type": "number", - "description": "Distance in meters", - "minimum": 0 - }, - "duration": { - "type": "number", - "description": "Duration in seconds", - "minimum": 0 - }, - "elevation_gain": { - "type": "number", - "description": "Elevation gain in vertical meters", - "minimum": 0 - }, - "elevation_loss": { - "type": "number", - "description": "Elevation loss in vertical meters", - "minimum": 0 - }, - "lat": { - "type": "number", - "description": "Latitude of the starting point", - "minimum": -90, - "maximum": 90 - }, - "location": { - "type": "string", - "description": "Nearest city/village" - }, - "lon": { - "type": "number", - "description": "Longitude of the starting point", - "minimum": -180, - "maximum": 180 - }, - "thumbnail": { - "type": "integer", - "description": "Index of the photo that should be used as the thumbnail.", - "minimum": 0 - }, - "author": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id" - } - }, - "required": [ - "name", - "public", - "author" - ] - }, - "example": { - "name": "at error minus", - "public": false, - "category": "l3q348pprel6opd", - "date": "2025-01-03T00:36:48.554Z", - "description": "Minima architecto maiores maiores architecto. Nobis aliquid magni magni ipsum. Itaque maxime mollitia. Laboriosam placeat ipsa omnis magni atque non.", - "difficulty": "moderate", - "distance": 46585640.67167308, - "duration": 8687485.195364153, - "elevation_gain": 4089694.238652264, - "elevation_loss": 12108588.345680581, - "lat": 86.60827022966254, - "location": "sunt", - "lon": 112.96378311445648, - "thumbnail": 0, - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "l3q348pprel6opd", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2025-01-03 11:36:58.976Z", - "date": "2025-01-03 00:36:48.554Z", - "description": "Minima architecto maiores maiores architecto. Nobis aliquid magni magni ipsum. Itaque maxime mollitia. Laboriosam placeat ipsa omnis magni atque non.", - "difficulty": "moderate", - "distance": 46585640.67167308, - "duration": 8687485.195364153, - "elevation_gain": 4089694.238652264, - "elevation_loss": 12108588.345680581, - "gpx": "", - "id": "d9ba280yjycrk0k", - "lat": 86.60827022966254, - "location": "sunt", - "lon": 112.96378311445648, - "name": "at error minus", - "photos": [], - "public": false, - "summit_logs": [], - "thumbnail": 0, - "updated": "2025-01-03 11:36:58.976Z", - "waypoints": [] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "validation": { - "type": "string" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "code", - "message", - "path" - ] - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_string", - "validation": "date", - "message": "Invalid date", - "path": [ - "date" - ] - }, - { - "code": "custom", - "message": "invalid-date", - "path": [ - "date" - ] - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single trail.", - "operationId": "showTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Trail Id", - "required": true, - "example": "95bb1d77c8dfa98", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints", - "expand" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "pbwx1lg2nmcih0w", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-12-30 18:57:35.453Z", - "date": "2024-12-30", - "description": "", - "difficulty": "moderate", - "distance": 5631.307320599051, - "duration": 0, - "elevation_gain": 76, - "elevation_loss": 76, - "gpx": "blob_0E0x721wan.gpx", - "id": "z94vgei3jdc37k4", - "lat": 47.385232, - "location": "", - "lon": 9.655863, - "name": "Die Pottsau", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_2SQmCCI6DV.jpg", - "caret_right_solid_9154Rrvk6B.svg" - ], - "public": false, - "summit_logs": [ - "95bb1d77c8dfa98" - ], - "thumbnail": 1, - "updated": "2024-12-30 18:59:56.924Z", - "waypoints": [ - "7f6d2a8c9d50136", - "60c2d435a5b66ed" - ], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "", - "operationId": "updateTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Trail Id", - "required": true, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name of the trail" - }, - "category": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "Category Id" - }, - "date": { - "type": "string", - "format": "date", - "description": "Date of the trail" - }, - "description": { - "type": "string", - "description": "Description of the trail" - }, - "difficulty": { - "type": "string", - "enum": [ - "easy", - "moderate", - "hard" - ], - "description": "Difficulty of the trail" - }, - "distance": { - "type": "number", - "description": "Distance in meters", - "minimum": 0 - }, - "duration": { - "type": "number", - "description": "Duration in seconds", - "minimum": 0 - }, - "elevation_gain": { - "type": "number", - "description": "Elevation gain in vertical meters", - "minimum": 0 - }, - "elevation_loss": { - "type": "number", - "description": "Elevation loss in vertical meters", - "minimum": 0 - }, - "lat": { - "type": "number", - "description": "Latitude of the starting point", - "minimum": -90, - "maximum": 90 - }, - "location": { - "type": "string", - "description": "Nearest city/village" - }, - "lon": { - "type": "number", - "description": "Longitude of the starting point", - "minimum": -180, - "maximum": 180 - }, - "public": { - "type": "boolean", - "description": "Visible for everyone" - }, - "thumbnail": { - "type": "integer", - "description": "Index of the photo that should be used as the thumbnail.", - "minimum": 0 - } - } - }, - "example": { - "name": "inventore est laboriosam", - "category": "7sqwezntokmbvdr", - "date": "2025-01-03T07:14:55.803Z", - "description": "At dolor deleniti architecto nulla nemo in perspiciatis. Iste iusto ex quidem sed modi. Ipsam unde doloribus aut. Molestias ducimus molestias soluta.", - "difficulty": "easy", - "distance": 71499916.19683264, - "duration": 87771408.86514412, - "elevation_gain": 67291819.86293587, - "elevation_loss": 76718134.08675973, - "lat": 85.23610854378416, - "location": "ex laborum", - "lon": -48.60959423486602, - "public": true, - "thumbnail": 0 - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "7sqwezntokmbvdr", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2025-01-03 11:42:07.848Z", - "date": "2025-01-03 07:14:55.803Z", - "description": "At dolor deleniti architecto nulla nemo in perspiciatis. Iste iusto ex quidem sed modi. Ipsam unde doloribus aut. Molestias ducimus molestias soluta.", - "difficulty": "easy", - "distance": 71499916.19683264, - "duration": 87771408.86514412, - "elevation_gain": 67291819.86293587, - "elevation_loss": 76718134.08675973, - "gpx": "2021_11_14_564807964_dusseldorf_angermund_nach_ZpNsRB5SEW.Neuss-Hamm.gpx", - "id": "hfdmpa1n1ulyr64", - "lat": 85.23610854378416, - "location": "ex laborum", - "lon": -48.60959423486602, - "name": "inventore est laboriosam", - "photos": [], - "public": true, - "summit_logs": [ - "3pagejfjt1cz4vr" - ], - "thumbnail": 0, - "updated": "2025-01-03 11:48:41.963Z", - "waypoints": [] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a summit log.", - "operationId": "deleteTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail/upload": { - "put": { - "summary": "upload", - "deprecated": false, - "description": "Automatically creates a trail from the uploaded file. Tries to infer as much information as possible from the file's metadata.", - "operationId": "uploadTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/gpx+xml", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "file": { - "format": "binary", - "type": "string", - "description": "File containing GPS track data. Allowed file types: GPX, JSON, FIT, KML", - "example": "file:///Users/christianbeutel/Downloads/4_champex_to_le_chable.gpx" - }, - "name": { - "description": "File name", - "example": "", - "type": "string" - } - }, - "required": [ - "file" - ] - }, - "example": "/Users/christianbeutel/Downloads/2021-10-24_536064034_Essen-Mitte.nach.Bochum-Hauptbahnhof.gpx" - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2025-01-03 11:42:07.848Z", - "date": "2021-11-14 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 24077.68400534589, - "duration": 297.01666666666665, - "elevation_gain": 40.10210099999998, - "elevation_loss": 45.42742099999999, - "gpx": "2021_11_14_564807964_dusseldorf_angermund_nach_ZpNsRB5SEW.Neuss-Hamm.gpx", - "id": "hfdmpa1n1ulyr64", - "lat": 51.33429, - "location": "", - "lon": 6.768533, - "name": "Düsseldorf-Angermund nach Neuss-Hamm", - "photos": [], - "public": false, - "summit_logs": [ - "3pagejfjt1cz4vr" - ], - "thumbnail": 0, - "updated": "2025-01-03 11:42:07.962Z", - "waypoints": [] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "status": { - "type": "integer" - }, - "response": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ] - }, - "isAbort": { - "type": "boolean" - }, - "originalError": { - "type": "object", - "properties": { - "status": { - "type": "integer" - }, - "response": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ] - } - }, - "required": [ - "status", - "response" - ] - }, - "name": { - "type": "string" - } - }, - "required": [ - "url", - "status", - "response", - "isAbort", - "originalError", - "name" - ] - }, - "example": { - "url": "", - "status": 400, - "response": { - "message": "Invalid file" - }, - "isAbort": false, - "originalError": { - "status": 400, - "response": { - "message": "Invalid file" - } - }, - "name": "ClientResponseError 400" - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail/{id}/file": { - "post": { - "summary": "file", - "deprecated": false, - "description": "Uploads or removes photos, uploads GPS data file for a trail.", - "operationId": "fileTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Trail Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "photos": { - "format": "binary", - "type": "string", - "description": "List of image files to add. Allowed file types: PNG, JPG, WEBP, SVG", - "example": [ - "" - ] - }, - "photos-": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of file names to delete.", - "example": "" - }, - "gpx": { - "type": "string", - "format": "binary", - "minLength": 0, - "maxLength": 1, - "description": "File containing GPS track data. Allowed file types: GPX, JSON, FIT, KML", - "example": "file:///Users/christianbeutel/Downloads/2021-10-24_536064034_Essen-Mitte.nach.Bochum-Hauptbahnhof.gpx" - } - } - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "7sqwezntokmbvdr", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2025-01-03 11:42:07.848Z", - "date": "2025-01-03 07:14:55.803Z", - "description": "At dolor deleniti architecto nulla nemo in perspiciatis. Iste iusto ex quidem sed modi. Ipsam unde doloribus aut. Molestias ducimus molestias soluta.", - "difficulty": "easy", - "distance": 71499916.19683264, - "duration": 87771408.86514412, - "elevation_gain": 67291819.86293587, - "elevation_loss": 76718134.08675973, - "gpx": "4_champex_to_le_chable_h8sE0CwAes.gpx", - "id": "hfdmpa1n1ulyr64", - "lat": 85.23610854378416, - "location": "ex laborum", - "lon": -48.60959423486602, - "name": "inventore est laboriosam", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_0h84aa22yv.jpg", - "23xxesym0e9w18z2904frnpgy7_7JhLWsRrsm.jpg" - ], - "public": true, - "summit_logs": [ - "3pagejfjt1cz4vr" - ], - "thumbnail": 0, - "updated": "2025-01-03 12:08:43.037Z", - "waypoints": [] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - } - }, - "components": { - "schemas": {}, - "securitySchemes": { - "apikey-header-pb_auth": { - "type": "apiKey", - "in": "header", - "name": "pb_auth" - } - } - }, - "servers": [], - "security": [ - { - "apikey-header-pb_auth": [] - } - ] -} \ No newline at end of file diff --git a/web/package-lock.json b/web/package-lock.json index 90183c77..9094e739 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -68,12 +68,61 @@ "postcss": "^8.5.6", "svelte": "^5.53.6", "svelte-check": "^4.3.6", + "sveltekit-openapi-generator": "^0.1.5", "tailwindcss": "^4.0.0", "tslib": "^2.4.1", "typescript": "^5.9.3", "vite": "^8.0.8" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", + "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^5.0.1" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, "node_modules/@babel/runtime": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", @@ -216,6 +265,109 @@ "node": ">=6" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", @@ -274,6 +426,13 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true, + "license": "MIT" + }, "node_modules/@kurkle/color": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", @@ -390,6 +549,17 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@playwright/test": { "version": "1.58.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", @@ -2072,6 +2242,20 @@ "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", "license": "MIT" }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", @@ -2351,6 +2535,21 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2375,6 +2574,18 @@ "node": ">=12" } }, + "node_modules/atlassian-openapi": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/atlassian-openapi/-/atlassian-openapi-1.0.21.tgz", + "integrity": "sha512-1OnnoY2CQYHgXrce/06BltL7fox+uVY7brHUInyFbMpTURjTNIGXfLQxVDRo/2On7ryyKzkX7FfNApYhXw7f+w==", + "deprecated": "DEPRECATED: atlassian-openapi has moved to @atlassian/atlassian-openapi. The latest version is 1.0.6. Please update your dependency.", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonpointer": "^5.0.0", + "urijs": "^1.19.10" + } + }, "node_modules/autoprefixer": { "version": "10.4.24", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", @@ -2420,6 +2631,13 @@ "node": ">= 0.4" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -2468,6 +2686,16 @@ "require-from-string": "^2.0.2" } }, + "node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/brotli": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", @@ -2510,6 +2738,13 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true, + "license": "MIT" + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -2700,11 +2935,28 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2744,6 +2996,44 @@ "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "license": "MIT" }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", @@ -2857,6 +3147,19 @@ "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", "license": "MIT" }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dompurify": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz", @@ -2876,6 +3179,13 @@ "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==", "license": "ISC" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.286", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", @@ -3028,6 +3338,16 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -3147,6 +3467,23 @@ "unicode-trie": "^2.0.0" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -3160,6 +3497,13 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -3216,6 +3560,28 @@ "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", "license": "MIT" }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global-prefix": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", @@ -3315,6 +3681,18 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "license": "MIT" }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -3418,6 +3796,22 @@ "xml2js": "^0.4.19" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -3433,6 +3827,19 @@ "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==", "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/json-diff-ts": { "version": "4.8.2", "resolved": "https://registry.npmjs.org/json-diff-ts/-/json-diff-ts-4.8.2.tgz", @@ -3445,6 +3852,16 @@ "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", "license": "MIT" }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jspdf": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.2.1.tgz", @@ -3835,6 +4252,43 @@ "node": ">=8" } }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", @@ -3970,6 +4424,22 @@ "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", "license": "MIT" }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -3979,6 +4449,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -4064,6 +4544,36 @@ ], "license": "MIT" }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openapi-merge": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/openapi-merge/-/openapi-merge-1.3.3.tgz", + "integrity": "sha512-zC6DE+ekFJwWMwssb+LOkZbYqlA/LCaFT4RdhSpDpxF4vaMoPNDuztWFkEAImhLMg4GKvoQH6gUvAKzaXDRC2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "atlassian-openapi": "^1.0.8", + "lodash": "^4.17.15", + "ts-is-present": "^1.1.1" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/orderedmap": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", @@ -4106,6 +4616,13 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -4121,11 +4638,48 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -4777,12 +5331,48 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "license": "MIT" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "license": "ISC" }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/sirv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", @@ -4850,6 +5440,22 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4862,6 +5468,20 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supercluster": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", @@ -5372,6 +5992,25 @@ "@types/estree": "^1.0.6" } }, + "node_modules/sveltekit-openapi-generator": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/sveltekit-openapi-generator/-/sveltekit-openapi-generator-0.1.5.tgz", + "integrity": "sha512-98EiU64AicZRIbHHRSOQcaaX/YEVk64mC+3GvVwgBesIe2cmen4B+YNHkSLijAZSntIfFSz2LUBfHMGhXJXcXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/js-yaml": "^4.0.9", + "glob": "^10.3.12", + "js-yaml": "^4.1.0", + "openapi-merge": "^1.3.3", + "swagger-jsdoc": "^6.2.8" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.0.0", + "svelte": "^4.0.0 || ^5.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, "node_modules/svg-pathdata": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", @@ -5381,6 +6020,96 @@ "node": ">=12.0.0" } }, + "node_modules/swagger-jsdoc": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", + "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "6.2.0", + "doctrine": "3.0.0", + "glob": "7.1.6", + "lodash.mergewith": "^4.6.2", + "swagger-parser": "^10.0.3", + "yaml": "2.0.0-1" + }, + "bin": { + "swagger-jsdoc": "bin/swagger-jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/swagger-jsdoc/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/swagger-jsdoc/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/swagger-jsdoc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/swagger-jsdoc/node_modules/yaml": { + "version": "2.0.0-1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", + "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "10.0.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tailwindcss": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", @@ -5551,6 +6280,13 @@ "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", "license": "MIT" }, + "node_modules/ts-is-present": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ts-is-present/-/ts-is-present-1.2.2.tgz", + "integrity": "sha512-cA5MPLWGWYXvnlJb4TamUUx858HVHBsxxdy8l7jxODOLDyGYnQOllob2A2jyDghGa5iJHs2gzFNHvwGJ0ZfR8g==", + "dev": true, + "license": "MIT" + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -5666,6 +6402,13 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "dev": true, + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5682,6 +6425,16 @@ "base64-arraybuffer": "^1.0.2" } }, + "node_modules/validator": { + "version": "13.15.35", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", + "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vite": { "version": "8.0.8", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", @@ -5955,21 +6708,32 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -5998,6 +6762,23 @@ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "license": "ISC" }, + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", @@ -6033,6 +6814,38 @@ "node": ">=6" } }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/zimmerframe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", diff --git a/web/package.json b/web/package.json index 433e6355..80a73b29 100644 --- a/web/package.json +++ b/web/package.json @@ -22,6 +22,7 @@ "postcss": "^8.5.6", "svelte": "^5.53.6", "svelte-check": "^4.3.6", + "sveltekit-openapi-generator": "^0.1.5", "tailwindcss": "^4.0.0", "tslib": "^2.4.1", "typescript": "^5.9.3", @@ -78,5 +79,10 @@ "three": "^0.182.0", "vitest": "^4.1.4", "zod": "^3.24.1" + }, + "overrides": { + "sveltekit-openapi-generator": { + "vite": "$vite" + } } } diff --git a/web/src/lib/components/user_search.svelte b/web/src/lib/components/user_search.svelte deleted file mode 100644 index 06be331e..00000000 --- a/web/src/lib/components/user_search.svelte +++ /dev/null @@ -1,79 +0,0 @@ - - - updateUsers(q)} - onclick={(item) => onClick(item)} - placeholder={`${$_("username")}...`} - items={searchItems} - {clearAfterSelect} - {label} - bind:value -> - {#snippet prepend({ item })} - avatar - {/snippet} - diff --git a/web/src/lib/models/api/openapi_schemas.ts b/web/src/lib/models/api/openapi_schemas.ts new file mode 100644 index 00000000..f0d3fb54 --- /dev/null +++ b/web/src/lib/models/api/openapi_schemas.ts @@ -0,0 +1,1224 @@ +/** + * @swagger + * components: + * schemas: + * APIToken: + * type: object + * required: + * - id + * - name + * - user + * properties: + * id: + * type: string + * description: Token ID (15 chars) + * name: + * type: string + * description: Token name + * user: + * type: string + * description: User ID that owns this token + * expiration: + * type: string + * format: date-time + * description: Optional expiration date + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * APITokenInput: + * type: object + * required: + * - name + * - user + * properties: + * name: + * type: string + * minLength: 1 + * description: Token name + * expiration: + * type: string + * format: date-time + * description: Optional expiration date (must be in future) + * user: + * type: string + * description: User ID (15 chars) + * + * User: + * type: object + * required: + * - id + * - username + * - email + * properties: + * id: + * type: string + * description: User ID (15 chars) + * username: + * type: string + * description: Username (3+ chars, alphanumeric with dots) + * email: + * type: string + * format: email + * description: User email address + * avatar: + * type: string + * description: Avatar file path + * verified: + * type: boolean + * description: Email verification status + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * UserCreateInput: + * type: object + * required: + * - username + * - email + * - password + * properties: + * username: + * type: string + * minLength: 3 + * pattern: '^\w[\w\.]*$' + * description: Username (3+ chars, starts with word char) + * email: + * type: string + * format: email + * description: User email address + * password: + * type: string + * minLength: 8 + * maxLength: 72 + * description: Password (8-72 chars) + * passwordConfirm: + * type: string + * description: Password confirmation (must match password) + * + * UserUpdateInput: + * type: object + * properties: + * username: + * type: string + * minLength: 3 + * pattern: '^\w[\w\.]*$' + * email: + * type: string + * format: email + * password: + * type: string + * minLength: 8 + * maxLength: 72 + * oldPassword: + * type: string + * description: Required when changing password + * passwordConfirm: + * type: string + * description: Must match password + * + * Tag: + * type: object + * required: + * - id + * - name + * properties: + * id: + * type: string + * description: Tag ID (15 chars) + * name: + * type: string + * description: Tag name + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * TagInput: + * type: object + * required: + * - name + * properties: + * name: + * type: string + * description: Tag name + * + * TagUpdateInput: + * type: object + * properties: + * name: + * type: string + * description: Tag name + * + * Trail: + * type: object + * required: + * - id + * - name + * - author + * - public + * properties: + * id: + * type: string + * description: Trail ID (15 chars) + * name: + * type: string + * description: Trail name + * description: + * type: string + * location: + * type: string + * author: + * type: string + * description: Author user ID + * date: + * type: string + * format: date + * public: + * type: boolean + * difficulty: + * type: string + * enum: [easy, moderate, difficult] + * lat: + * type: number + * minimum: -90 + * maximum: 90 + * lon: + * type: number + * minimum: -180 + * maximum: 180 + * distance: + * type: number + * description: Distance in meters + * elevation_gain: + * type: number + * description: Elevation gain in meters + * elevation_loss: + * type: number + * description: Elevation loss in meters + * duration: + * type: number + * description: Duration in seconds + * photos: + * type: array + * items: + * type: string + * thumbnail: + * type: integer + * description: Index of thumbnail photo + * like_count: + * type: integer + * default: 0 + * category: + * type: string + * description: Category ID (15 chars) + * tags: + * type: array + * items: + * type: string + * gpx: + * type: string + * description: GPX file path + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * TrailCreateInput: + * type: object + * required: + * - name + * - author + * - public + * properties: + * id: + * type: string + * description: Optional custom ID (15 chars) + * name: + * type: string + * minLength: 1 + * author: + * type: string + * description: Author user ID (15 chars) + * description: + * type: string + * location: + * type: string + * date: + * type: string + * format: date + * public: + * type: boolean + * difficulty: + * type: string + * enum: [easy, moderate, difficult] + * lat: + * type: number + * minimum: -90 + * maximum: 90 + * lon: + * type: number + * minimum: -180 + * maximum: 180 + * distance: + * type: number + * elevation_gain: + * type: number + * elevation_loss: + * type: number + * duration: + * type: number + * photos: + * type: array + * items: + * type: string + * default: [] + * thumbnail: + * type: integer + * like_count: + * type: integer + * default: 0 + * category: + * type: string + * tags: + * type: array + * items: + * type: string + * default: [] + * gpx: + * type: string + * + * TrailUpdateInput: + * type: object + * properties: + * name: + * type: string + * description: + * type: string + * location: + * type: string + * date: + * type: string + * format: date + * public: + * type: boolean + * difficulty: + * type: string + * enum: [easy, moderate, difficult] + * lat: + * type: number + * minimum: -90 + * maximum: 90 + * lon: + * type: number + * minimum: -180 + * maximum: 180 + * distance: + * type: number + * elevation_gain: + * type: number + * elevation_loss: + * type: number + * duration: + * type: number + * photos: + * type: array + * items: + * type: string + * 'photos-': + * type: string + * description: Remove photo by name + * 'photos+': + * type: string + * description: Add photo by name + * thumbnail: + * type: integer + * like_count: + * type: integer + * default: 0 + * category: + * type: string + * tags: + * type: array + * items: + * type: string + * gpx: + * type: string + * + * Comment: + * type: object + * required: + * - id + * - text + * - author + * - trail + * properties: + * id: + * type: string + * description: Comment ID (15 chars) + * text: + * type: string + * author: + * type: string + * description: Author user ID (15 chars) + * trail: + * type: string + * description: Trail ID (15 chars) + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * CommentInput: + * type: object + * required: + * - text + * - author + * - trail + * properties: + * text: + * type: string + * author: + * type: string + * description: Author user ID (15 chars) + * trail: + * type: string + * description: Trail ID (15 chars) + * + * CommentUpdateInput: + * type: object + * properties: + * text: + * type: string + * + * SummitLog: + * type: object + * required: + * - id + * - date + * - author + * properties: + * id: + * type: string + * description: Summit log ID (15 chars) + * date: + * type: string + * format: date + * text: + * type: string + * author: + * type: string + * description: Author user ID (15 chars) + * trail: + * type: string + * description: Associated trail ID + * gpx: + * type: string + * distance: + * type: number + * elevation_gain: + * type: number + * elevation_loss: + * type: number + * duration: + * type: number + * photos: + * type: array + * items: + * type: string + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * SummitLogInput: + * type: object + * required: + * - date + * - author + * properties: + * id: + * type: string + * description: Optional custom ID (15 chars) + * date: + * type: string + * format: date + * text: + * type: string + * author: + * type: string + * description: Author user ID (15 chars) + * trail: + * type: string + * description: Trail ID (15 chars) + * gpx: + * type: string + * distance: + * type: number + * elevation_gain: + * type: number + * elevation_loss: + * type: number + * duration: + * type: number + * photos: + * type: array + * items: + * type: string + * default: [] + * + * SummitLogUpdateInput: + * type: object + * properties: + * date: + * type: string + * format: date + * text: + * type: string + * gpx: + * type: string + * distance: + * type: number + * elevation_gain: + * type: number + * elevation_loss: + * type: number + * duration: + * type: number + * photos: + * type: array + * items: + * type: string + * 'photos-': + * type: string + * description: Remove photo by name + * 'photos+': + * type: string + * description: Add photo by name + * + * Waypoint: + * type: object + * required: + * - id + * - lat + * - lon + * - author + * properties: + * id: + * type: string + * description: Waypoint ID (15 chars) + * name: + * type: string + * description: + * type: string + * lat: + * type: number + * minimum: -90 + * maximum: 90 + * lon: + * type: number + * minimum: -180 + * maximum: 180 + * distance_from_start: + * type: number + * description: Distance from trail start in meters + * icon: + * type: string + * description: Icon identifier + * author: + * type: string + * description: Author user ID (15 chars) + * photos: + * type: array + * items: + * type: string + * trail: + * type: string + * description: Trail ID (15 chars) + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * WaypointInput: + * type: object + * required: + * - lat + * - lon + * - author + * properties: + * id: + * type: string + * description: Optional custom ID (15 chars) + * name: + * type: string + * description: + * type: string + * lat: + * type: number + * minimum: -90 + * maximum: 90 + * lon: + * type: number + * minimum: -180 + * maximum: 180 + * distance_from_start: + * type: number + * icon: + * type: string + * author: + * type: string + * description: Author user ID (15 chars) + * photos: + * type: array + * items: + * type: string + * default: [] + * trail: + * type: string + * + * WaypointUpdateInput: + * type: object + * properties: + * name: + * type: string + * description: + * type: string + * lat: + * type: number + * minimum: -90 + * maximum: 90 + * lon: + * type: number + * minimum: -180 + * maximum: 180 + * distance_from_start: + * type: number + * icon: + * type: string + * photos: + * type: array + * items: + * type: string + * 'photos-': + * type: string + * description: Remove photo by name + * 'photos+': + * type: string + * description: Add photo by name + * + * List: + * type: object + * required: + * - id + * - name + * - author + * - public + * properties: + * id: + * type: string + * description: List ID (15 chars) + * name: + * type: string + * public: + * type: boolean + * description: + * type: string + * author: + * type: string + * description: Author user ID + * trails: + * type: array + * items: + * type: string + * description: Trail IDs (15 chars) + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * ListInput: + * type: object + * required: + * - name + * - public + * - trails + * - author + * properties: + * id: + * type: string + * description: Optional custom ID (15 chars) + * name: + * type: string + * minLength: 1 + * public: + * type: boolean + * description: + * type: string + * trails: + * type: array + * items: + * type: string + * description: Trail ID (15 chars) + * author: + * type: string + * + * ListUpdateInput: + * type: object + * properties: + * name: + * type: string + * public: + * type: boolean + * description: + * type: string + * trails: + * type: array + * items: + * type: string + * 'trails-': + * type: string + * description: Remove trail by ID + * 'trails+': + * type: string + * description: Add trail by ID + * + * TrailShare: + * type: object + * required: + * - id + * - actor + * - trail + * - permission + * properties: + * id: + * type: string + * description: Share ID (15 chars) + * actor: + * type: string + * format: uri + * description: ActivityPub actor IRI + * trail: + * type: string + * description: Trail ID (15 chars) + * permission: + * type: string + * enum: [view, edit] + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * TrailShareInput: + * type: object + * required: + * - actor + * - trail + * - permission + * properties: + * actor: + * type: string + * format: uri + * description: ActivityPub actor IRI + * trail: + * type: string + * description: Trail ID (15 chars) + * permission: + * type: string + * enum: [view, edit] + * + * TrailShareUpdateInput: + * type: object + * required: + * - permission + * properties: + * permission: + * type: string + * enum: [view, edit] + * + * ListShare: + * type: object + * required: + * - id + * - actor + * - list + * - permission + * properties: + * id: + * type: string + * description: Share ID (15 chars) + * actor: + * type: string + * format: uri + * description: ActivityPub actor IRI + * list: + * type: string + * description: List ID (15 chars) + * permission: + * type: string + * enum: [view, edit] + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * ListShareInput: + * type: object + * required: + * - actor + * - list + * - permission + * properties: + * actor: + * type: string + * format: uri + * description: ActivityPub actor IRI + * list: + * type: string + * description: List ID (15 chars) + * permission: + * type: string + * enum: [view, edit] + * + * ListShareUpdateInput: + * type: object + * required: + * - permission + * properties: + * permission: + * type: string + * enum: [view, edit] + * + * TrailLinkShare: + * type: object + * required: + * - id + * - trail + * - permission + * properties: + * id: + * type: string + * description: Share ID (15 chars) + * trail: + * type: string + * description: Trail ID (15 chars) + * permission: + * type: string + * enum: [view, edit] + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * TrailLinkShareInput: + * type: object + * required: + * - trail + * - permission + * properties: + * trail: + * type: string + * description: Trail ID (15 chars) + * permission: + * type: string + * enum: [view, edit] + * + * TrailLinkShareUpdateInput: + * type: object + * required: + * - permission + * properties: + * permission: + * type: string + * enum: [view, edit] + * + * TrailLike: + * type: object + * required: + * - id + * - actor + * - trail + * properties: + * id: + * type: string + * description: Like ID (15 chars) + * actor: + * type: string + * description: User ID (15 chars) + * trail: + * type: string + * description: Trail ID (15 chars) + * created: + * type: string + * format: date-time + * + * TrailLikeInput: + * type: object + * required: + * - actor + * - trail + * properties: + * actor: + * type: string + * description: User ID (15 chars) + * trail: + * type: string + * description: Trail ID (15 chars) + * + * Follow: + * type: object + * required: + * - id + * - follower + * - followee + * properties: + * id: + * type: string + * description: Follow ID (15 chars) + * follower: + * type: string + * description: Follower user ID + * followee: + * type: string + * description: Followee user ID (15 chars) + * created: + * type: string + * format: date-time + * + * FollowInput: + * type: object + * required: + * - followee + * properties: + * followee: + * type: string + * description: Followee user ID (15 chars) + * + * Integration: + * type: object + * required: + * - id + * - user + * properties: + * id: + * type: string + * description: Integration ID (15 chars) + * user: + * type: string + * description: User ID (15 chars) + * strava: + * type: object + * properties: + * clientId: + * type: integer + * clientSecret: + * type: string + * routes: + * type: boolean + * activities: + * type: boolean + * active: + * type: boolean + * after: + * type: string + * format: date + * privacy: + * type: string + * enum: [original, settings] + * komoot: + * type: object + * properties: + * email: + * type: string + * format: email + * password: + * type: string + * completed: + * type: boolean + * planned: + * type: boolean + * active: + * type: boolean + * privacy: + * type: string + * enum: [original, settings] + * hammerhead: + * type: object + * properties: + * email: + * type: string + * format: email + * password: + * type: string + * completed: + * type: boolean + * planned: + * type: boolean + * active: + * type: boolean + * after: + * type: string + * format: date + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * IntegrationInput: + * type: object + * required: + * - user + * properties: + * user: + * type: string + * description: User ID (15 chars) + * strava: + * type: object + * komoot: + * type: object + * hammerhead: + * type: object + * + * IntegrationUpdateInput: + * type: object + * properties: + * strava: + * type: object + * nullable: true + * komoot: + * type: object + * nullable: true + * hammerhead: + * type: object + * nullable: true + * + * Notification: + * type: object + * required: + * - id + * - user + * - type + * - seen + * properties: + * id: + * type: string + * description: Notification ID (15 chars) + * user: + * type: string + * description: User ID (15 chars) + * type: + * type: string + * description: Notification type + * seen: + * type: boolean + * default: false + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * NotificationUpdateInput: + * type: object + * required: + * - seen + * properties: + * seen: + * type: boolean + * const: true + * description: Mark as read + * + * Settings: + * type: object + * required: + * - id + * properties: + * id: + * type: string + * description: Settings ID (15 chars) + * unit: + * type: string + * enum: [metric, imperial] + * language: + * type: string + * description: Language code + * bio: + * type: string + * nullable: true + * mapFocus: + * type: string + * enum: [trails, location] + * location: + * type: object + * properties: + * name: + * type: string + * lat: + * type: number + * lon: + * type: number + * nullable: true + * category: + * type: string + * tilesets: + * type: array + * items: + * type: object + * properties: + * name: + * type: string + * url: + * type: string + * format: uri + * nullable: true + * terrain: + * type: object + * properties: + * terrain: + * type: string + * format: uri + * hillshading: + * type: string + * format: uri + * nullable: true + * user: + * type: string + * privacy: + * type: object + * properties: + * account: + * type: string + * enum: [public, private] + * trails: + * type: string + * enum: [public, private] + * lists: + * type: string + * enum: [public, private] + * nullable: true + * created: + * type: string + * format: date-time + * updated: + * type: string + * format: date-time + * + * SettingsInput: + * type: object + * properties: + * unit: + * type: string + * enum: [metric, imperial] + * language: + * type: string + * bio: + * type: string + * nullable: true + * mapFocus: + * type: string + * enum: [trails, location] + * location: + * type: object + * properties: + * name: + * type: string + * lat: + * type: number + * lon: + * type: number + * nullable: true + * category: + * type: string + * tilesets: + * type: array + * items: + * type: object + * properties: + * name: + * type: string + * url: + * type: string + * format: uri + * nullable: true + * terrain: + * type: object + * properties: + * terrain: + * type: string + * format: uri + * hillshading: + * type: string + * format: uri + * nullable: true + * user: + * type: string + * privacy: + * type: object + * properties: + * account: + * type: string + * enum: [public, private] + * trails: + * type: string + * enum: [public, private] + * lists: + * type: string + * enum: [public, private] + * nullable: true + * + * ListResult: + * type: object + * properties: + * page: + * type: integer + * perPage: + * type: integer + * totalItems: + * type: integer + * totalPages: + * type: integer + * items: + * type: array + * items: + * type: object + * + * Error: + * type: object + * required: + * - message + * properties: + * message: + * type: string + * code: + * type: integer + * data: + * type: object + */ +export {}; diff --git a/web/src/lib/stores/user_store.ts b/web/src/lib/stores/user_store.ts index 53363cb3..7b4f46d6 100644 --- a/web/src/lib/stores/user_store.ts +++ b/web/src/lib/stores/user_store.ts @@ -23,37 +23,6 @@ export async function users_create(user: User) { return createdUser; } -export async function users_search(q: string, includeSelf: boolean = true) { - const user = get(currentUser) - - let r = await fetch('/api/v1/user/anonymous?' + new URLSearchParams({ - "filter": `username~"${q}"${includeSelf ? '' : `&&id!="${user?.id}"`}`, - }), { - method: 'GET', - }) - if (!r.ok) { - const response = await r.json(); - throw new APIError(r.status, response.message, response.detail) - } - - const response = await r.json() - return response.items; - -} - -export async function users_show(id: string, f: (url: RequestInfo | URL, config?: RequestInit) => Promise = fetch) { - let r = await f(`/api/v1/user/anonymous/${id}`, { - method: 'GET', - }) - if (!r.ok) { - const response = await r.json(); - throw new APIError(r.status, response.message, response.detail) - } - const response: UserAnonymous = await r.json() - - return response; -} - export async function users_auth_methods(f: (url: RequestInfo | URL, config?: RequestInit) => Promise = fetch): Promise { const r = await f('/api/v1/auth/oauth', { method: 'GET', diff --git a/web/src/routes/api/v1/activitypub/activity/[id]/+server.ts b/web/src/routes/api/v1/activitypub/activity/[id]/+server.ts index 6c995efd..8d739fea 100644 --- a/web/src/routes/api/v1/activitypub/activity/[id]/+server.ts +++ b/web/src/routes/api/v1/activitypub/activity/[id]/+server.ts @@ -3,6 +3,32 @@ import { Collection, handleError, show } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; import type { APActivity, APRoot } from 'activitypub-types'; +/** + * @swagger + * /api/v1/activitypub/activity/{id}: + * get: + * summary: Get ActivityPub activity + * description: Retrieves an ActivityPub Activity object by ID + * tags: + * - ActivityPub + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: ActivityPub Activity object + * content: + * application/json: + * schema: + * type: object + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const a = await show(event, Collection.activitypub_activities) diff --git a/web/src/routes/api/v1/activitypub/comment/[id]/+server.ts b/web/src/routes/api/v1/activitypub/comment/[id]/+server.ts index 489b85bb..0070d355 100644 --- a/web/src/routes/api/v1/activitypub/comment/[id]/+server.ts +++ b/web/src/routes/api/v1/activitypub/comment/[id]/+server.ts @@ -3,6 +3,32 @@ import { handleError } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/activitypub/comment/{id}: + * get: + * summary: Get ActivityPub comment + * description: Retrieves an ActivityPub Comment object by ID (proxied from backend) + * tags: + * - ActivityPub + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: ActivityPub Comment object + * content: + * application/json: + * schema: + * type: object + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { const id = event.params.id; diff --git a/web/src/routes/api/v1/activitypub/trail/[id]/+server.ts b/web/src/routes/api/v1/activitypub/trail/[id]/+server.ts index 834c553a..2e97de7c 100644 --- a/web/src/routes/api/v1/activitypub/trail/[id]/+server.ts +++ b/web/src/routes/api/v1/activitypub/trail/[id]/+server.ts @@ -3,6 +3,32 @@ import { handleError } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/activitypub/trail/{id}: + * get: + * summary: Get ActivityPub trail + * description: Retrieves an ActivityPub Trail object by ID (proxied from backend) + * tags: + * - ActivityPub + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: ActivityPub Trail object + * content: + * application/json: + * schema: + * type: object + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { const id = event.params.id; diff --git a/web/src/routes/api/v1/activitypub/user/[handle]/+server.ts b/web/src/routes/api/v1/activitypub/user/[handle]/+server.ts index 0d77cbfa..9302757c 100644 --- a/web/src/routes/api/v1/activitypub/user/[handle]/+server.ts +++ b/web/src/routes/api/v1/activitypub/user/[handle]/+server.ts @@ -8,6 +8,32 @@ import { error, json, type RequestEvent } from '@sveltejs/kit'; import { type APActor, type APRoot } from 'activitypub-types'; +/** + * @swagger + * /api/v1/activitypub/user/{handle}: + * get: + * summary: Get ActivityPub actor profile + * description: Retrieves an ActivityPub Person object for a user with public key + * tags: + * - ActivityPub + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * responses: + * 200: + * description: ActivityPub Person object with publicKey + * content: + * application/json: + * schema: + * type: object + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { diff --git a/web/src/routes/api/v1/activitypub/user/[handle]/followers/+server.ts b/web/src/routes/api/v1/activitypub/user/[handle]/followers/+server.ts index 84f6eaec..6156681d 100644 --- a/web/src/routes/api/v1/activitypub/user/[handle]/followers/+server.ts +++ b/web/src/routes/api/v1/activitypub/user/[handle]/followers/+server.ts @@ -9,6 +9,37 @@ import type { APOrderedCollectionPage, APRoot } from 'activitypub-types'; import type { ListResult } from 'pocketbase'; +/** + * @swagger + * /api/v1/activitypub/user/{handle}/followers: + * get: + * summary: Get ActivityPub followers collection + * description: Retrieves an OrderedCollection paginated list of followers for a user + * tags: + * - ActivityPub + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * - in: query + * name: page + * schema: + * type: integer + * responses: + * 200: + * description: ActivityPub OrderedCollectionPage + * content: + * application/json: + * schema: + * type: object + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ + export async function GET(event: RequestEvent) { try { diff --git a/web/src/routes/api/v1/activitypub/user/[handle]/following/+server.ts b/web/src/routes/api/v1/activitypub/user/[handle]/following/+server.ts index e3aa11e7..dd5e8190 100644 --- a/web/src/routes/api/v1/activitypub/user/[handle]/following/+server.ts +++ b/web/src/routes/api/v1/activitypub/user/[handle]/following/+server.ts @@ -1,15 +1,45 @@ import { env } from '$env/dynamic/private'; -import { env as publicEnv } from '$env/dynamic/public'; import type { Actor } from '$lib/models/activitypub/actor'; import type { Follow } from '$lib/models/follow'; import { splitUsername } from '$lib/util/activitypub_util'; import { handleError } from '$lib/util/api_util'; -import { error, json, type RequestEvent } from '@sveltejs/kit'; +import { json, type RequestEvent } from '@sveltejs/kit'; import type { APOrderedCollectionPage, APRoot } from 'activitypub-types'; import type { ListResult } from 'pocketbase'; +/** + * @swagger + * /api/v1/activitypub/user/{handle}/following: + * get: + * summary: Get ActivityPub following collection + * description: Retrieves an OrderedCollection paginated list of accounts the user follows + * tags: + * - ActivityPub + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * - in: query + * name: page + * schema: + * type: integer + * responses: + * 200: + * description: ActivityPub OrderedCollectionPage + * content: + * application/json: + * schema: + * type: object + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ + export async function GET(event: RequestEvent) { try { diff --git a/web/src/routes/api/v1/activitypub/user/[handle]/inbox/+server.ts b/web/src/routes/api/v1/activitypub/user/[handle]/inbox/+server.ts index ab80f477..768f3fb9 100644 --- a/web/src/routes/api/v1/activitypub/user/[handle]/inbox/+server.ts +++ b/web/src/routes/api/v1/activitypub/user/[handle]/inbox/+server.ts @@ -4,6 +4,34 @@ import { handleError } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; import type { APActivity } from 'activitypub-types'; +/** + * @swagger + * /api/v1/activitypub/user/{handle}/inbox: + * post: + * summary: Receive ActivityPub activities + * description: Receives and processes incoming ActivityPub activities (Create, Update, Delete, Follow, etc.) + * tags: + * - ActivityPub + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * responses: + * 200: + * description: Activity processed + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { diff --git a/web/src/routes/api/v1/activitypub/user/[handle]/outbox/+server.ts b/web/src/routes/api/v1/activitypub/user/[handle]/outbox/+server.ts index 715f82c5..21dd2f23 100644 --- a/web/src/routes/api/v1/activitypub/user/[handle]/outbox/+server.ts +++ b/web/src/routes/api/v1/activitypub/user/[handle]/outbox/+server.ts @@ -11,6 +11,40 @@ import type { APActivity, APOrderedCollectionPage, APRoot } from 'activitypub-ty import type { ListResult } from 'pocketbase'; +/** + * @swagger + * /api/v1/activitypub/user/{handle}/outbox: + * get: + * summary: Get ActivityPub outbox collection + * description: Retrieves an OrderedCollection paginated list of activities published by this user + * tags: + * - ActivityPub + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * responses: + * 200: + * description: ActivityPub OrderedCollectionPage + * content: + * application/json: + * schema: + * type: object + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { diff --git a/web/src/routes/api/v1/api-token/+server.ts b/web/src/routes/api/v1/api-token/+server.ts index f037503b..e691120e 100644 --- a/web/src/routes/api/v1/api-token/+server.ts +++ b/web/src/routes/api/v1/api-token/+server.ts @@ -4,6 +4,62 @@ import { Collection, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; import { APITokenCreateSchema } from "$lib/models/api/api_token_schema"; +/** + * @swagger + * /api/v1/api-token: + * get: + * summary: List API tokens + * description: Retrieves a paginated list of API tokens with optional filtering and sorting + * tags: + * - API Tokens + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * default: 1 + * - in: query + * name: perPage + * schema: + * type: integer + * default: 30 + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: Success + * content: + * application/json: + * schema: + * type: object + * properties: + * page: + * type: integer + * perPage: + * type: integer + * totalItems: + * type: integer + * totalPages: + * type: integer + * items: + * type: array + * items: + * $ref: '#/components/schemas/APIToken' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.api_tokens); @@ -14,7 +70,37 @@ export async function GET(event: RequestEvent) { } } - +/** + * @swagger + * /api/v1/api-token: + * put: + * summary: Create API token + * description: Creates a new API token + * tags: + * - API Tokens + * parameters: + * - in: query + * name: expand + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/APITokenInput' + * responses: + * 201: + * description: Created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/APIToken' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await create(event, APITokenCreateSchema, Collection.api_tokens) @@ -22,4 +108,4 @@ export async function PUT(event: RequestEvent) { } catch (e) { return handleError(e) } -} +} \ No newline at end of file diff --git a/web/src/routes/api/v1/api-token/[id]/+server.ts b/web/src/routes/api/v1/api-token/[id]/+server.ts index a8ac5ad5..a305f8bb 100644 --- a/web/src/routes/api/v1/api-token/[id]/+server.ts +++ b/web/src/routes/api/v1/api-token/[id]/+server.ts @@ -1,6 +1,29 @@ import { Collection, handleError, remove } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/api-token/{id}: + * delete: + * summary: Delete API token + * description: Deletes an API token by ID + * tags: + * - API Tokens + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * description: API token ID (15 chars) + * responses: + * 200: + * description: Success + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.api_tokens) diff --git a/web/src/routes/api/v1/auth/confirm-reset/+server.ts b/web/src/routes/api/v1/auth/confirm-reset/+server.ts index f30441e9..ef1f1e4f 100644 --- a/web/src/routes/api/v1/auth/confirm-reset/+server.ts +++ b/web/src/routes/api/v1/auth/confirm-reset/+server.ts @@ -2,6 +2,28 @@ import { handleError } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; import { z } from "zod"; +/** + * @swagger + * /api/v1/auth/confirm-reset: + * post: + * summary: Confirm password reset + * description: Confirms and applies a password reset with a valid token + * tags: + * - Authentication + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * responses: + * 200: + * description: Password reset completed + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const data = await event.request.json() diff --git a/web/src/routes/api/v1/auth/login/+server.ts b/web/src/routes/api/v1/auth/login/+server.ts index fc1f245f..872c6edb 100644 --- a/web/src/routes/api/v1/auth/login/+server.ts +++ b/web/src/routes/api/v1/auth/login/+server.ts @@ -2,6 +2,42 @@ import { handleError } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; import { z } from "zod"; +/** + * @swagger + * /api/v1/auth/login: + * post: + * summary: Authenticate user + * description: Authenticates a user with email or username and password + * tags: + * - Authentication + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - password + * properties: + * email: + * type: string + * format: email + * username: + * type: string + * password: + * type: string + * responses: + * 200: + * description: User authenticated with auth token + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/User' + * 400: + * description: Bad Request - Invalid credentials + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const data = await event.request.json(); diff --git a/web/src/routes/api/v1/auth/oauth/+server.ts b/web/src/routes/api/v1/auth/oauth/+server.ts index 355c1cde..ea2587fe 100644 --- a/web/src/routes/api/v1/auth/oauth/+server.ts +++ b/web/src/routes/api/v1/auth/oauth/+server.ts @@ -7,6 +7,24 @@ import { handleError } from "$lib/util/api_util"; const redirectURL = private_env.ORIGIN + "/login/redirect" +/** + * @swagger + * /api/v1/auth/oauth: + * get: + * summary: List OAuth providers + * description: Lists available OAuth2 authentication methods with provider images + * tags: + * - Authentication + * responses: + * 200: + * description: OAuth2 providers and configuration + * content: + * application/json: + * schema: + * type: object + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await event.locals.pb.collection('users').listAuthMethods(); diff --git a/web/src/routes/api/v1/auth/reset/+server.ts b/web/src/routes/api/v1/auth/reset/+server.ts index 5605487e..4022cb05 100644 --- a/web/src/routes/api/v1/auth/reset/+server.ts +++ b/web/src/routes/api/v1/auth/reset/+server.ts @@ -2,6 +2,34 @@ import { handleError } from "$lib/util/api_util"; import { error, json, type RequestEvent } from "@sveltejs/kit"; import { z } from "zod"; +/** + * @swagger + * /api/v1/auth/reset: + * post: + * summary: Request password reset + * description: Sends a password reset email + * tags: + * - Authentication + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - email + * properties: + * email: + * type: string + * format: email + * responses: + * 200: + * description: Password reset email sent + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const data = await event.request.json() diff --git a/web/src/routes/api/v1/category/+server.ts b/web/src/routes/api/v1/category/+server.ts index 09fc86a7..7da67808 100644 --- a/web/src/routes/api/v1/category/+server.ts +++ b/web/src/routes/api/v1/category/+server.ts @@ -2,6 +2,44 @@ import type { Category } from "$lib/models/category"; import { Collection, handleError, list } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/category: + * get: + * summary: List categories + * description: Retrieves a paginated list of activity categories + * tags: + * - Categories + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * responses: + * 200: + * description: List of categories + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ + export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.categories); diff --git a/web/src/routes/api/v1/comment/+server.ts b/web/src/routes/api/v1/comment/+server.ts index a4cc1c3d..fbf86cc8 100644 --- a/web/src/routes/api/v1/comment/+server.ts +++ b/web/src/routes/api/v1/comment/+server.ts @@ -4,6 +4,51 @@ import { Collection, create, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; import { type ListResult } from "pocketbase"; +/** + * @swagger + * /api/v1/comment: + * get: + * summary: List comments + * tags: + * - Comments + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * - in: query + * name: handle + * schema: + * type: string + * description: Federated query parameter + * responses: + * 200: + * description: List of comments + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { if (!event.url.searchParams.has("handle")) { diff --git a/web/src/routes/api/v1/comment/[id]/+server.ts b/web/src/routes/api/v1/comment/[id]/+server.ts index 4520d084..4248a2e5 100644 --- a/web/src/routes/api/v1/comment/[id]/+server.ts +++ b/web/src/routes/api/v1/comment/[id]/+server.ts @@ -3,6 +3,35 @@ import type { Comment } from "$lib/models/comment"; import { Collection, handleError, remove, show, update } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/comment/{id}: + * get: + * summary: Get comment + * tags: + * - Comments + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: Comment details + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Comment' + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.comments) @@ -12,6 +41,39 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/comment/{id}: + * post: + * summary: Update comment + * tags: + * - Comments + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/CommentUpdateInput' + * responses: + * 200: + * description: Comment updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Comment' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await update(event, CommentUpdateSchema, Collection.comments) @@ -21,6 +83,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/comment/{id}: + * delete: + * summary: Delete comment + * tags: + * - Comments + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Comment deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.comments) diff --git a/web/src/routes/api/v1/feed/+server.ts b/web/src/routes/api/v1/feed/+server.ts index 7bf58376..947def4a 100644 --- a/web/src/routes/api/v1/feed/+server.ts +++ b/web/src/routes/api/v1/feed/+server.ts @@ -2,6 +2,47 @@ import type { FeedItem } from "$lib/models/feed"; import { Collection, handleError, list } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/feed: + * get: + * summary: Get activity feed + * description: Retrieves the user's activity feed + * tags: + * - Feed + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: Activity feed + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.feed); diff --git a/web/src/routes/api/v1/files/[collection]/[record]/[file]/+server.ts b/web/src/routes/api/v1/files/[collection]/[record]/[file]/+server.ts index aefa5853..60008e44 100644 --- a/web/src/routes/api/v1/files/[collection]/[record]/[file]/+server.ts +++ b/web/src/routes/api/v1/files/[collection]/[record]/[file]/+server.ts @@ -1,6 +1,49 @@ import { error, json, type RequestEvent } from "@sveltejs/kit"; import { z } from "zod"; +/** + * @swagger + * /api/v1/files/{collection}/{record}/{file}: + * get: + * summary: Download file + * description: Downloads a file from a record with optional thumbnail generation + * tags: + * - Files + * parameters: + * - in: path + * name: collection + * required: true + * schema: + * type: string + * - in: path + * name: record + * required: true + * schema: + * type: string + * - in: path + * name: file + * required: true + * schema: + * type: string + * - in: query + * name: thumb + * schema: + * type: string + * responses: + * 200: + * description: File download + * content: + * application/octet-stream: + * schema: + * type: string + * format: binary + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { const safeParams = z.object({ diff --git a/web/src/routes/api/v1/follow/+server.ts b/web/src/routes/api/v1/follow/+server.ts index bdd59e4c..081fbaeb 100644 --- a/web/src/routes/api/v1/follow/+server.ts +++ b/web/src/routes/api/v1/follow/+server.ts @@ -7,6 +7,56 @@ import { json, type RequestEvent } from '@sveltejs/kit'; import type { APOrderedCollectionPage } from 'activitypub-types'; import { ClientResponseError, type ListResult } from "pocketbase"; +/** + * @swagger + * /api/v1/follow: + * get: + * summary: List follows + * description: Retrieves follows or ActivityPub follower/following collections. Supports federated queries via handle parameter + * tags: + * - Follows + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * - in: query + * name: handle + * schema: + * type: string + * - in: query + * name: type + * schema: + * type: string + * enum: [followers, following] + * responses: + * 200: + * description: List of follows or ActivityPub collection + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { if (!event.url.searchParams.has("handle")) { diff --git a/web/src/routes/api/v1/follow/[id]/+server.ts b/web/src/routes/api/v1/follow/[id]/+server.ts index a7c49edd..0954e59a 100644 --- a/web/src/routes/api/v1/follow/[id]/+server.ts +++ b/web/src/routes/api/v1/follow/[id]/+server.ts @@ -2,6 +2,27 @@ import { Collection, handleError, remove } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/follow/{id}: + * delete: + * summary: Delete follow + * tags: + * - Follows + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Follow deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.follows) diff --git a/web/src/routes/api/v1/integration/+server.ts b/web/src/routes/api/v1/integration/+server.ts index 698dda8d..47d1180a 100644 --- a/web/src/routes/api/v1/integration/+server.ts +++ b/web/src/routes/api/v1/integration/+server.ts @@ -3,6 +3,46 @@ import type { Integration } from "$lib/models/integration"; import { Collection, create, handleError, list } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/integration: + * get: + * summary: List integrations + * tags: + * - Integrations + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: List of integrations + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.integrations); @@ -13,9 +53,34 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/integration: + * put: + * summary: Create integration + * tags: + * - Integrations + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/IntegrationInput' + * responses: + * 201: + * description: Integration created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Integration' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { - const r = await create(event, IntegrationCreateSchema, Collection.integrations) + const r = await create(event, IntegrationCreateSchema, Collection.integrations) return json(r); } catch (e) { return handleError(e) diff --git a/web/src/routes/api/v1/integration/[id]/+server.ts b/web/src/routes/api/v1/integration/[id]/+server.ts index 01c90c48..2c620b98 100644 --- a/web/src/routes/api/v1/integration/[id]/+server.ts +++ b/web/src/routes/api/v1/integration/[id]/+server.ts @@ -3,6 +3,35 @@ import type { Integration } from "$lib/models/integration"; import { Collection, handleError, remove, show, update } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/integration/{id}: + * get: + * summary: Get integration + * tags: + * - Integrations + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: Integration details + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Integration' + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.integrations) @@ -12,6 +41,39 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/integration/{id}: + * post: + * summary: Update integration + * tags: + * - Integrations + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/IntegrationUpdateInput' + * responses: + * 200: + * description: Integration updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Integration' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await update(event, IntegrationUpdateSchema, Collection.integrations) @@ -21,6 +83,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/integration/{id}: + * delete: + * summary: Delete integration + * tags: + * - Integrations + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Integration deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.integrations) diff --git a/web/src/routes/api/v1/integration/hammerhead/login/+server.ts b/web/src/routes/api/v1/integration/hammerhead/login/+server.ts index 2ba35501..fc74a531 100644 --- a/web/src/routes/api/v1/integration/hammerhead/login/+server.ts +++ b/web/src/routes/api/v1/integration/hammerhead/login/+server.ts @@ -1,6 +1,24 @@ import { handleError } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/integration/hammerhead/login: + * get: + * summary: Get Hammerhead login endpoint + * description: Proxies to backend to get Hammerhead login configuration + * tags: + * - Integrations + * responses: + * 200: + * description: Hammerhead login endpoint + * content: + * application/json: + * schema: + * type: object + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await event.locals.pb.send("/integration/hammerhead/login", { diff --git a/web/src/routes/api/v1/integration/hammerhead/upload/+server.ts b/web/src/routes/api/v1/integration/hammerhead/upload/+server.ts index e7fa819e..c558d2cc 100644 --- a/web/src/routes/api/v1/integration/hammerhead/upload/+server.ts +++ b/web/src/routes/api/v1/integration/hammerhead/upload/+server.ts @@ -1,6 +1,38 @@ import { handleError } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/integration/hammerhead/upload: + * post: + * summary: Upload via Hammerhead integration + * description: Proxies file upload to backend Hammerhead integration + * tags: + * - Integrations + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * required: + * - file + * properties: + * file: + * type: string + * format: binary + * responses: + * 200: + * description: Upload result + * content: + * application/json: + * schema: + * type: object + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const formData = await event.request.formData(); diff --git a/web/src/routes/api/v1/integration/komoot/login/+server.ts b/web/src/routes/api/v1/integration/komoot/login/+server.ts index 2a18d1b1..000e0975 100644 --- a/web/src/routes/api/v1/integration/komoot/login/+server.ts +++ b/web/src/routes/api/v1/integration/komoot/login/+server.ts @@ -1,6 +1,24 @@ import { handleError } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/integration/komoot/login: + * get: + * summary: Get Komoot login endpoint + * description: Proxies to backend to get Komoot login configuration + * tags: + * - Integrations + * responses: + * 200: + * description: Komoot login endpoint + * content: + * application/json: + * schema: + * type: object + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await event.locals.pb.send("/integration/komoot/login", { diff --git a/web/src/routes/api/v1/list-share/+server.ts b/web/src/routes/api/v1/list-share/+server.ts index e039d7f9..1382c9eb 100644 --- a/web/src/routes/api/v1/list-share/+server.ts +++ b/web/src/routes/api/v1/list-share/+server.ts @@ -4,6 +4,43 @@ import type { ListShare } from '$lib/models/list_share'; import { Collection, create, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/list-share: + * get: + * summary: List list shares + * description: Retrieves a paginated list of list shares with optional ActivityPub actor resolution + * tags: + * - List Shares + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: ListResult + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.list_share); @@ -13,6 +50,32 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/list-share: + * put: + * summary: Create list share + * description: Creates a new list share. Converts ActivityPub actor IRI to ID + * tags: + * - List Shares + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListShareInput' + * responses: + * 201: + * description: List share created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListShare' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const data = await event.request.json(); diff --git a/web/src/routes/api/v1/list-share/[id]/+server.ts b/web/src/routes/api/v1/list-share/[id]/+server.ts index 7325a1d9..75696ff2 100644 --- a/web/src/routes/api/v1/list-share/[id]/+server.ts +++ b/web/src/routes/api/v1/list-share/[id]/+server.ts @@ -3,6 +3,32 @@ import type { ListShare } from "$lib/models/list_share"; import { Collection, handleError, remove, show, update } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/list-share/{id}: + * get: + * summary: Get list share + * description: Retrieves a list share by ID + * tags: + * - List Shares + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: ListShare + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.list_share) @@ -12,6 +38,39 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/list-share/{id}: + * post: + * summary: Update list share + * tags: + * - List Shares + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListShareUpdateInput' + * responses: + * 200: + * description: List share updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListShare' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await update(event, ListShareUpdateSchema, Collection.list_share) @@ -21,6 +80,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/list-share/{id}: + * delete: + * summary: Delete list share + * tags: + * - List Shares + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: List share deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.list_share) diff --git a/web/src/routes/api/v1/list/+server.ts b/web/src/routes/api/v1/list/+server.ts index 9ec6f37d..cffca999 100644 --- a/web/src/routes/api/v1/list/+server.ts +++ b/web/src/routes/api/v1/list/+server.ts @@ -3,6 +3,46 @@ import type { List } from '$lib/models/list'; import { Collection, create, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/list: + * get: + * summary: List all lists + * tags: + * - Lists + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: List of lists + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.lists); @@ -18,6 +58,31 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/list: + * put: + * summary: Create list + * tags: + * - Lists + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListInput' + * responses: + * 201: + * description: List created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/List' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await create(event, ListCreateSchema, Collection.lists) diff --git a/web/src/routes/api/v1/list/[id]/+server.ts b/web/src/routes/api/v1/list/[id]/+server.ts index f4d5cc71..6482c64a 100644 --- a/web/src/routes/api/v1/list/[id]/+server.ts +++ b/web/src/routes/api/v1/list/[id]/+server.ts @@ -5,6 +5,80 @@ import { objectToFormData } from "$lib/util/file_util"; import { json, type RequestEvent } from "@sveltejs/kit"; import { ClientResponseError } from "pocketbase"; +/** + * @swagger + * /api/v1/list/{id}: + * get: + * summary: Get list + * description: Retrieves a list by ID. Supports federated queries via handle parameter, fetching from remote instances and remapping file URLs + * tags: + * - Lists + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * - in: query + * name: handle + * schema: + * type: string + * responses: + * 200: + * description: List with optional federated data + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + * post: + * summary: Update list + * description: Updates a list by ID + * tags: + * - Lists + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * responses: + * 200: + * description: List + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + * delete: + * summary: Delete list + * description: Deletes a list by ID + * tags: + * - Lists + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Success + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { if (!event.url.searchParams.has("handle")) { diff --git a/web/src/routes/api/v1/list/[id]/file/+server.ts b/web/src/routes/api/v1/list/[id]/file/+server.ts index 22fc6ada..2d707ebb 100644 --- a/web/src/routes/api/v1/list/[id]/file/+server.ts +++ b/web/src/routes/api/v1/list/[id]/file/+server.ts @@ -1,7 +1,45 @@ import { Collection, handleError, upload } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; -import type { List } from "postcss/lib/list"; +import type { List } from "$lib/models/list"; +/** + * @swagger + * /api/v1/list/{id}/file: + * post: + * summary: Upload list file + * description: Uploads a file (cover image) for a list + * tags: + * - Lists + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * properties: + * file: + * type: string + * format: binary + * responses: + * 200: + * description: File uploaded, list updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/List' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await upload(event, Collection.lists); diff --git a/web/src/routes/api/v1/list/form/+server.ts b/web/src/routes/api/v1/list/form/+server.ts index bfbd8dc2..de35f865 100644 --- a/web/src/routes/api/v1/list/form/+server.ts +++ b/web/src/routes/api/v1/list/form/+server.ts @@ -2,6 +2,28 @@ import type { List } from '$lib/models/list'; import { Collection, handleError, uploadCreate } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/list/form: + * put: + * summary: Create list with file upload + * description: Creates a new list with file upload (avatar) + * tags: + * - Lists + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * responses: + * 201: + * description: List + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await uploadCreate(event, Collection.lists) diff --git a/web/src/routes/api/v1/list/form/[id]/+server.ts b/web/src/routes/api/v1/list/form/[id]/+server.ts index 8bbc8a22..81b7fea5 100644 --- a/web/src/routes/api/v1/list/form/[id]/+server.ts +++ b/web/src/routes/api/v1/list/form/[id]/+server.ts @@ -2,6 +2,36 @@ import type { List } from "$lib/models/list"; import { Collection, handleError, uploadUpdate } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/list/form/{id}: + * post: + * summary: Update list with file upload + * description: Updates a list with file upload (avatar) + * tags: + * - Lists + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * responses: + * 200: + * description: List + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await uploadUpdate(event, Collection.lists) diff --git a/web/src/routes/api/v1/notification/+server.ts b/web/src/routes/api/v1/notification/+server.ts index e0f92338..2532827f 100644 --- a/web/src/routes/api/v1/notification/+server.ts +++ b/web/src/routes/api/v1/notification/+server.ts @@ -2,6 +2,46 @@ import type { Notification } from '$lib/models/notification'; import { Collection, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/notification: + * get: + * summary: List notifications + * tags: + * - Notifications + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: List of notifications + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.notifications); diff --git a/web/src/routes/api/v1/notification/[id]/+server.ts b/web/src/routes/api/v1/notification/[id]/+server.ts index 9c69100c..bfc8db8b 100644 --- a/web/src/routes/api/v1/notification/[id]/+server.ts +++ b/web/src/routes/api/v1/notification/[id]/+server.ts @@ -1,11 +1,42 @@ import { NotificationUpdateSchema } from "$lib/models/api/notification_schema"; +import type { Notification } from "$lib/models/notification"; import { Collection, handleError, update } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/notification/{id}: + * post: + * summary: Update notification + * description: Updates a notification by ID (typically to mark as read) + * tags: + * - Notifications + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * responses: + * 200: + * description: Notification + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { - const r = await update(event, NotificationUpdateSchema, Collection.notifications) + const r = await update(event, NotificationUpdateSchema, Collection.notifications) return json(r); } catch (e: any) { return handleError(e) diff --git a/web/src/routes/api/v1/profile/[handle]/+server.ts b/web/src/routes/api/v1/profile/[handle]/+server.ts index 13be4ffd..7f5daea7 100644 --- a/web/src/routes/api/v1/profile/[handle]/+server.ts +++ b/web/src/routes/api/v1/profile/[handle]/+server.ts @@ -3,6 +3,32 @@ import { getActorResponseForHandle } from '$lib/util/activitypub_server_util'; import { handleError } from '$lib/util/api_util'; import { error, json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/profile/{handle}: + * get: + * summary: Get user profile + * description: Retrieves a user's profile by handle, with optional federation support + * tags: + * - Profiles + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Profile and actor data + * content: + * application/json: + * schema: + * type: object + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { const handle = event.params.handle; if (!handle) { diff --git a/web/src/routes/api/v1/profile/[handle]/feed/+server.ts b/web/src/routes/api/v1/profile/[handle]/feed/+server.ts index 093ff6d3..374b637c 100644 --- a/web/src/routes/api/v1/profile/[handle]/feed/+server.ts +++ b/web/src/routes/api/v1/profile/[handle]/feed/+server.ts @@ -6,6 +6,40 @@ import { Collection, handleError } from '$lib/util/api_util'; import { error, json, type RequestEvent } from '@sveltejs/kit'; import { ClientResponseError, type ListResult } from 'pocketbase'; +/** + * @swagger + * /api/v1/profile/{handle}/feed: + * get: + * summary: Get user activity feed + * description: Retrieves activity feed for a user, with federation support + * tags: + * - Profiles + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * responses: + * 200: + * description: FeedItem list + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { const handle = event.params.handle; if (!handle) { diff --git a/web/src/routes/api/v1/profile/[handle]/lists/+server.ts b/web/src/routes/api/v1/profile/[handle]/lists/+server.ts index a9d49f41..ccf23c44 100644 --- a/web/src/routes/api/v1/profile/[handle]/lists/+server.ts +++ b/web/src/routes/api/v1/profile/[handle]/lists/+server.ts @@ -6,6 +6,47 @@ import { error, json, type RequestEvent } from '@sveltejs/kit'; import type { SearchResponse } from 'meilisearch'; import { ClientResponseError } from 'pocketbase'; +/** + * @swagger + * /api/v1/profile/{handle}/lists: + * post: + * summary: Search user lists + * description: Searches a user's lists via Meilisearch, with federation support + * tags: + * - Profiles + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - q + * properties: + * q: + * type: string + * options: + * type: object + * responses: + * 200: + * description: Meilisearch response with list results + * content: + * application/json: + * schema: + * type: object + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { const handle = event.params.handle; if (!handle) { diff --git a/web/src/routes/api/v1/profile/[handle]/stats/+server.ts b/web/src/routes/api/v1/profile/[handle]/stats/+server.ts index 02d7f679..be14b440 100644 --- a/web/src/routes/api/v1/profile/[handle]/stats/+server.ts +++ b/web/src/routes/api/v1/profile/[handle]/stats/+server.ts @@ -5,6 +5,40 @@ import { Collection, handleError } from '$lib/util/api_util'; import { error, json, type RequestEvent } from '@sveltejs/kit'; import { ClientResponseError, type ListResult } from 'pocketbase'; +/** + * @swagger + * /api/v1/profile/{handle}/stats: + * get: + * summary: Get user summit statistics + * description: Retrieves summit log statistics for a user, with federation support + * tags: + * - Profiles + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * responses: + * 200: + * description: SummitLog statistics + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { const handle = event.params.handle; if (!handle) { diff --git a/web/src/routes/api/v1/profile/[handle]/trails/+server.ts b/web/src/routes/api/v1/profile/[handle]/trails/+server.ts index 2bd6a753..5a4a44b1 100644 --- a/web/src/routes/api/v1/profile/[handle]/trails/+server.ts +++ b/web/src/routes/api/v1/profile/[handle]/trails/+server.ts @@ -5,6 +5,47 @@ import { error, json, type RequestEvent } from '@sveltejs/kit'; import type { SearchResponse } from 'meilisearch'; import { ClientResponseError } from 'pocketbase'; +/** + * @swagger + * /api/v1/profile/{handle}/trails: + * post: + * summary: Search user trails + * description: Searches a user's trails via Meilisearch, with federation support + * tags: + * - Profiles + * parameters: + * - in: path + * name: handle + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - q + * properties: + * q: + * type: string + * options: + * type: object + * responses: + * 200: + * description: Meilisearch response with trail results + * content: + * application/json: + * schema: + * type: object + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { const handle = event.params.handle; if (!handle) { diff --git a/web/src/routes/api/v1/search/[index]/+server.ts b/web/src/routes/api/v1/search/[index]/+server.ts index 842c8316..fb5c4b02 100644 --- a/web/src/routes/api/v1/search/[index]/+server.ts +++ b/web/src/routes/api/v1/search/[index]/+server.ts @@ -1,5 +1,44 @@ import { error, json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/search/{index}: + * post: + * summary: Search Meilisearch index + * description: Performs a search on a specific Meilisearch index + * tags: + * - Search + * parameters: + * - in: path + * name: index + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - q + * properties: + * q: + * type: string + * options: + * type: object + * responses: + * 200: + * description: Meilisearch search results + * content: + * application/json: + * schema: + * type: object + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { const data = await event.request.json() diff --git a/web/src/routes/api/v1/search/actor/+server.ts b/web/src/routes/api/v1/search/actor/+server.ts index 51f8a530..3a91600c 100644 --- a/web/src/routes/api/v1/search/actor/+server.ts +++ b/web/src/routes/api/v1/search/actor/+server.ts @@ -4,6 +4,38 @@ import { handleError } from '$lib/util/api_util'; import { error, json, type RequestEvent } from '@sveltejs/kit'; import { ClientResponseError, type ListResult } from "pocketbase" +/** + * @swagger + * /api/v1/search/actor: + * get: + * summary: Search actors + * description: Searches for ActivityPub actors by username, combining local and federated results + * tags: + * - Search + * parameters: + * - in: query + * name: q + * required: true + * schema: + * type: string + * - in: query + * name: includeSelf + * schema: + * type: boolean + * responses: + * 200: + * description: Array of matching actors + * content: + * application/json: + * schema: + * type: array + * items: + * type: object + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { diff --git a/web/src/routes/api/v1/search/multi/+server.ts b/web/src/routes/api/v1/search/multi/+server.ts index 952fff24..a557c4ba 100644 --- a/web/src/routes/api/v1/search/multi/+server.ts +++ b/web/src/routes/api/v1/search/multi/+server.ts @@ -1,5 +1,38 @@ import { error, json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/search/multi: + * post: + * summary: Multi-index search + * description: Performs batch searches across multiple Meilisearch indices + * tags: + * - Search + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - queries + * properties: + * queries: + * type: array + * items: + * type: object + * responses: + * 200: + * description: Combined Meilisearch results + * content: + * application/json: + * schema: + * type: object + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { const data = await event.request.json() diff --git a/web/src/routes/api/v1/settings/+server.ts b/web/src/routes/api/v1/settings/+server.ts index 1e82bf9b..390e1771 100644 --- a/web/src/routes/api/v1/settings/+server.ts +++ b/web/src/routes/api/v1/settings/+server.ts @@ -1,10 +1,36 @@ import { SettingsCreateSchema } from '$lib/models/api/settings_schema'; +import type { Settings } from '$lib/models/settings'; import { Collection, create } from '$lib/util/api_util'; import { error, json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/settings: + * put: + * summary: Create settings + * tags: + * - Settings + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SettingsInput' + * responses: + * 201: + * description: Settings created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Settings' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { - const r = await create(event, SettingsCreateSchema, Collection.settings) + const r = await create(event, SettingsCreateSchema, Collection.settings) return json(r); } catch (e: any) { diff --git a/web/src/routes/api/v1/settings/[id]/+server.ts b/web/src/routes/api/v1/settings/[id]/+server.ts index ae687f36..1978f661 100644 --- a/web/src/routes/api/v1/settings/[id]/+server.ts +++ b/web/src/routes/api/v1/settings/[id]/+server.ts @@ -4,6 +4,35 @@ import { Collection, handleError, remove, show, update } from "$lib/util/api_uti import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/settings/{id}: + * get: + * summary: Get settings + * tags: + * - Settings + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: Settings details + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Settings' + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.settings) @@ -13,6 +42,39 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/settings/{id}: + * post: + * summary: Update settings + * tags: + * - Settings + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SettingsInput' + * responses: + * 200: + * description: Settings updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Settings' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await update(event, SettingsCreateSchema, Collection.settings) @@ -22,6 +84,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/settings/{id}: + * delete: + * summary: Delete settings + * tags: + * - Settings + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Settings deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.settings) diff --git a/web/src/routes/api/v1/summit-log/+server.ts b/web/src/routes/api/v1/summit-log/+server.ts index 73e3e5d7..637d909f 100644 --- a/web/src/routes/api/v1/summit-log/+server.ts +++ b/web/src/routes/api/v1/summit-log/+server.ts @@ -4,6 +4,47 @@ import { Collection, create, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; import { type ListResult } from "pocketbase"; +/** + * @swagger + * /api/v1/summit-log: + * get: + * summary: List summit logs + * description: Retrieves a paginated list of summit logs with deduplication of federated data + * tags: + * - Summit Logs + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * - in: query + * name: handle + * schema: + * type: string + * responses: + * 200: + * description: ListResult with local/remote items deduplicated + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { if (!event.url.searchParams.has("handle")) { @@ -89,6 +130,31 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/summit-log: + * put: + * summary: Create summit log + * tags: + * - Summit Logs + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SummitLogInput' + * responses: + * 201: + * description: Summit log created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SummitLog' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await create(event, SummitLogCreateSchema, Collection.summit_logs) diff --git a/web/src/routes/api/v1/summit-log/[id]/+server.ts b/web/src/routes/api/v1/summit-log/[id]/+server.ts index fbf4e3f5..49cc9dfc 100644 --- a/web/src/routes/api/v1/summit-log/[id]/+server.ts +++ b/web/src/routes/api/v1/summit-log/[id]/+server.ts @@ -4,6 +4,35 @@ import { Collection, handleError, remove, show, update } from "$lib/util/api_uti import { error, json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/summit-log/{id}: + * get: + * summary: Get summit log + * tags: + * - Summit Logs + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: Summit log details + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SummitLog' + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.summit_logs) @@ -13,6 +42,39 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/summit-log/{id}: + * post: + * summary: Update summit log + * tags: + * - Summit Logs + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SummitLogUpdateInput' + * responses: + * 200: + * description: Summit log updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SummitLog' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await update(event, SummitLogUpdateSchema, Collection.summit_logs) @@ -22,6 +84,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/summit-log/{id}: + * delete: + * summary: Delete summit log + * tags: + * - Summit Logs + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Summit log deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.summit_logs) diff --git a/web/src/routes/api/v1/summit-log/[id]/file/+server.ts b/web/src/routes/api/v1/summit-log/[id]/file/+server.ts index 84e893b6..d7581e5a 100644 --- a/web/src/routes/api/v1/summit-log/[id]/file/+server.ts +++ b/web/src/routes/api/v1/summit-log/[id]/file/+server.ts @@ -2,6 +2,44 @@ import type { SummitLog } from "$lib/models/summit_log"; import { Collection, upload } from "$lib/util/api_util"; import { error, json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/summit-log/{id}/file: + * post: + * summary: Upload summit log file + * description: Uploads a file (photo or GPX) for a summit log + * tags: + * - Summit Logs + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * properties: + * file: + * type: string + * format: binary + * responses: + * 200: + * description: File uploaded, summit log updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SummitLog' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await upload(event, Collection.summit_logs); diff --git a/web/src/routes/api/v1/summit-log/form/+server.ts b/web/src/routes/api/v1/summit-log/form/+server.ts index c70a3b8d..1650db1d 100644 --- a/web/src/routes/api/v1/summit-log/form/+server.ts +++ b/web/src/routes/api/v1/summit-log/form/+server.ts @@ -2,6 +2,32 @@ import type { SummitLog } from '$lib/models/summit_log'; import { Collection, handleError, uploadCreate } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/summit-log/form: + * put: + * summary: Create summit log with file upload + * description: Creates a new summit log with file upload (photos/GPX) and date normalization + * tags: + * - Summit Logs + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * $ref: '#/components/schemas/SummitLogInput' + * responses: + * 201: + * description: Summit log created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SummitLog' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await uploadCreate(event, Collection.summit_logs) diff --git a/web/src/routes/api/v1/summit-log/form/[id]/+server.ts b/web/src/routes/api/v1/summit-log/form/[id]/+server.ts index a618538c..cc430c80 100644 --- a/web/src/routes/api/v1/summit-log/form/[id]/+server.ts +++ b/web/src/routes/api/v1/summit-log/form/[id]/+server.ts @@ -2,6 +2,40 @@ import type { SummitLog } from "$lib/models/summit_log"; import { Collection, handleError, uploadUpdate } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/summit-log/form/{id}: + * post: + * summary: Update summit log with file upload + * description: Updates a summit log with file upload (photos/GPX) and date normalization + * tags: + * - Summit Logs + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * $ref: '#/components/schemas/SummitLogUpdateInput' + * responses: + * 200: + * description: Summit log updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SummitLog' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await uploadUpdate(event, Collection.summit_logs) diff --git a/web/src/routes/api/v1/tag/+server.ts b/web/src/routes/api/v1/tag/+server.ts index a8a86789..2dbc39b7 100644 --- a/web/src/routes/api/v1/tag/+server.ts +++ b/web/src/routes/api/v1/tag/+server.ts @@ -3,6 +3,46 @@ import type { Tag } from '$lib/models/tag'; import { Collection, create, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/tag: + * get: + * summary: List tags + * tags: + * - Tags + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: List of tags + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.tags); @@ -13,6 +53,31 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/tag: + * put: + * summary: Create tag + * tags: + * - Tags + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TagInput' + * responses: + * 201: + * description: Tag created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Tag' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await create(event, TagCreateSchema, Collection.tags) diff --git a/web/src/routes/api/v1/tag/[id]/+server.ts b/web/src/routes/api/v1/tag/[id]/+server.ts index b115d538..3c992145 100644 --- a/web/src/routes/api/v1/tag/[id]/+server.ts +++ b/web/src/routes/api/v1/tag/[id]/+server.ts @@ -3,6 +3,35 @@ import type { Tag } from "$lib/models/tag"; import { Collection, handleError, remove, show, update } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/tag/{id}: + * get: + * summary: Get tag + * tags: + * - Tags + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: Tag details + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Tag' + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.tags) @@ -12,6 +41,39 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/tag/{id}: + * post: + * summary: Update tag + * tags: + * - Tags + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TagUpdateInput' + * responses: + * 200: + * description: Tag updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Tag' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await update(event, TagUpdateSchema, Collection.tags) @@ -21,6 +83,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/tag/{id}: + * delete: + * summary: Delete tag + * tags: + * - Tags + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Tag deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.tags) diff --git a/web/src/routes/api/v1/trail-like/+server.ts b/web/src/routes/api/v1/trail-like/+server.ts index 7e32e5b1..15a5c69f 100644 --- a/web/src/routes/api/v1/trail-like/+server.ts +++ b/web/src/routes/api/v1/trail-like/+server.ts @@ -3,6 +3,46 @@ import type { TrailLike } from '$lib/models/trail_like'; import { Collection, create, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/trail-like: + * get: + * summary: List trail likes + * tags: + * - Trail Likes + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: List of trail likes + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.trail_share); @@ -12,6 +52,31 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/trail-like: + * put: + * summary: Create trail like + * tags: + * - Trail Likes + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailLikeInput' + * responses: + * 201: + * description: Trail like created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailLike' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await create(event, TrailLikeCreateSchema, Collection.trail_like) diff --git a/web/src/routes/api/v1/trail-like/[id]/+server.ts b/web/src/routes/api/v1/trail-like/[id]/+server.ts index 66a172f7..f5edee2a 100644 --- a/web/src/routes/api/v1/trail-like/[id]/+server.ts +++ b/web/src/routes/api/v1/trail-like/[id]/+server.ts @@ -2,6 +2,32 @@ import type { TrailLike } from "$lib/models/trail_like"; import { Collection, handleError, remove, show } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/trail-like/{id}: + * get: + * summary: Get trail like + * description: Retrieves a trail like by ID + * tags: + * - Trail Likes + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: TrailLike + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.trail_like) @@ -11,6 +37,27 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/trail-like/{id}: + * delete: + * summary: Delete trail like + * tags: + * - Trail Likes + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Trail like deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.trail_like) diff --git a/web/src/routes/api/v1/trail-like/delete/+server.ts b/web/src/routes/api/v1/trail-like/delete/+server.ts index 82a3a0ab..5c26a649 100644 --- a/web/src/routes/api/v1/trail-like/delete/+server.ts +++ b/web/src/routes/api/v1/trail-like/delete/+server.ts @@ -3,7 +3,30 @@ import { Collection, handleError } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; -// this route exists so we can delete a like without knowing its ID +/** + * @swagger + * /api/v1/trail-like/delete: + * post: + * summary: Delete trail like by actor and trail + * description: Deletes a trail like without needing to know its ID. Uses actor and trail IDs to find and delete + * tags: + * - Trail Likes + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailLikeInput' + * responses: + * 200: + * description: Trail like deleted + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { diff --git a/web/src/routes/api/v1/trail-link-share/+server.ts b/web/src/routes/api/v1/trail-link-share/+server.ts index 8f93d53e..b2479156 100644 --- a/web/src/routes/api/v1/trail-link-share/+server.ts +++ b/web/src/routes/api/v1/trail-link-share/+server.ts @@ -3,6 +3,46 @@ import type { TrailLinkShare } from '$lib/models/trail_link_share'; import { Collection, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/trail-link-share: + * get: + * summary: List trail link shares + * tags: + * - Trail Link Shares + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: List of trail link shares + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.trail_link_share); @@ -12,6 +52,31 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/trail-link-share: + * put: + * summary: Create trail link share + * tags: + * - Trail Link Shares + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailLinkShareInput' + * responses: + * 201: + * description: Trail link share created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailLinkShare' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const data = await event.request.json(); diff --git a/web/src/routes/api/v1/trail-link-share/[id]/+server.ts b/web/src/routes/api/v1/trail-link-share/[id]/+server.ts index ab503f90..71d32507 100644 --- a/web/src/routes/api/v1/trail-link-share/[id]/+server.ts +++ b/web/src/routes/api/v1/trail-link-share/[id]/+server.ts @@ -3,6 +3,32 @@ import type { TrailLinkShare } from "$lib/models/trail_link_share"; import { Collection, handleError, remove, show, update } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/trail-link-share/{id}: + * get: + * summary: Get trail link share + * description: Retrieves a trail link share by ID + * tags: + * - Trail Link Shares + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: TrailLinkShare + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.trail_link_share) @@ -12,6 +38,39 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/trail-link-share/{id}: + * post: + * summary: Update trail link share + * tags: + * - Trail Link Shares + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailLinkShareUpdateInput' + * responses: + * 200: + * description: Trail link share updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailLinkShare' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await update(event, TrailLinkShareUpdateSchema, Collection.trail_link_share) @@ -21,6 +80,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/trail-link-share/{id}: + * delete: + * summary: Delete trail link share + * tags: + * - Trail Link Shares + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Trail link share deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.trail_link_share) diff --git a/web/src/routes/api/v1/trail-share/+server.ts b/web/src/routes/api/v1/trail-share/+server.ts index df60a7d2..9ab17e62 100644 --- a/web/src/routes/api/v1/trail-share/+server.ts +++ b/web/src/routes/api/v1/trail-share/+server.ts @@ -4,6 +4,43 @@ import type { TrailShare } from '$lib/models/trail_share'; import { Collection, create, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/trail-share: + * get: + * summary: List trail shares + * description: Retrieves a paginated list of trail shares with optional ActivityPub actor resolution + * tags: + * - Trail Shares + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: ListResult + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.trail_share); @@ -13,6 +50,32 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/trail-share: + * put: + * summary: Create trail share + * description: Creates a new trail share. Converts ActivityPub actor IRI to ID + * tags: + * - Trail Shares + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailShareInput' + * responses: + * 201: + * description: Trail share created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailShare' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const data = await event.request.json(); diff --git a/web/src/routes/api/v1/trail-share/[id]/+server.ts b/web/src/routes/api/v1/trail-share/[id]/+server.ts index 32497e40..e2c69213 100644 --- a/web/src/routes/api/v1/trail-share/[id]/+server.ts +++ b/web/src/routes/api/v1/trail-share/[id]/+server.ts @@ -3,6 +3,32 @@ import type { TrailShare } from "$lib/models/trail_share"; import { Collection, handleError, remove, show, update } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/trail-share/{id}: + * get: + * summary: Get trail share + * description: Retrieves a trail share by ID + * tags: + * - Trail Shares + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: TrailShare + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.trail_share) @@ -12,6 +38,39 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/trail-share/{id}: + * post: + * summary: Update trail share + * tags: + * - Trail Shares + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailShareUpdateInput' + * responses: + * 200: + * description: Trail share updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailShare' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await update(event, TrailShareUpdateSchema, Collection.trail_share) @@ -21,6 +80,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/trail-share/{id}: + * delete: + * summary: Delete trail share + * tags: + * - Trail Shares + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Trail share deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.trail_share) diff --git a/web/src/routes/api/v1/trail/+server.ts b/web/src/routes/api/v1/trail/+server.ts index 317c1021..ca4a1755 100644 --- a/web/src/routes/api/v1/trail/+server.ts +++ b/web/src/routes/api/v1/trail/+server.ts @@ -3,6 +3,43 @@ import type { Trail } from '$lib/models/trail'; import { Collection, create, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/trail: + * get: + * summary: List trails + * description: Retrieves a paginated list of trails with optional filtering and sorting + * tags: + * - Trails + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: ListResult + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.trails); @@ -23,6 +60,31 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/trail: + * put: + * summary: Create trail + * tags: + * - Trails + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/TrailCreateInput' + * responses: + * 201: + * description: Trail created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Trail' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await create(event, TrailCreateSchema, Collection.trails) diff --git a/web/src/routes/api/v1/trail/[id]/+server.ts b/web/src/routes/api/v1/trail/[id]/+server.ts index 8a6f357e..a11e8699 100644 --- a/web/src/routes/api/v1/trail/[id]/+server.ts +++ b/web/src/routes/api/v1/trail/[id]/+server.ts @@ -7,6 +7,40 @@ import { json, type RequestEvent } from "@sveltejs/kit"; import type PocketBase from "pocketbase"; import { ClientResponseError } from "pocketbase"; +/** + * @swagger + * /api/v1/trail/{id}: + * get: + * summary: Get trail + * description: Retrieves a trail by ID. Supports federated queries via handle parameter, fetching from remote instances and remapping file URLs + * tags: + * - Trails + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * - in: query + * name: handle + * schema: + * type: string + * - in: query + * name: share + * schema: + * type: string + * responses: + * 200: + * description: Trail with optional federated data + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { // try to get the trail simply via the diff --git a/web/src/routes/api/v1/trail/[id]/file/+server.ts b/web/src/routes/api/v1/trail/[id]/file/+server.ts index a8af4df1..5c35345d 100644 --- a/web/src/routes/api/v1/trail/[id]/file/+server.ts +++ b/web/src/routes/api/v1/trail/[id]/file/+server.ts @@ -2,6 +2,44 @@ import type { Trail } from "$lib/models/trail"; import { Collection, upload } from "$lib/util/api_util"; import { error, json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/trail/{id}/file: + * post: + * summary: Upload trail file + * description: Uploads a file for a trail + * tags: + * - Trails + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * properties: + * file: + * type: string + * format: binary + * responses: + * 200: + * description: File uploaded + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Trail' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await upload(event, Collection.trails); diff --git a/web/src/routes/api/v1/trail/bounding-box/+server.ts b/web/src/routes/api/v1/trail/bounding-box/+server.ts index e83406f2..10e91724 100644 --- a/web/src/routes/api/v1/trail/bounding-box/+server.ts +++ b/web/src/routes/api/v1/trail/bounding-box/+server.ts @@ -2,6 +2,35 @@ import { type TrailBoundingBox, type TrailFilterValues } from '$lib/models/trail import { handleError } from '$lib/util/api_util'; import { error, json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/trail/bounding-box: + * get: + * summary: Get trail bounding box + * description: Retrieves geographic bounding box (lat/lon bounds) for user's trails + * tags: + * - Trails + * responses: + * 200: + * description: Bounding box coordinates + * content: + * application/json: + * schema: + * type: object + * properties: + * max_lat: + * type: number + * min_lat: + * type: number + * max_lon: + * type: number + * min_lon: + * type: number + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { if (!event.locals.pb.authStore.record) { return json({ diff --git a/web/src/routes/api/v1/trail/download/+server.ts b/web/src/routes/api/v1/trail/download/+server.ts index 609655dd..6b0286c5 100644 --- a/web/src/routes/api/v1/trail/download/+server.ts +++ b/web/src/routes/api/v1/trail/download/+server.ts @@ -1,6 +1,39 @@ import { handleError } from "$lib/util/api_util"; import { type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/trail/download: + * post: + * summary: Download file from URL + * description: Downloads a file from a URL and returns it as a blob + * tags: + * - Trails + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - url + * properties: + * url: + * type: string + * format: uri + * responses: + * 200: + * description: File blob + * content: + * application/octet-stream: + * schema: + * type: string + * format: binary + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { const data = await event.request.json(); diff --git a/web/src/routes/api/v1/trail/filter/+server.ts b/web/src/routes/api/v1/trail/filter/+server.ts index 29f332dc..abbe73b1 100644 --- a/web/src/routes/api/v1/trail/filter/+server.ts +++ b/web/src/routes/api/v1/trail/filter/+server.ts @@ -2,6 +2,39 @@ import { type TrailFilterValues } from '$lib/models/trail'; import { handleError } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/trail/filter: + * get: + * summary: Get trail filter values + * description: Retrieves min/max values for trail filtering (distance, elevation gain/loss) + * tags: + * - Trails + * responses: + * 200: + * description: Trail filter values (min/max for distance, elevation) + * content: + * application/json: + * schema: + * type: object + * properties: + * min_distance: + * type: number + * max_distance: + * type: number + * min_elevation_gain: + * type: number + * max_elevation_gain: + * type: number + * min_elevation_loss: + * type: number + * max_elevation_loss: + * type: number + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { if (!event.locals.pb.authStore.record) { return json({ diff --git a/web/src/routes/api/v1/trail/form/+server.ts b/web/src/routes/api/v1/trail/form/+server.ts index 99078311..95665cc5 100644 --- a/web/src/routes/api/v1/trail/form/+server.ts +++ b/web/src/routes/api/v1/trail/form/+server.ts @@ -2,6 +2,32 @@ import type { Trail } from '$lib/models/trail'; import { Collection, handleError, uploadCreate } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/trail/form: + * put: + * summary: Create trail with file upload + * description: Creates a new trail with file upload (GPX/photos) and date normalization + * tags: + * - Trails + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * $ref: '#/components/schemas/TrailCreateInput' + * responses: + * 201: + * description: Trail created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Trail' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await uploadCreate(event, Collection.trails) diff --git a/web/src/routes/api/v1/trail/form/[id]/+server.ts b/web/src/routes/api/v1/trail/form/[id]/+server.ts index bf64148f..58520357 100644 --- a/web/src/routes/api/v1/trail/form/[id]/+server.ts +++ b/web/src/routes/api/v1/trail/form/[id]/+server.ts @@ -2,6 +2,40 @@ import type { Trail } from "$lib/models/trail"; import { Collection, handleError, uploadUpdate } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/trail/form/{id}: + * post: + * summary: Update trail with file upload + * description: Updates a trail with file upload (GPX/photos) and date normalization + * tags: + * - Trails + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * $ref: '#/components/schemas/TrailUpdateInput' + * responses: + * 200: + * description: Trail updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Trail' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await uploadUpdate(event, Collection.trails) diff --git a/web/src/routes/api/v1/trail/recommend/+server.ts b/web/src/routes/api/v1/trail/recommend/+server.ts index c4d45580..936a1289 100644 --- a/web/src/routes/api/v1/trail/recommend/+server.ts +++ b/web/src/routes/api/v1/trail/recommend/+server.ts @@ -2,6 +2,34 @@ import { TrailRecommendSchema } from '$lib/models/api/trail_schema'; import { handleError } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/trail/recommend: + * get: + * summary: Get trail recommendations + * description: Retrieves random trail recommendations from Meilisearch + * tags: + * - Trails + * parameters: + * - in: query + * name: size + * schema: + * type: integer + * default: 10 + * responses: + * 200: + * description: Array of recommended trails + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: '#/components/schemas/Trail' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const searchParams = Object.fromEntries(event.url.searchParams); diff --git a/web/src/routes/api/v1/trail/upload/+server.ts b/web/src/routes/api/v1/trail/upload/+server.ts index d0593b2d..16bdff88 100644 --- a/web/src/routes/api/v1/trail/upload/+server.ts +++ b/web/src/routes/api/v1/trail/upload/+server.ts @@ -9,6 +9,40 @@ import { json, type RequestEvent } from "@sveltejs/kit"; import type { Hits, MeiliSearch } from "meilisearch"; import { ClientResponseError } from "pocketbase"; +/** + * @swagger + * /api/v1/trail/upload: + * put: + * summary: Upload and parse GPX file as trail + * description: Uploads a GPX file, parses it to extract trail data, performs duplicate detection, and indexes in search + * tags: + * - Trails + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * properties: + * file: + * type: string + * format: binary + * name: + * type: string + * ignoreDuplicates: + * type: boolean + * responses: + * 201: + * description: Trail created from GPX + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Trail' + * 400: + * description: Bad Request - Invalid or empty GPX file + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const data = await event.request.formData(); diff --git a/web/src/routes/api/v1/user/+server.ts b/web/src/routes/api/v1/user/+server.ts index 97afb1aa..f9e5c0c3 100644 --- a/web/src/routes/api/v1/user/+server.ts +++ b/web/src/routes/api/v1/user/+server.ts @@ -5,6 +5,31 @@ import { Collection, handleError } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; import { ClientResponseError } from 'pocketbase'; +/** + * @swagger + * /api/v1/user: + * put: + * summary: Create user (sign up) + * tags: + * - Users + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/UserCreateInput' + * responses: + * 201: + * description: User created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/User' + * 400: + * description: Bad Request - Signup disabled or invalid data + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { if (env.PUBLIC_DISABLE_SIGNUP === "true") { throw new ClientResponseError({ status: 401, response: { messgage: "Forbidden" } }) diff --git a/web/src/routes/api/v1/user/[id]/+server.ts b/web/src/routes/api/v1/user/[id]/+server.ts index e3d73013..40bd7692 100644 --- a/web/src/routes/api/v1/user/[id]/+server.ts +++ b/web/src/routes/api/v1/user/[id]/+server.ts @@ -4,6 +4,35 @@ import type { User } from '$lib/models/user'; import { Collection, handleError, remove, show } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/user/{id}: + * get: + * summary: Get user by ID + * tags: + * - Users + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: User details + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/User' + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.users) @@ -14,6 +43,40 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/user/{id}: + * post: + * summary: Update user + * description: Updates a user. Handles password changes and email change requests + * tags: + * - Users + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/UserUpdateInput' + * responses: + * 200: + * description: User updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/User' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { const data = await event.request.json() try { @@ -38,6 +101,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/user/{id}: + * delete: + * summary: Delete user + * tags: + * - Users + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: User deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.users) diff --git a/web/src/routes/api/v1/user/[id]/file/+server.ts b/web/src/routes/api/v1/user/[id]/file/+server.ts index 56bda233..0cacf36c 100644 --- a/web/src/routes/api/v1/user/[id]/file/+server.ts +++ b/web/src/routes/api/v1/user/[id]/file/+server.ts @@ -2,6 +2,44 @@ import type { User } from "$lib/models/user"; import { Collection, upload } from "$lib/util/api_util"; import { error, json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/user/{id}/file: + * post: + * summary: Upload user file + * description: Uploads a file (avatar) for a user + * tags: + * - Users + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * properties: + * file: + * type: string + * format: binary + * responses: + * 200: + * description: File uploaded, user updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/User' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await upload(event, Collection.users); diff --git a/web/src/routes/api/v1/user/anonymous/+server.ts b/web/src/routes/api/v1/user/anonymous/+server.ts deleted file mode 100644 index e73025ae..00000000 --- a/web/src/routes/api/v1/user/anonymous/+server.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { UserAnonymous } from '$lib/models/user'; -import { Collection, handleError, list } from '$lib/util/api_util'; -import { json, type RequestEvent } from '@sveltejs/kit'; - -export async function GET(event: RequestEvent) { - let filter = event.url.searchParams.get("filter"); - - if (!filter) { - filter = "private=false" - } else { - filter += "&&private=false" - } - event.url.searchParams.set("filter", filter); - - try { - const r = await list(event, Collection.users_anonymous); - - return json(r) - } catch (e: any) { - return handleError(e); - } -} - diff --git a/web/src/routes/api/v1/user/anonymous/[id]/+server.ts b/web/src/routes/api/v1/user/anonymous/[id]/+server.ts deleted file mode 100644 index 260b5878..00000000 --- a/web/src/routes/api/v1/user/anonymous/[id]/+server.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { UserAnonymous } from "$lib/models/user"; -import { Collection, handleError, show } from '$lib/util/api_util'; -import { error, json, type RequestEvent } from '@sveltejs/kit'; - -export async function GET(event: RequestEvent) { - try { - const r = await show(event, Collection.users_anonymous) - - return json(r) - } catch (e: any) { - return handleError(e); - } -} \ No newline at end of file diff --git a/web/src/routes/api/v1/valhalla/height/+server.ts b/web/src/routes/api/v1/valhalla/height/+server.ts index 9dd10919..c17d5bee 100644 --- a/web/src/routes/api/v1/valhalla/height/+server.ts +++ b/web/src/routes/api/v1/valhalla/height/+server.ts @@ -2,6 +2,32 @@ import { env } from '$env/dynamic/public'; import { error, json, type NumericRange, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/valhalla/height: + * post: + * summary: Get elevation data + * description: Queries Valhalla service for elevation data at coordinates + * tags: + * - Valhalla + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * responses: + * 200: + * description: Elevation data from Valhalla + * content: + * application/json: + * schema: + * type: object + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { const data = await event.request.json() if (!env.PUBLIC_VALHALLA_URL) { diff --git a/web/src/routes/api/v1/valhalla/route/+server.ts b/web/src/routes/api/v1/valhalla/route/+server.ts index e27a4e48..543d7097 100644 --- a/web/src/routes/api/v1/valhalla/route/+server.ts +++ b/web/src/routes/api/v1/valhalla/route/+server.ts @@ -2,6 +2,32 @@ import { env } from '$env/dynamic/public'; import { error, json, type NumericRange, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/valhalla/route: + * post: + * summary: Get route data + * description: Queries Valhalla service for routing data + * tags: + * - Valhalla + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * responses: + * 200: + * description: Route data from Valhalla + * content: + * application/json: + * schema: + * type: object + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { const data = await event.request.json() if (!env.PUBLIC_VALHALLA_URL) { diff --git a/web/src/routes/api/v1/waypoint/+server.ts b/web/src/routes/api/v1/waypoint/+server.ts index 5e41b613..cb0fa9ec 100644 --- a/web/src/routes/api/v1/waypoint/+server.ts +++ b/web/src/routes/api/v1/waypoint/+server.ts @@ -3,6 +3,46 @@ import type { Waypoint } from '$lib/models/waypoint'; import { Collection, create, handleError, list } from '$lib/util/api_util'; import { json, type RequestEvent } from '@sveltejs/kit'; +/** + * @swagger + * /api/v1/waypoint: + * get: + * summary: List waypoints + * tags: + * - Waypoints + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: perPage + * schema: + * type: integer + * - in: query + * name: sort + * schema: + * type: string + * - in: query + * name: filter + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: List of waypoints + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ListResult' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.waypoints); @@ -12,6 +52,31 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/waypoint: + * put: + * summary: Create waypoint + * tags: + * - Waypoints + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/WaypointInput' + * responses: + * 201: + * description: Waypoint created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Waypoint' + * 400: + * description: Bad Request + * 500: + * description: Internal Server Error + */ export async function PUT(event: RequestEvent) { try { const r = await create(event, WaypointCreateSchema, Collection.waypoints) diff --git a/web/src/routes/api/v1/waypoint/[id]/+server.ts b/web/src/routes/api/v1/waypoint/[id]/+server.ts index cccf9280..ee62fdb2 100644 --- a/web/src/routes/api/v1/waypoint/[id]/+server.ts +++ b/web/src/routes/api/v1/waypoint/[id]/+server.ts @@ -3,6 +3,35 @@ import type { Waypoint } from "$lib/models/waypoint"; import { Collection, handleError, remove, show, update } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/waypoint/{id}: + * get: + * summary: Get waypoint + * tags: + * - Waypoints + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * - in: query + * name: expand + * schema: + * type: string + * responses: + * 200: + * description: Waypoint details + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Waypoint' + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.waypoints) @@ -12,6 +41,39 @@ export async function GET(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/waypoint/{id}: + * post: + * summary: Update waypoint + * tags: + * - Waypoints + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/WaypointUpdateInput' + * responses: + * 200: + * description: Waypoint updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Waypoint' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await update(event, WaypointUpdateSchema, Collection.waypoints) @@ -21,6 +83,27 @@ export async function POST(event: RequestEvent) { } } +/** + * @swagger + * /api/v1/waypoint/{id}: + * delete: + * summary: Delete waypoint + * tags: + * - Waypoints + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Waypoint deleted + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function DELETE(event: RequestEvent) { try { const r = await remove(event, Collection.waypoints) diff --git a/web/src/routes/api/v1/waypoint/[id]/file/+server.ts b/web/src/routes/api/v1/waypoint/[id]/file/+server.ts index ab92d020..95f6d3f4 100644 --- a/web/src/routes/api/v1/waypoint/[id]/file/+server.ts +++ b/web/src/routes/api/v1/waypoint/[id]/file/+server.ts @@ -2,6 +2,44 @@ import type { Waypoint } from "$lib/models/waypoint"; import { Collection, handleError, upload } from "$lib/util/api_util"; import { json, type RequestEvent } from "@sveltejs/kit"; +/** + * @swagger + * /api/v1/waypoint/{id}/file: + * post: + * summary: Upload waypoint file + * description: Uploads a file (photo) for a waypoint + * tags: + * - Waypoints + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * properties: + * file: + * type: string + * format: binary + * responses: + * 200: + * description: File uploaded, waypoint updated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Waypoint' + * 400: + * description: Bad Request + * 404: + * description: Not Found + * 500: + * description: Internal Server Error + */ export async function POST(event: RequestEvent) { try { const r = await upload(event, Collection.waypoints); diff --git a/web/static/docs/api/index.html b/web/static/docs/api/index.html deleted file mode 100644 index eea117d6..00000000 --- a/web/static/docs/api/index.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - API Documentation - Apidog - - - - - - -
- - - - - diff --git a/web/static/docs/api/wanderer.openapi.json b/web/static/docs/api/wanderer.openapi.json new file mode 100644 index 00000000..0641d55c --- /dev/null +++ b/web/static/docs/api/wanderer.openapi.json @@ -0,0 +1,6616 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Wanderer API", + "version": "v0.18.5", + "description": "API documentation for wanderer backend" + }, + "servers": [], + "paths": { + "/api/v1/waypoint": { + "get": { + "summary": "List waypoints", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of waypoints", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create waypoint", + "tags": [ + "Waypoints" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WaypointInput" + } + } + } + }, + "responses": { + "201": { + "description": "Waypoint created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Waypoint" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/waypoint/{id}": { + "get": { + "summary": "Get waypoint", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Waypoint details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Waypoint" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update waypoint", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WaypointUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Waypoint updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Waypoint" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete waypoint", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Waypoint deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/waypoint/{id}/file": { + "post": { + "summary": "Upload waypoint file", + "description": "Uploads a file (photo) for a waypoint", + "tags": [ + "Waypoints" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded, waypoint updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Waypoint" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/valhalla/route": { + "post": { + "summary": "Get route data", + "description": "Queries Valhalla service for routing data", + "tags": [ + "Valhalla" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Route data from Valhalla", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/valhalla/height": { + "post": { + "summary": "Get elevation data", + "description": "Queries Valhalla service for elevation data at coordinates", + "tags": [ + "Valhalla" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Elevation data from Valhalla", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/user": { + "put": { + "summary": "Create user (sign up)", + "tags": [ + "Users" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserCreateInput" + } + } + } + }, + "responses": { + "201": { + "description": "User created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Bad Request - Signup disabled or invalid data" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/user/{id}": { + "get": { + "summary": "Get user by ID", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "User details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update user", + "description": "Updates a user. Handles password changes and email change requests", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "User updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete user", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "User deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/user/{id}/file": { + "post": { + "summary": "Upload user file", + "description": "Uploads a file (avatar) for a user", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded, user updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-share": { + "get": { + "summary": "List trail shares", + "description": "Retrieves a paginated list of trail shares with optional ActivityPub actor resolution", + "tags": [ + "Trail Shares" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListResult" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create trail share", + "description": "Creates a new trail share. Converts ActivityPub actor IRI to ID", + "tags": [ + "Trail Shares" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailShareInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail share created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-share/{id}": { + "get": { + "summary": "Get trail share", + "description": "Retrieves a trail share by ID", + "tags": [ + "Trail Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "TrailShare" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update trail share", + "tags": [ + "Trail Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailShareUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Trail share updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete trail share", + "tags": [ + "Trail Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Trail share deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-link-share": { + "get": { + "summary": "List trail link shares", + "tags": [ + "Trail Link Shares" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of trail link shares", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create trail link share", + "tags": [ + "Trail Link Shares" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLinkShareInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail link share created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLinkShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-link-share/{id}": { + "get": { + "summary": "Get trail link share", + "description": "Retrieves a trail link share by ID", + "tags": [ + "Trail Link Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "TrailLinkShare" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update trail link share", + "tags": [ + "Trail Link Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLinkShareUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Trail link share updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLinkShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete trail link share", + "tags": [ + "Trail Link Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Trail link share deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-like": { + "get": { + "summary": "List trail likes", + "tags": [ + "Trail Likes" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of trail likes", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create trail like", + "tags": [ + "Trail Likes" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLikeInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail like created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLike" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-like/delete": { + "post": { + "summary": "Delete trail like by actor and trail", + "description": "Deletes a trail like without needing to know its ID. Uses actor and trail IDs to find and delete", + "tags": [ + "Trail Likes" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailLikeInput" + } + } + } + }, + "responses": { + "200": { + "description": "Trail like deleted" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail-like/{id}": { + "get": { + "summary": "Get trail like", + "description": "Retrieves a trail like by ID", + "tags": [ + "Trail Likes" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "TrailLike" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete trail like", + "tags": [ + "Trail Likes" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Trail like deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail": { + "get": { + "summary": "List trails", + "description": "Retrieves a paginated list of trails with optional filtering and sorting", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListResult" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create trail", + "tags": [ + "Trails" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrailCreateInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/upload": { + "put": { + "summary": "Upload and parse GPX file as trail", + "description": "Uploads a GPX file, parses it to extract trail data, performs duplicate detection, and indexes in search", + "tags": [ + "Trails" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + }, + "name": { + "type": "string" + }, + "ignoreDuplicates": { + "type": "boolean" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Trail created from GPX", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request - Invalid or empty GPX file" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/recommend": { + "get": { + "summary": "Get trail recommendations", + "description": "Retrieves random trail recommendations from Meilisearch", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "query", + "name": "size", + "schema": { + "type": "integer", + "default": 10 + } + } + ], + "responses": { + "200": { + "description": "Array of recommended trails", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Trail" + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/form": { + "put": { + "summary": "Create trail with file upload", + "description": "Creates a new trail with file upload (GPX/photos) and date normalization", + "tags": [ + "Trails" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/TrailCreateInput" + } + } + } + }, + "responses": { + "201": { + "description": "Trail created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/form/{id}": { + "post": { + "summary": "Update trail with file upload", + "description": "Updates a trail with file upload (GPX/photos) and date normalization", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/TrailUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Trail updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/filter": { + "get": { + "summary": "Get trail filter values", + "description": "Retrieves min/max values for trail filtering (distance, elevation gain/loss)", + "tags": [ + "Trails" + ], + "responses": { + "200": { + "description": "Trail filter values (min/max for distance, elevation)", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "min_distance": { + "type": "number" + }, + "max_distance": { + "type": "number" + }, + "min_elevation_gain": { + "type": "number" + }, + "max_elevation_gain": { + "type": "number" + }, + "min_elevation_loss": { + "type": "number" + }, + "max_elevation_loss": { + "type": "number" + } + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/download": { + "post": { + "summary": "Download file from URL", + "description": "Downloads a file from a URL and returns it as a blob", + "tags": [ + "Trails" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "url" + ], + "properties": { + "url": { + "type": "string", + "format": "uri" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File blob", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/bounding-box": { + "get": { + "summary": "Get trail bounding box", + "description": "Retrieves geographic bounding box (lat/lon bounds) for user's trails", + "tags": [ + "Trails" + ], + "responses": { + "200": { + "description": "Bounding box coordinates", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "max_lat": { + "type": "number" + }, + "min_lat": { + "type": "number" + }, + "max_lon": { + "type": "number" + }, + "min_lon": { + "type": "number" + } + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/{id}": { + "get": { + "summary": "Get trail", + "description": "Retrieves a trail by ID. Supports federated queries via handle parameter, fetching from remote instances and remapping file URLs", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "share", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Trail with optional federated data" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/trail/{id}/file": { + "post": { + "summary": "Upload trail file", + "description": "Uploads a file for a trail", + "tags": [ + "Trails" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Trail" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/tag": { + "get": { + "summary": "List tags", + "tags": [ + "Tags" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of tags", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create tag", + "tags": [ + "Tags" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TagInput" + } + } + } + }, + "responses": { + "201": { + "description": "Tag created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Tag" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/tag/{id}": { + "get": { + "summary": "Get tag", + "tags": [ + "Tags" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Tag details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Tag" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update tag", + "tags": [ + "Tags" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TagUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Tag updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Tag" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete tag", + "tags": [ + "Tags" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Tag deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log": { + "get": { + "summary": "List summit logs", + "description": "Retrieves a paginated list of summit logs with deduplication of federated data", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListResult with local/remote items deduplicated" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create summit log", + "tags": [ + "Summit Logs" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLogInput" + } + } + } + }, + "responses": { + "201": { + "description": "Summit log created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log/form": { + "put": { + "summary": "Create summit log with file upload", + "description": "Creates a new summit log with file upload (photos/GPX) and date normalization", + "tags": [ + "Summit Logs" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/SummitLogInput" + } + } + } + }, + "responses": { + "201": { + "description": "Summit log created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log/form/{id}": { + "post": { + "summary": "Update summit log with file upload", + "description": "Updates a summit log with file upload (photos/GPX) and date normalization", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/SummitLogUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Summit log updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log/{id}": { + "get": { + "summary": "Get summit log", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Summit log details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update summit log", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLogUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Summit log updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete summit log", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Summit log deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/summit-log/{id}/file": { + "post": { + "summary": "Upload summit log file", + "description": "Uploads a file (photo or GPX) for a summit log", + "tags": [ + "Summit Logs" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded, summit log updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummitLog" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/settings": { + "put": { + "summary": "Create settings", + "tags": [ + "Settings" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingsInput" + } + } + } + }, + "responses": { + "201": { + "description": "Settings created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Settings" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/settings/{id}": { + "get": { + "summary": "Get settings", + "tags": [ + "Settings" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Settings details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Settings" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update settings", + "tags": [ + "Settings" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingsInput" + } + } + } + }, + "responses": { + "200": { + "description": "Settings updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Settings" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete settings", + "tags": [ + "Settings" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Settings deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/search/multi": { + "post": { + "summary": "Multi-index search", + "description": "Performs batch searches across multiple Meilisearch indices", + "tags": [ + "Search" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "queries" + ], + "properties": { + "queries": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Combined Meilisearch results", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/search/actor": { + "get": { + "summary": "Search actors", + "description": "Searches for ActivityPub actors by username, combining local and federated results", + "tags": [ + "Search" + ], + "parameters": [ + { + "in": "query", + "name": "q", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "includeSelf", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Array of matching actors", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/search/{index}": { + "post": { + "summary": "Search Meilisearch index", + "description": "Performs a search on a specific Meilisearch index", + "tags": [ + "Search" + ], + "parameters": [ + { + "in": "path", + "name": "index", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "q" + ], + "properties": { + "q": { + "type": "string" + }, + "options": { + "type": "object" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Meilisearch search results", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}": { + "get": { + "summary": "Get user profile", + "description": "Retrieves a user's profile by handle, with optional federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Profile and actor data", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}/trails": { + "post": { + "summary": "Search user trails", + "description": "Searches a user's trails via Meilisearch, with federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "q" + ], + "properties": { + "q": { + "type": "string" + }, + "options": { + "type": "object" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Meilisearch response with trail results", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}/stats": { + "get": { + "summary": "Get user summit statistics", + "description": "Retrieves summit log statistics for a user, with federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "SummitLog statistics", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}/lists": { + "post": { + "summary": "Search user lists", + "description": "Searches a user's lists via Meilisearch, with federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "q" + ], + "properties": { + "q": { + "type": "string" + }, + "options": { + "type": "object" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Meilisearch response with list results", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/profile/{handle}/feed": { + "get": { + "summary": "Get user activity feed", + "description": "Retrieves activity feed for a user, with federation support", + "tags": [ + "Profiles" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "FeedItem list", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/notification": { + "get": { + "summary": "List notifications", + "tags": [ + "Notifications" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of notifications", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/notification/{id}": { + "post": { + "summary": "Update notification", + "description": "Updates a notification by ID (typically to mark as read)", + "tags": [ + "Notifications" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Notification" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list-share": { + "get": { + "summary": "List list shares", + "description": "Retrieves a paginated list of list shares with optional ActivityPub actor resolution", + "tags": [ + "List Shares" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListResult" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create list share", + "description": "Creates a new list share. Converts ActivityPub actor IRI to ID", + "tags": [ + "List Shares" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListShareInput" + } + } + } + }, + "responses": { + "201": { + "description": "List share created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list-share/{id}": { + "get": { + "summary": "Get list share", + "description": "Retrieves a list share by ID", + "tags": [ + "List Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ListShare" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update list share", + "tags": [ + "List Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListShareUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "List share updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListShare" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete list share", + "tags": [ + "List Shares" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List share deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list": { + "get": { + "summary": "List all lists", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of lists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create list", + "tags": [ + "Lists" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInput" + } + } + } + }, + "responses": { + "201": { + "description": "List created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/List" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list/form": { + "put": { + "summary": "Create list with file upload", + "description": "Creates a new list with file upload (avatar)", + "tags": [ + "Lists" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "201": { + "description": "List" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list/form/{id}": { + "post": { + "summary": "Update list with file upload", + "description": "Updates a list with file upload (avatar)", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "List" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list/{id}": { + "get": { + "summary": "Get list", + "description": "Retrieves a list by ID. Supports federated queries via handle parameter, fetching from remote instances and remapping file URLs", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List with optional federated data" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update list", + "description": "Updates a list by ID", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "List" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete list", + "description": "Deletes a list by ID", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/list/{id}/file": { + "post": { + "summary": "Upload list file", + "description": "Uploads a file (cover image) for a list", + "tags": [ + "Lists" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "File uploaded, list updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/List" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration": { + "get": { + "summary": "List integrations", + "tags": [ + "Integrations" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of integrations", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create integration", + "tags": [ + "Integrations" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationInput" + } + } + } + }, + "responses": { + "201": { + "description": "Integration created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration/komoot/login": { + "get": { + "summary": "Get Komoot login endpoint", + "description": "Proxies to backend to get Komoot login configuration", + "tags": [ + "Integrations" + ], + "responses": { + "200": { + "description": "Komoot login endpoint", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration/hammerhead/upload": { + "post": { + "summary": "Upload via Hammerhead integration", + "description": "Proxies file upload to backend Hammerhead integration", + "tags": [ + "Integrations" + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "required": [ + "file" + ], + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Upload result", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration/hammerhead/login": { + "get": { + "summary": "Get Hammerhead login endpoint", + "description": "Proxies to backend to get Hammerhead login configuration", + "tags": [ + "Integrations" + ], + "responses": { + "200": { + "description": "Hammerhead login endpoint", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/integration/{id}": { + "get": { + "summary": "Get integration", + "tags": [ + "Integrations" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Integration details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update integration", + "tags": [ + "Integrations" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Integration updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete integration", + "tags": [ + "Integrations" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Integration deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/follow": { + "get": { + "summary": "List follows", + "description": "Retrieves follows or ActivityPub follower/following collections. Supports federated queries via handle parameter", + "tags": [ + "Follows" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "type", + "schema": { + "type": "string", + "enum": [ + "followers", + "following" + ] + } + } + ], + "responses": { + "200": { + "description": "List of follows or ActivityPub collection", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/follow/{id}": { + "delete": { + "summary": "Delete follow", + "tags": [ + "Follows" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Follow deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/files/{collection}/{record}/{file}": { + "get": { + "summary": "Download file", + "description": "Downloads a file from a record with optional thumbnail generation", + "tags": [ + "Files" + ], + "parameters": [ + { + "in": "path", + "name": "collection", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "record", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "file", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "thumb", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "File download", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/feed": { + "get": { + "summary": "Get activity feed", + "description": "Retrieves the user's activity feed", + "tags": [ + "Feed" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Activity feed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/comment": { + "get": { + "summary": "List comments", + "tags": [ + "Comments" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "handle", + "schema": { + "type": "string", + "description": "Federated query parameter" + } + } + ], + "responses": { + "200": { + "description": "List of comments", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/comment/{id}": { + "get": { + "summary": "Get comment", + "tags": [ + "Comments" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Comment details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Comment" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "summary": "Update comment", + "tags": [ + "Comments" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommentUpdateInput" + } + } + } + }, + "responses": { + "200": { + "description": "Comment updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Comment" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "summary": "Delete comment", + "tags": [ + "Comments" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Comment deleted" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/category": { + "get": { + "summary": "List categories", + "description": "Retrieves a paginated list of activity categories", + "tags": [ + "Categories" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of categories", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListResult" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/auth/reset": { + "post": { + "summary": "Request password reset", + "description": "Sends a password reset email", + "tags": [ + "Authentication" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "email" + ], + "properties": { + "email": { + "type": "string", + "format": "email" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Password reset email sent" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/auth/oauth": { + "get": { + "summary": "List OAuth providers", + "description": "Lists available OAuth2 authentication methods with provider images", + "tags": [ + "Authentication" + ], + "responses": { + "200": { + "description": "OAuth2 providers and configuration", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/auth/login": { + "post": { + "summary": "Authenticate user", + "description": "Authenticates a user with email or username and password", + "tags": [ + "Authentication" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "password" + ], + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "User authenticated with auth token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Bad Request - Invalid credentials" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/auth/confirm-reset": { + "post": { + "summary": "Confirm password reset", + "description": "Confirms and applies a password reset with a valid token", + "tags": [ + "Authentication" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Password reset completed" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/api-token": { + "get": { + "summary": "List API tokens", + "description": "Retrieves a paginated list of API tokens with optional filtering and sorting", + "tags": [ + "API Tokens" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer", + "default": 1 + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer", + "default": 30 + } + }, + { + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "page": { + "type": "integer" + }, + "perPage": { + "type": "integer" + }, + "totalItems": { + "type": "integer" + }, + "totalPages": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIToken" + } + } + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "summary": "Create API token", + "description": "Creates a new API token", + "tags": [ + "API Tokens" + ], + "parameters": [ + { + "in": "query", + "name": "expand", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APITokenInput" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIToken" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/api-token/{id}": { + "delete": { + "summary": "Delete API token", + "description": "Deletes an API token by ID", + "tags": [ + "API Tokens" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "description": "API token ID (15 chars)" + } + } + ], + "responses": { + "200": { + "description": "Success" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}": { + "get": { + "summary": "Get ActivityPub actor profile", + "description": "Retrieves an ActivityPub Person object for a user with public key", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub Person object with publicKey", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}/outbox": { + "get": { + "summary": "Get ActivityPub outbox collection", + "description": "Retrieves an OrderedCollection paginated list of activities published by this user", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "perPage", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub OrderedCollectionPage", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}/inbox": { + "post": { + "summary": "Receive ActivityPub activities", + "description": "Receives and processes incoming ActivityPub activities (Create, Update, Delete, Follow, etc.)", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Activity processed" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}/following": { + "get": { + "summary": "Get ActivityPub following collection", + "description": "Retrieves an OrderedCollection paginated list of accounts the user follows", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub OrderedCollectionPage", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/user/{handle}/followers": { + "get": { + "summary": "Get ActivityPub followers collection", + "description": "Retrieves an OrderedCollection paginated list of followers for a user", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub OrderedCollectionPage", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/trail/{id}": { + "get": { + "summary": "Get ActivityPub trail", + "description": "Retrieves an ActivityPub Trail object by ID (proxied from backend)", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub Trail object", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/comment/{id}": { + "get": { + "summary": "Get ActivityPub comment", + "description": "Retrieves an ActivityPub Comment object by ID (proxied from backend)", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub Comment object", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/v1/activitypub/activity/{id}": { + "get": { + "summary": "Get ActivityPub activity", + "description": "Retrieves an ActivityPub Activity object by ID", + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ActivityPub Activity object", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + } + }, + "components": { + "schemas": { + "APIToken": { + "type": "object", + "required": [ + "id", + "name", + "user" + ], + "properties": { + "id": { + "type": "string", + "description": "Token ID (15 chars)" + }, + "name": { + "type": "string", + "description": "Token name" + }, + "user": { + "type": "string", + "description": "User ID that owns this token" + }, + "expiration": { + "type": "string", + "format": "date-time", + "description": "Optional expiration date" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "APITokenInput": { + "type": "object", + "required": [ + "name", + "user" + ], + "properties": { + "name": { + "type": "string", + "minLength": 1, + "description": "Token name" + }, + "expiration": { + "type": "string", + "format": "date-time", + "description": "Optional expiration date (must be in future)" + }, + "user": { + "type": "string", + "description": "User ID (15 chars)" + } + } + }, + "User": { + "type": "object", + "required": [ + "id", + "username", + "email" + ], + "properties": { + "id": { + "type": "string", + "description": "User ID (15 chars)" + }, + "username": { + "type": "string", + "description": "Username (3+ chars, alphanumeric with dots)" + }, + "email": { + "type": "string", + "format": "email", + "description": "User email address" + }, + "avatar": { + "type": "string", + "description": "Avatar file path" + }, + "verified": { + "type": "boolean", + "description": "Email verification status" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "UserCreateInput": { + "type": "object", + "required": [ + "username", + "email", + "password" + ], + "properties": { + "username": { + "type": "string", + "minLength": 3, + "pattern": "^\\w[\\w\\.]*$", + "description": "Username (3+ chars, starts with word char)" + }, + "email": { + "type": "string", + "format": "email", + "description": "User email address" + }, + "password": { + "type": "string", + "minLength": 8, + "maxLength": 72, + "description": "Password (8-72 chars)" + }, + "passwordConfirm": { + "type": "string", + "description": "Password confirmation (must match password)" + } + } + }, + "UserUpdateInput": { + "type": "object", + "properties": { + "username": { + "type": "string", + "minLength": 3, + "pattern": "^\\w[\\w\\.]*$" + }, + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string", + "minLength": 8, + "maxLength": 72 + }, + "oldPassword": { + "type": "string", + "description": "Required when changing password" + }, + "passwordConfirm": { + "type": "string", + "description": "Must match password" + } + } + }, + "Tag": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "string", + "description": "Tag ID (15 chars)" + }, + "name": { + "type": "string", + "description": "Tag name" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "TagInput": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Tag name" + } + } + }, + "TagUpdateInput": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tag name" + } + } + }, + "Trail": { + "type": "object", + "required": [ + "id", + "name", + "author", + "public" + ], + "properties": { + "id": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "name": { + "type": "string", + "description": "Trail name" + }, + "description": { + "type": "string" + }, + "location": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID" + }, + "date": { + "type": "string", + "format": "date" + }, + "public": { + "type": "boolean" + }, + "difficulty": { + "type": "string", + "enum": [ + "easy", + "moderate", + "difficult" + ] + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance": { + "type": "number", + "description": "Distance in meters" + }, + "elevation_gain": { + "type": "number", + "description": "Elevation gain in meters" + }, + "elevation_loss": { + "type": "number", + "description": "Elevation loss in meters" + }, + "duration": { + "type": "number", + "description": "Duration in seconds" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "thumbnail": { + "type": "integer", + "description": "Index of thumbnail photo" + }, + "like_count": { + "type": "integer", + "default": 0 + }, + "category": { + "type": "string", + "description": "Category ID (15 chars)" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "gpx": { + "type": "string", + "description": "GPX file path" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "TrailCreateInput": { + "type": "object", + "required": [ + "name", + "author", + "public" + ], + "properties": { + "id": { + "type": "string", + "description": "Optional custom ID (15 chars)" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "description": { + "type": "string" + }, + "location": { + "type": "string" + }, + "date": { + "type": "string", + "format": "date" + }, + "public": { + "type": "boolean" + }, + "difficulty": { + "type": "string", + "enum": [ + "easy", + "moderate", + "difficult" + ] + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "thumbnail": { + "type": "integer" + }, + "like_count": { + "type": "integer", + "default": 0 + }, + "category": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "gpx": { + "type": "string" + } + } + }, + "TrailUpdateInput": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "location": { + "type": "string" + }, + "date": { + "type": "string", + "format": "date" + }, + "public": { + "type": "boolean" + }, + "difficulty": { + "type": "string", + "enum": [ + "easy", + "moderate", + "difficult" + ] + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "photos-": { + "type": "string", + "description": "Remove photo by name" + }, + "photos+": { + "type": "string", + "description": "Add photo by name" + }, + "thumbnail": { + "type": "integer" + }, + "like_count": { + "type": "integer", + "default": 0 + }, + "category": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "gpx": { + "type": "string" + } + } + }, + "Comment": { + "type": "object", + "required": [ + "id", + "text", + "author", + "trail" + ], + "properties": { + "id": { + "type": "string", + "description": "Comment ID (15 chars)" + }, + "text": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "CommentInput": { + "type": "object", + "required": [ + "text", + "author", + "trail" + ], + "properties": { + "text": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + } + } + }, + "CommentUpdateInput": { + "type": "object", + "properties": { + "text": { + "type": "string" + } + } + }, + "SummitLog": { + "type": "object", + "required": [ + "id", + "date", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Summit log ID (15 chars)" + }, + "date": { + "type": "string", + "format": "date" + }, + "text": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Associated trail ID" + }, + "gpx": { + "type": "string" + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "SummitLogInput": { + "type": "object", + "required": [ + "date", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Optional custom ID (15 chars)" + }, + "date": { + "type": "string", + "format": "date" + }, + "text": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "gpx": { + "type": "string" + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + } + }, + "SummitLogUpdateInput": { + "type": "object", + "properties": { + "date": { + "type": "string", + "format": "date" + }, + "text": { + "type": "string" + }, + "gpx": { + "type": "string" + }, + "distance": { + "type": "number" + }, + "elevation_gain": { + "type": "number" + }, + "elevation_loss": { + "type": "number" + }, + "duration": { + "type": "number" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "photos-": { + "type": "string", + "description": "Remove photo by name" + }, + "photos+": { + "type": "string", + "description": "Add photo by name" + } + } + }, + "Waypoint": { + "type": "object", + "required": [ + "id", + "lat", + "lon", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Waypoint ID (15 chars)" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance_from_start": { + "type": "number", + "description": "Distance from trail start in meters" + }, + "icon": { + "type": "string", + "description": "Icon identifier" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "WaypointInput": { + "type": "object", + "required": [ + "lat", + "lon", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Optional custom ID (15 chars)" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance_from_start": { + "type": "number" + }, + "icon": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID (15 chars)" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "trail": { + "type": "string" + } + } + }, + "WaypointUpdateInput": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "lat": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "lon": { + "type": "number", + "minimum": -180, + "maximum": 180 + }, + "distance_from_start": { + "type": "number" + }, + "icon": { + "type": "string" + }, + "photos": { + "type": "array", + "items": { + "type": "string" + } + }, + "photos-": { + "type": "string", + "description": "Remove photo by name" + }, + "photos+": { + "type": "string", + "description": "Add photo by name" + } + } + }, + "List": { + "type": "object", + "required": [ + "id", + "name", + "author", + "public" + ], + "properties": { + "id": { + "type": "string", + "description": "List ID (15 chars)" + }, + "name": { + "type": "string" + }, + "public": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "author": { + "type": "string", + "description": "Author user ID" + }, + "trails": { + "type": "array", + "items": { + "type": "string", + "description": "Trail IDs (15 chars)" + } + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "ListInput": { + "type": "object", + "required": [ + "name", + "public", + "trails", + "author" + ], + "properties": { + "id": { + "type": "string", + "description": "Optional custom ID (15 chars)" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "public": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "trails": { + "type": "array", + "items": { + "type": "string", + "description": "Trail ID (15 chars)" + } + }, + "author": { + "type": "string" + } + } + }, + "ListUpdateInput": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "public": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "trails": { + "type": "array", + "items": { + "type": "string" + } + }, + "trails-": { + "type": "string", + "description": "Remove trail by ID" + }, + "trails+": { + "type": "string", + "description": "Add trail by ID" + } + } + }, + "TrailShare": { + "type": "object", + "required": [ + "id", + "actor", + "trail", + "permission" + ], + "properties": { + "id": { + "type": "string", + "description": "Share ID (15 chars)" + }, + "actor": { + "type": "string", + "format": "uri", + "description": "ActivityPub actor IRI" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "TrailShareInput": { + "type": "object", + "required": [ + "actor", + "trail", + "permission" + ], + "properties": { + "actor": { + "type": "string", + "format": "uri", + "description": "ActivityPub actor IRI" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "TrailShareUpdateInput": { + "type": "object", + "required": [ + "permission" + ], + "properties": { + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "ListShare": { + "type": "object", + "required": [ + "id", + "actor", + "list", + "permission" + ], + "properties": { + "id": { + "type": "string", + "description": "Share ID (15 chars)" + }, + "actor": { + "type": "string", + "format": "uri", + "description": "ActivityPub actor IRI" + }, + "list": { + "type": "string", + "description": "List ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "ListShareInput": { + "type": "object", + "required": [ + "actor", + "list", + "permission" + ], + "properties": { + "actor": { + "type": "string", + "format": "uri", + "description": "ActivityPub actor IRI" + }, + "list": { + "type": "string", + "description": "List ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "ListShareUpdateInput": { + "type": "object", + "required": [ + "permission" + ], + "properties": { + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "TrailLinkShare": { + "type": "object", + "required": [ + "id", + "trail", + "permission" + ], + "properties": { + "id": { + "type": "string", + "description": "Share ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "TrailLinkShareInput": { + "type": "object", + "required": [ + "trail", + "permission" + ], + "properties": { + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "TrailLinkShareUpdateInput": { + "type": "object", + "required": [ + "permission" + ], + "properties": { + "permission": { + "type": "string", + "enum": [ + "view", + "edit" + ] + } + } + }, + "TrailLike": { + "type": "object", + "required": [ + "id", + "actor", + "trail" + ], + "properties": { + "id": { + "type": "string", + "description": "Like ID (15 chars)" + }, + "actor": { + "type": "string", + "description": "User ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + }, + "created": { + "type": "string", + "format": "date-time" + } + } + }, + "TrailLikeInput": { + "type": "object", + "required": [ + "actor", + "trail" + ], + "properties": { + "actor": { + "type": "string", + "description": "User ID (15 chars)" + }, + "trail": { + "type": "string", + "description": "Trail ID (15 chars)" + } + } + }, + "Follow": { + "type": "object", + "required": [ + "id", + "follower", + "followee" + ], + "properties": { + "id": { + "type": "string", + "description": "Follow ID (15 chars)" + }, + "follower": { + "type": "string", + "description": "Follower user ID" + }, + "followee": { + "type": "string", + "description": "Followee user ID (15 chars)" + }, + "created": { + "type": "string", + "format": "date-time" + } + } + }, + "FollowInput": { + "type": "object", + "required": [ + "followee" + ], + "properties": { + "followee": { + "type": "string", + "description": "Followee user ID (15 chars)" + } + } + }, + "Integration": { + "type": "object", + "required": [ + "id", + "user" + ], + "properties": { + "id": { + "type": "string", + "description": "Integration ID (15 chars)" + }, + "user": { + "type": "string", + "description": "User ID (15 chars)" + }, + "strava": { + "type": "object", + "properties": { + "clientId": { + "type": "integer" + }, + "clientSecret": { + "type": "string" + }, + "routes": { + "type": "boolean" + }, + "activities": { + "type": "boolean" + }, + "active": { + "type": "boolean" + }, + "after": { + "type": "string", + "format": "date" + }, + "privacy": { + "type": "string", + "enum": [ + "original", + "settings" + ] + } + } + }, + "komoot": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string" + }, + "completed": { + "type": "boolean" + }, + "planned": { + "type": "boolean" + }, + "active": { + "type": "boolean" + }, + "privacy": { + "type": "string", + "enum": [ + "original", + "settings" + ] + } + } + }, + "hammerhead": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string" + }, + "completed": { + "type": "boolean" + }, + "planned": { + "type": "boolean" + }, + "active": { + "type": "boolean" + }, + "after": { + "type": "string", + "format": "date" + } + } + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "IntegrationInput": { + "type": "object", + "required": [ + "user" + ], + "properties": { + "user": { + "type": "string", + "description": "User ID (15 chars)" + }, + "strava": { + "type": "object" + }, + "komoot": { + "type": "object" + }, + "hammerhead": { + "type": "object" + } + } + }, + "IntegrationUpdateInput": { + "type": "object", + "properties": { + "strava": { + "type": "object", + "nullable": true + }, + "komoot": { + "type": "object", + "nullable": true + }, + "hammerhead": { + "type": "object", + "nullable": true + } + } + }, + "Notification": { + "type": "object", + "required": [ + "id", + "user", + "type", + "seen" + ], + "properties": { + "id": { + "type": "string", + "description": "Notification ID (15 chars)" + }, + "user": { + "type": "string", + "description": "User ID (15 chars)" + }, + "type": { + "type": "string", + "description": "Notification type" + }, + "seen": { + "type": "boolean", + "default": false + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "NotificationUpdateInput": { + "type": "object", + "required": [ + "seen" + ], + "properties": { + "seen": { + "type": "boolean", + "const": true, + "description": "Mark as read" + } + } + }, + "Settings": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "Settings ID (15 chars)" + }, + "unit": { + "type": "string", + "enum": [ + "metric", + "imperial" + ] + }, + "language": { + "type": "string", + "description": "Language code" + }, + "bio": { + "type": "string", + "nullable": true + }, + "mapFocus": { + "type": "string", + "enum": [ + "trails", + "location" + ] + }, + "location": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "lat": { + "type": "number" + }, + "lon": { + "type": "number" + } + }, + "nullable": true + }, + "category": { + "type": "string" + }, + "tilesets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + } + } + }, + "nullable": true + }, + "terrain": { + "type": "object", + "properties": { + "terrain": { + "type": "string", + "format": "uri" + }, + "hillshading": { + "type": "string", + "format": "uri" + } + }, + "nullable": true + }, + "user": { + "type": "string" + }, + "privacy": { + "type": "object", + "properties": { + "account": { + "type": "string", + "enum": [ + "public", + "private" + ] + }, + "trails": { + "type": "string", + "enum": [ + "public", + "private" + ] + }, + "lists": { + "type": "string", + "enum": [ + "public", + "private" + ] + } + }, + "nullable": true + }, + "created": { + "type": "string", + "format": "date-time" + }, + "updated": { + "type": "string", + "format": "date-time" + } + } + }, + "SettingsInput": { + "type": "object", + "properties": { + "unit": { + "type": "string", + "enum": [ + "metric", + "imperial" + ] + }, + "language": { + "type": "string" + }, + "bio": { + "type": "string", + "nullable": true + }, + "mapFocus": { + "type": "string", + "enum": [ + "trails", + "location" + ] + }, + "location": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "lat": { + "type": "number" + }, + "lon": { + "type": "number" + } + }, + "nullable": true + }, + "category": { + "type": "string" + }, + "tilesets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + } + } + }, + "nullable": true + }, + "terrain": { + "type": "object", + "properties": { + "terrain": { + "type": "string", + "format": "uri" + }, + "hillshading": { + "type": "string", + "format": "uri" + } + }, + "nullable": true + }, + "user": { + "type": "string" + }, + "privacy": { + "type": "object", + "properties": { + "account": { + "type": "string", + "enum": [ + "public", + "private" + ] + }, + "trails": { + "type": "string", + "enum": [ + "public", + "private" + ] + }, + "lists": { + "type": "string", + "enum": [ + "public", + "private" + ] + } + }, + "nullable": true + } + } + }, + "ListResult": { + "type": "object", + "properties": { + "page": { + "type": "integer" + }, + "perPage": { + "type": "integer" + }, + "totalItems": { + "type": "integer" + }, + "totalPages": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "Error": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + }, + "code": { + "type": "integer" + }, + "data": { + "type": "object" + } + } + } + } + } +} \ No newline at end of file diff --git a/web/static/docs/api/wanderer.openapi.yaml b/web/static/docs/api/wanderer.openapi.yaml deleted file mode 100644 index c7c89f2c..00000000 --- a/web/static/docs/api/wanderer.openapi.yaml +++ /dev/null @@ -1,18486 +0,0 @@ -{ - "openapi": "3.0.1", - "info": { - "title": "wanderer", - "description": "", - "version": "1.0.0" - }, - "tags": [ - { - "name": "auth" - }, - { - "name": "category" - }, - { - "name": "comment" - }, - { - "name": "follow" - }, - { - "name": "trail-share" - }, - { - "name": "user" - }, - { - "name": "waypoint" - }, - { - "name": "list" - }, - { - "name": "list-share" - }, - { - "name": "notification" - }, - { - "name": "summit-log" - }, - { - "name": "trail" - } - ], - "paths": { - "/activitypub/activity/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "", - "required": true, - "example": "", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "actor": { - "type": "string" - }, - "type": { - "type": "string" - }, - "to": { - "type": "array", - "items": { - "type": "string" - } - }, - "cc": { - "type": "string" - }, - "published": { - "type": "string" - }, - "object": { - "type": "object", - "properties": {}, - "description": "ActivityPub object" - } - }, - "required": [ - "id", - "actor", - "to", - "cc", - "published", - "object", - "type" - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/comment/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "", - "required": true, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "type": { - "type": "string" - }, - "content": { - "type": "string" - }, - "attributedTo": { - "type": "string" - }, - "inReplyTo": { - "type": "string" - }, - "published": { - "type": "string" - } - }, - "required": [ - "@context", - "id", - "type", - "content", - "attributedTo", - "inReplyTo", - "published" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "id": "https://demo.wanderer.to/api/v1/comment/32wf88038cb800i", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Ja, echt toll!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af", - "published": "2025-06-18T18:48:15Z" - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/trail/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "", - "required": true, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "content": { - "type": "string" - }, - "attachment": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "mediaType": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "type", - "mediaType", - "url" - ] - } - }, - "attributedTo": { - "type": "string" - }, - "location": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "latitude": { - "type": "number" - }, - "longitude": { - "type": "number" - } - }, - "required": [ - "type", - "name", - "latitude", - "longitude" - ] - }, - "tag": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "content": { - "type": "string" - } - }, - "required": [ - "type", - "name", - "content" - ] - } - }, - "url": { - "type": "string" - }, - "published": { - "type": "string" - }, - "startTime": { - "type": "string" - } - }, - "required": [ - "@context", - "id", - "type", - "name", - "content", - "attachment", - "attributedTo", - "location", - "tag", - "url", - "published", - "startTime" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "id": "https://demo.wanderer.to/api/v1/trail/2ce3af7a2e80f52", - "type": "Note", - "name": "12 days in the Zugspitz region on the peak hiking trail", - "content": "

12 days in the Zugspitz region on the peak hiking trail

https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/route_ldv172t0my.webp" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/12_days_in_the_zugspitz_region_on_the_peak_hiking_trail_5ts04zgsuk.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Murnau am Staffelsee, Bayern, Deutschland", - "latitude": 47.678592, - "longitude": 11.196068 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "8902.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "8906.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "202403.824936m" - }, - { - "type": "Note", - "name": "duration", - "content": "4037.183333m" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52", - "published": "2025-06-17T21:40:02Z", - "startTime": "2025-06-14T00:00:00Z" - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}/followers": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "partOf": { - "type": "string" - }, - "totalItems": { - "type": "integer" - }, - "orderedItems": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "@context", - "type", - "first", - "partOf", - "totalItems", - "orderedItems" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "type": "OrderedCollectionPage", - "first": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers?page=1", - "partOf": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "totalItems": 3, - "orderedItems": [ - "https://social.tchncs.de/users/flomp", - "https://trails.magdeburg.jetzt/api/v1/activitypub/user/momar", - "https://darmstadt.social/users/stormii" - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}/outbox": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "next": { - "type": "string" - }, - "partOf": { - "type": "string" - }, - "totalItems": { - "type": "integer" - }, - "orderedItems": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "actor": { - "type": "string" - }, - "type": { - "type": "string" - }, - "to": { - "type": "array", - "items": { - "type": "string" - } - }, - "cc": { - "type": "array", - "items": { - "type": "string" - } - }, - "published": { - "type": "string" - }, - "object": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - }, - "content": { - "type": "string" - }, - "attachment": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "mediaType": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "type", - "mediaType", - "url" - ] - } - }, - "attributedTo": { - "type": "string" - }, - "inReplyTo": { - "type": "string" - }, - "tag": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "content": { - "type": "string" - }, - "id": { - "type": "string" - }, - "href": { - "type": "string" - } - }, - "required": [ - "type", - "name", - "content", - "id", - "href" - ] - } - }, - "url": { - "type": "string" - }, - "published": { - "type": "string" - }, - "startTime": { - "type": "string" - }, - "name": { - "type": "string" - }, - "location": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "latitude": { - "type": "number" - }, - "longitude": { - "type": "number" - } - }, - "required": [ - "type", - "name", - "latitude", - "longitude" - ] - } - }, - "required": [ - "id", - "type", - "name", - "content", - "attachment", - "attributedTo", - "location", - "tag", - "url", - "published", - "startTime" - ] - } - }, - "required": [ - "id", - "actor", - "type", - "to", - "cc", - "published", - "object" - ] - } - } - }, - "required": [ - "@context", - "type", - "first", - "next", - "partOf", - "totalItems", - "orderedItems" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "type": "OrderedCollectionPage", - "first": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox?page=1", - "next": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox?page=2", - "partOf": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox", - "totalItems": 21, - "orderedItems": [ - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/ypx6zhvsaonmkos", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": "https://www.w3.org/ns/activitystreams#Public", - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "https://social.tchncs.de/users/flomp/inbox" - ], - "published": "2025-06-18 18:50:02.518Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/summit-log/75md7yw7099j5rh", - "type": "Note", - "content": "

@flomp@social.tchncs.de

", - "attachment": [], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af", - "tag": [ - { - "type": "Note", - "name": "elevation_gain", - "content": "0.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "0.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "0.000000m" - }, - { - "type": "Note", - "name": "duration", - "content": "0.000000m" - }, - { - "id": "https://social.tchncs.de/users/flomp", - "type": "Mention", - "name": "@flomp@social.tchncs.de", - "href": "https://social.tchncs.de/users/flomp" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/23fd1747a29c3af", - "published": "2025-06-18T18:50:02Z", - "startTime": "2025-06-18T00:00:00Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/k6h3nxcgcg8ztjt", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://social.tchncs.de/users/flomp/inbox", - "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox" - ], - "published": "2025-06-18 18:48:15.481Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/comment/32wf88038cb800i", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Ja, echt toll!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af", - "tag": [ - { - "id": "https://social.tchncs.de/users/flomp", - "type": "Mention", - "name": "@flomp@social.tchncs.de", - "href": "https://social.tchncs.de/users/flomp" - } - ], - "published": "2025-06-18T18:48:15Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/ll0f2ectiohy55d", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "https://social.tchncs.de/users/flomp/inbox" - ], - "published": "2025-06-18 18:46:54.717Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af", - "type": "Note", - "name": "Radfernweg Berlin-Usedom", - "content": "

Radfernweg Berlin-Usedom

Auf nach Usedom!

@flomp@social.tchncs.de

https://demo.wanderer.to/trail/view/@demo/23fd1747a29c3af

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/23fd1747a29c3af/default_thumbnail_fz982rp32o.webp" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/23fd1747a29c3af/radfernweg_berlin_usedom_c1ftlwpxqq.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Berlin, Deutschland", - "latitude": 52.516379, - "longitude": 13.402514 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "1755.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "1795.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "340287.513156m" - }, - { - "type": "Note", - "name": "duration", - "content": "1298.616667m" - }, - { - "id": "https://social.tchncs.de/users/flomp", - "type": "Mention", - "name": "@flomp@social.tchncs.de", - "href": "https://social.tchncs.de/users/flomp" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/23fd1747a29c3af", - "published": "2025-06-18T18:46:54Z", - "startTime": "2020-07-27T00:00:00Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/2ok0a8jk137niua", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://social.tchncs.de/users/flomp/inbox", - "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox" - ], - "published": "2025-06-18 14:38:11.150Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/comment/i2xy97z4kmy8wj5", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Genau!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/c7fba19d7f3121e", - "published": "2025-06-18T14:38:11Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/um1cjums1ls0vhr", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers" - ], - "published": "2025-06-18 14:37:03.367Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/trail/c7fba19d7f3121e", - "type": "Note", - "name": "Herzogstand", - "content": "Schöne Route

https://demo.wanderer.to/trail/view/@demo/c7fba19d7f3121e

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/c7fba19d7f3121e/bard_bunny_fkdoahvxn3.svg" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/c7fba19d7f3121e/herzogstand_8itqbamj9j.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Kochel am See, Bayern, Deutschland", - "latitude": 47.62039, - "longitude": 11.34908 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "950.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "950.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "14040.219641m" - }, - { - "type": "Note", - "name": "duration", - "content": "84.333333m" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/c7fba19d7f3121e", - "published": "2025-06-18T14:37:03Z", - "startTime": "2010-01-01T00:00:00Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/zhum5i1znle0u5s", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://social.tchncs.de/users/flomp/inbox", - "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox" - ], - "published": "2025-06-18 14:32:29.664Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/comment/9jk7qjtv177hlf2", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Stimmt!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/activitypub/trail/2ce3af7a2e80f52", - "published": "2025-06-18T14:32:29Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/8zcj46423elzpbk", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://social.tchncs.de/users/flomp/inbox", - "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox" - ], - "published": "2025-06-18 14:05:12.530Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/comment/lf95x0w2h0s51l3", - "type": "Note", - "content": "

@flomp@social.tchncs.de

Stimmt, echt lang!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/trail/2ce3af7a2e80f52", - "published": "2025-06-18T14:05:12Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/wokmv9tfpu7uvm7", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers" - ], - "published": "2025-06-18 09:12:01.344Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/activitypub/trail/a0965dc31384a2b", - "type": "Note", - "name": "test", - "content": "

https://demo.wanderer.to/trail/view/@demo/a0965dc31384a2b

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/a0965dc31384a2b/route_zqddtv52qk.webp" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/a0965dc31384a2b/blob_vxtu95acms.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Prien am Chiemsee, Bavaria, Germany", - "latitude": 47.858914, - "longitude": 12.364729 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "259.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "185.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "16314.394386m" - }, - { - "type": "Note", - "name": "duration", - "content": "94.749000m" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/a0965dc31384a2b", - "published": "2025-06-18T09:12:01Z", - "startTime": "2025-06-18T00:00:00Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/fgizij4fvb9s5v6", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo" - ], - "published": "2025-06-17 21:53:23.738Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/activitypub/comment/3tn68g135406duj", - "type": "Note", - "content": "

Ja, ist echt so!

", - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "inReplyTo": "https://demo.wanderer.to/api/v1/activitypub/trail/2ce3af7a2e80f52", - "published": "2025-06-17T21:53:23Z" - } - }, - { - "id": "https://demo.wanderer.to/api/v1/activitypub/activity/nix8x5h1hvh75bf", - "actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Create", - "to": [ - "https://www.w3.org/ns/activitystreams#Public" - ], - "cc": [ - "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers" - ], - "published": "2025-06-17 21:40:02.336Z", - "object": { - "id": "https://demo.wanderer.to/api/v1/activitypub/trail/2ce3af7a2e80f52", - "type": "Note", - "name": "12 days in the Zugspitz region on the peak hiking trail", - "content": "

https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52

", - "attachment": [ - { - "type": "Image", - "mediaType": "image/jpeg", - "url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/route_ldv172t0my.webp" - }, - { - "type": "Document", - "mediaType": "application/xml+gpx", - "url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/12_days_in_the_zugspitz_region_on_the_peak_hiking_trail_5ts04zgsuk.gpx" - } - ], - "attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "location": { - "type": "Place", - "name": "Murnau am Staffelsee, Bayern, Deutschland", - "latitude": 47.678592, - "longitude": 11.196068 - }, - "tag": [ - { - "type": "Note", - "name": "category", - "content": "Biking" - }, - { - "type": "Note", - "name": "difficulty", - "content": "easy" - }, - { - "type": "Note", - "name": "elevation_gain", - "content": "8902.000000m" - }, - { - "type": "Note", - "name": "elevation_loss", - "content": "8906.000000m" - }, - { - "type": "Note", - "name": "distance", - "content": "202403.824936m" - }, - { - "type": "Note", - "name": "duration", - "content": "4037.183333m" - } - ], - "url": "https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52", - "published": "2025-06-17T21:40:02Z", - "startTime": "2025-06-14T00:00:00Z" - } - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}/inbox": { - "post": { - "summary": "show", - "deprecated": false, - "description": "Expects a valid, signed ActivityPub activity as json input", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": {} - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": {} - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}/following": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "partOf": { - "type": "string" - }, - "totalItems": { - "type": "integer" - }, - "orderedItems": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "@context", - "type", - "first", - "partOf", - "totalItems", - "orderedItems" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "type": "OrderedCollectionPage", - "first": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers?page=1", - "partOf": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "totalItems": 3, - "orderedItems": [ - "https://social.tchncs.de/users/flomp", - "https://trails.magdeburg.jetzt/api/v1/activitypub/user/momar", - "https://darmstadt.social/users/stormii" - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/activitypub/user/{handle}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "", - "tags": [], - "parameters": [ - { - "name": "handle", - "in": "path", - "description": "", - "required": true, - "example": "@user@domain", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/activity+json", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "type": { - "type": "string" - }, - "inbox": { - "type": "string" - }, - "outbox": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "name": { - "type": "string" - }, - "preferredUsername": { - "type": "string" - }, - "followers": { - "type": "string" - }, - "following": { - "type": "string" - }, - "url": { - "type": "string" - }, - "published": { - "type": "string" - }, - "icon": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "type", - "url" - ] - }, - "publicKey": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "owner": { - "type": "string" - }, - "publicKeyPem": { - "type": "string" - } - }, - "required": [ - "id", - "owner", - "publicKeyPem" - ] - } - }, - "required": [ - "@context", - "id", - "type", - "inbox", - "outbox", - "summary", - "name", - "preferredUsername", - "followers", - "following", - "url", - "published", - "icon", - "publicKey" - ] - }, - "example": { - "@context": [ - "https://www.w3.org/ns/activitystreams" - ], - "id": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "type": "Person", - "inbox": "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox", - "outbox": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox", - "summary": "Born the day we installed the site.", - "name": "demo", - "preferredUsername": "demo", - "followers": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers", - "following": "https://demo.wanderer.to/api/v1/activitypub/user/demo/following", - "url": "https://demo.wanderer.to/profile/@demo", - "published": "2025-05-05T15:07:59.943Z", - "icon": { - "type": "Image", - "url": "https://demo.wanderer.to/api/v1/files/users/26b1si1344ficl6/wlezq_um7vh2722q.jpg" - }, - "publicKey": { - "id": "https://demo.wanderer.to/api/v1/activitypub/user/demo#main-key", - "owner": "https://demo.wanderer.to/api/v1/activitypub/user/demo", - "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0xyaRWP5X955bwSnUbr\nmwEF/2Fdmn5nlRRmEvej1BR0oBcPMVPYrrK4sz37mrAJ7Wbmg4KjmSDEROD4sApr\nM5FmKeU1OBsV2O3bL1DSW/8PXaf4JQRgl0AO+LiSAd7A/GO0viAzJXyJT4Rpaamf\n8Naclh7YR5E4JXrsjahPEWtUWcQ4g8Yhc6n2ptQ33ACI7Q1R3+U7q1tMaRCKAbdT\nbRahzqGs3iSxV+FjnsMR109KqDQJDMjwRB11USJTA4/nMpV6w8RS+171xNHl12Sg\nGpiuusmXMYYuoECdKDtLY7AsntusYMzXUjPzKfE+5EqPmIj5OTbg3A24p9hWIv5s\nmwIDAQAB\n-----END PUBLIC KEY-----\n" - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/auth/login": { - "post": { - "summary": "login", - "deprecated": false, - "description": "Authenticates a registered user. The session is returned in a cookie named `pb_auth`. You need to include this cookie in subsequent requests.", - "operationId": "login", - "tags": [ - "auth" - ], - "parameters": [ - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "username": { - "type": "string", - "minLength": 3 - }, - "password": { - "type": "string", - "minLength": 8 - } - }, - "required": [ - "username", - "password" - ] - }, - "example": { - "username": "admin", - "password": "12345678" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "record": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "email": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "collectionId", - "collectionName", - "created", - "email", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "token": { - "type": "string" - } - }, - "required": [ - "record", - "token" - ] - }, - "example": { - "record": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "email": "notmymail@googlemail.com", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - }, - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MzY4MDEwMjksImlkIjoiM211Z2Y5NTN3NGE5Zmc1IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.LBMx7FuCR4eRC6zG96TDX6BfEKMHBoo-9eQ9LvpU0rg" - } - } - }, - "headers": { - "set-cookie": { - "example": "pb_auth=%7B%22token%22%3A%22eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MzcxMjY5MjQsImlkIjoiM211Z2Y5NTN3NGE5Zmc1IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.F-gRu-w_oUvt9GqjjGKZe18smdhtMO6oYhB36KJ5odo%22%2C%22model%22%3A%7B%22avatar%22%3A%2223xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg%22%2C%22bio%22%3A%22Enim%20beatae%20labore%20vel.%20Pariatur%20hic%20doloribus%20quia%20quasi%20eos.%20Cumque%20error%20nobis.%22%2C%22collectionId%22%3A%22_pb_users_auth_%22%2C%22collectionName%22%3A%22users%22%2C%22created%22%3A%222024-06-29%2019%3A23%3A47.731Z%22%2C%22email%22%3A%22mymail%40gmail.com%22%2C%22emailVisibility%22%3Afalse%2C%22id%22%3A%223mugf953w4a9fg5%22%2C%22token%22%3A%22eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA%22%2C%22updated%22%3A%222025-01-03%2012%3A32%3A15.270Z%22%2C%22username%22%3A%22Flomp%22%2C%22verified%22%3Atrue%7D%7D; Path=/; Expires=Fri, 17 Jan 2025 15:15:24 GMT; SameSite=Strict", - "required": false, - "description": "Contains the authentication cookie", - "schema": { - "type": "string" - } - } - } - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to authenticate.", - "detail": { - "code": 400, - "message": "Failed to authenticate.", - "data": {} - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "undefined", - "path": [ - "password" - ], - "message": "Required" - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid JSON": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ] - }, - "example": { - "message": "invalid_json" - } - } - }, - "headers": {} - } - }, - "security": [] - } - }, - "/category": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all categories.", - "operationId": "listCategories", - "tags": [ - "category" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "name=\"abc\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "id", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "img": { - "type": "string" - }, - "name": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "img", - "name", - "updated" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "example": { - "page": 1, - "perPage": 5, - "totalItems": 6, - "totalPages": 2, - "items": [ - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.632Z", - "id": "8m2qclsl6p8at9k", - "img": "hiking_EwOAWJFKCg.jpg", - "name": "Hiking", - "updated": "2024-06-29 19:23:12.632Z" - }, - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.648Z", - "id": "x5y2ikswxzoznek", - "img": "walking_YOtlMqoDps.jpg", - "name": "Walking", - "updated": "2024-06-29 19:23:12.648Z" - }, - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.658Z", - "id": "9ecf7bunl88bt4k", - "img": "climbing_vRyCdFwURk.jpg", - "name": "Climbing", - "updated": "2024-06-29 19:23:12.658Z" - }, - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.669Z", - "id": "pbwx1lg2nmcih0w", - "img": "skiing_KdUASbxv4C.jpg", - "name": "Skiing", - "updated": "2024-06-29 19:23:12.669Z" - }, - { - "collectionId": "kjxvi8asj2igqwf", - "collectionName": "categories", - "created": "2024-06-29 19:23:12.679Z", - "id": "7sqwezntokmbvdr", - "img": "canoeing_QBmwxRx6uh.jpg", - "name": "Canoeing", - "updated": "2024-06-29 19:23:12.679Z" - } - ] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 0, - "type": "number", - "inclusive": false, - "exact": false, - "message": "Number must be greater than 0", - "path": [ - "page" - ] - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - } - }, - "/comment": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all comments.", - "operationId": "listComments", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "text=\"abc\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "trail", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "iri": { - "type": "string" - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "id", - "iri", - "text", - "trail", - "updated" - ] - } - }, - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - } - }, - "required": [ - "items", - "page", - "perPage", - "totalItems", - "totalPages" - ] - }, - "example": { - "items": [ - { - "author": "8uvv7d6dh667xh1", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-05-27 07:58:10.194Z", - "id": "224z7nsu3m35b6k", - "iri": "", - "text": "https://readerclub.my.id/book.php?isbn=216156650-rewind-it-back", - "trail": "072fba5eaee0e2b", - "updated": "2025-05-27 07:58:10.194Z" - }, - { - "author": "l1a076cl9w16g9b", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-06-17 21:40:20.796Z", - "id": "2wrgay454lu7t08", - "iri": "https://social.tchncs.de/users/flomp/statuses/114700872618854877", - "text": "

@demo

Ganz schön lang!

", - "trail": "2ce3af7a2e80f52", - "updated": "2025-06-17 21:40:20.796Z" - }, - { - "author": "pnat0l9g6p3nh2a", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-05-31 14:14:40.077Z", - "id": "30h73u05t60ku3u", - "iri": "", - "text": "Fixe!", - "trail": "c0ec3039d47cc48", - "updated": "2025-05-31 14:14:40.077Z" - }, - { - "author": "pnat0l9g6p3nh2a", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-06-18 18:48:15.477Z", - "id": "32wf88038cb800i", - "iri": "", - "text": "

@flomp@social.tchncs.de

Ja, echt toll!

", - "trail": "23fd1747a29c3af", - "updated": "2025-06-18 18:48:15.477Z" - }, - { - "author": "pnat0l9g6p3nh2a", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-05-31 13:01:03.235Z", - "id": "5nm8og6umaiipc8", - "iri": "", - "text": "stuff", - "trail": "8beaf58dbf3ce95", - "updated": "2025-05-31 13:01:03.235Z" - } - ], - "page": 1, - "perPage": 5, - "totalItems": 14, - "totalPages": 3 - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 0, - "type": "number", - "inclusive": false, - "exact": false, - "message": "Number must be greater than 0", - "path": [ - "page" - ] - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a comment. ", - "operationId": "createComment", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string", - "minLength": 15, - "maxLength": 15 - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - "required": [ - "text", - "author", - "trail" - ] - }, - "example": { - "text": "test", - "trail": "3zdz20mt9243f60", - "author": "z014o6bpcg680mg" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "trail": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - } - }, - "required": [ - "author", - "trail" - ] - }, - "id": { - "type": "string" - }, - "rating": { - "type": "integer" - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "expand", - "id", - "rating", - "text", - "trail", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-01-02 20:48:00.278Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - }, - "trail": { - "author": "3mugf953w4a9fg5", - "category": "pbwx1lg2nmcih0w", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-12-30 18:57:35.453Z", - "date": "2024-12-30 00:00:00.000Z", - "description": "", - "difficulty": "moderate", - "distance": 5631.307320599051, - "duration": 0, - "elevation_gain": 76, - "elevation_loss": 76, - "gpx": "blob_0E0x721wan.gpx", - "id": "z94vgei3jdc37k4", - "lat": 47.385232, - "location": "", - "lon": 9.655863, - "name": "Die Pottsau", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_2SQmCCI6DV.jpg", - "caret_right_solid_9154Rrvk6B.svg" - ], - "public": false, - "summit_logs": [ - "95bb1d77c8dfa98" - ], - "thumbnail": 1, - "updated": "2024-12-30 18:59:56.924Z", - "waypoints": [ - "7f6d2a8c9d50136", - "60c2d435a5b66ed" - ] - } - }, - "id": "sv3finqrp3951av", - "rating": 0, - "text": "API comment", - "trail": "z94vgei3jdc37k4", - "updated": "2025-01-02 20:48:00.278Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/comment/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single comment.", - "operationId": "showComment", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "iri": { - "type": "string" - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "id", - "iri", - "text", - "trail", - "updated" - ] - }, - "example": { - "author": "pnat0l9g6p3nh2a", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-06-18 18:48:15.477Z", - "id": "32wf88038cb800i", - "iri": "", - "text": "

@flomp@social.tchncs.de

Ja, echt toll!

", - "trail": "23fd1747a29c3af", - "updated": "2025-06-18 18:48:15.477Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a comment.", - "operationId": "updateComment", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "author": { - "type": "string" - } - }, - "required": [ - "text", - "trail", - "author" - ] - }, - "example": "" - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "rating": { - "type": "integer" - }, - "text": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "id", - "rating", - "text", - "trail", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2025-01-02 20:43:00.030Z", - "id": "tmof4bjvtw0sqqu", - "rating": 0, - "text": "API comment updated", - "trail": "z94vgei3jdc37k4", - "updated": "2025-01-02 21:00:03.866Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a comment.", - "operationId": "deleteComment", - "tags": [ - "comment" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/follow": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all follows.", - "operationId": "listFollows", - "tags": [ - "follow" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "follower=\"3mugf953w4a9fg5\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "follower", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - }, - { - "name": "type", - "in": "query", - "description": "Return followers or following", - "required": true, - "schema": { - "type": "string", - "enum": [ - "followers", - "following" - ] - } - }, - { - "name": "handle", - "in": "query", - "description": "Handle of the actor in question (@user@domain)", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "followee": { - "type": "string" - }, - "follower": { - "type": "string" - }, - "id": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "follower": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - }, - "followee": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "follower", - "followee" - ] - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "followee", - "follower", - "id", - "updated", - "expand" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "example": { - "page": 1, - "perPage": 5, - "totalItems": 1, - "totalPages": 1, - "items": [ - { - "collectionId": "8obn1ukumze565i", - "collectionName": "follows", - "created": "2024-12-20 23:22:18.445Z", - "followee": "3mugf953w4a9fg5", - "follower": "znhd3hgrxl85c9f", - "id": "xajdtx5j8l10wov", - "updated": "2024-12-20 23:22:18.445Z", - "expand": { - "follower": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - }, - "followee": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 0, - "type": "number", - "inclusive": false, - "exact": false, - "message": "Number must be greater than 0", - "path": [ - "page" - ] - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a follow.", - "operationId": "createFollow", - "tags": [ - "follow" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "follower": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id of person following" - }, - "followee": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id of person being followed" - } - }, - "required": [ - "follower", - "followee" - ] - }, - "example": { - "text": "test", - "trail": "3zdz20mt9243f60", - "author": "z014o6bpcg680mg" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "follower": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - } - }, - "required": [ - "follower" - ] - }, - "followee": { - "type": "string" - }, - "follower": { - "type": "string" - }, - "id": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "expand", - "followee", - "follower", - "id", - "updated" - ] - }, - "example": { - "collectionId": "8obn1ukumze565i", - "collectionName": "follows", - "created": "2025-01-02 22:01:46.741Z", - "expand": { - "follower": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - } - }, - "followee": "znhd3hgrxl85c9f", - "follower": "3mugf953w4a9fg5", - "id": "0vfwhxsdvhf2jn5", - "updated": "2025-01-02 22:01:46.741Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "followee" - ] - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/follow/{id}": { - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a follow.", - "operationId": "deleteFollow", - "tags": [ - "follow" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Follow Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail-share": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all trail-shares.", - "operationId": "listTrailShares", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "permission=\"view\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "user", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "user": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "user" - ] - } - } - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 30, - "totalPages": 6, - "items": [ - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-11-15 20:00:10.603Z", - "id": "027pf52phm4a5vx", - "permission": "view", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-11-15 20:00:10.603Z", - "user": "3mugf953w4a9fg5", - "expand": { - "user": { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-09-14 14:36:36.470Z", - "id": "0q3pknqtbf5zsmu", - "permission": "view", - "trail": "2o9c3pxfvrzclud", - "updated": "2024-09-14 14:36:36.470Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-09-14 13:05:39.661Z", - "id": "1n7oo2f14d2bwi5", - "permission": "view", - "trail": "yesm2tqc6jok8jq", - "updated": "2024-09-14 13:05:39.661Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-12-02 17:46:13.399Z", - "id": "23mpznfesfbyha1", - "permission": "view", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:46:13.399Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-09-14 14:36:36.155Z", - "id": "2lhw2wak0i71rmr", - "permission": "view", - "trail": "oy1auygew9fvha0", - "updated": "2024-09-14 14:36:36.155Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 5, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 21:43:09.964Z", - "id": "13ikooi1f6tgjvd", - "rating": 0, - "text": "Comment", - "trail": "267r63tmbyezpck", - "updated": "2024-12-20 21:43:09.964Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 20:37:33.558Z", - "id": "1rjjl1riy4jrdmm", - "rating": 0, - "text": "C", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-12-20 20:37:33.558Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-19 21:18:30.979Z", - "id": "6vcudpc4wgc0cku", - "rating": 0, - "text": "Zehn Ziegen zogen zehn Zentner Zucker zum Zoo!", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-19 21:18:30.979Z", - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-02 17:43:26.303Z", - "id": "p4r2x69bq7iz8ah", - "rating": 0, - "text": "Geht das?", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:43:26.303Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-21 00:37:08.033Z", - "id": "vkwrak7tytf9vur", - "rating": 0, - "text": "Anim minim consequat veniam ad laboris velit magna veniam dolor. Incididunt in non fugiat aliqua. Ullamco sint ipsum cupidatat Lorem deserunt id quis. Irure minim duis pariatur irure commodo non officia cillum et exercitation laborum. Enim nisi ipsum velit nisi. Consectetur et ad enim laboris.\n\nLorem commodo ex deserunt deserunt fugiat et consequat sit ad consequat nulla quis reprehenderit. Commodo sit eu consequat reprehenderit elit labore Lorem pariatur enim do ad irure ex ad. Nisi magna irure est dolore elit laboris commodo consectetur sint aliquip sit. Do exercitation ullamco incididunt culpa eu dolore dolore sint esse laboris elit enim cillum excepteur. Sit veniam veniam ex deserunt Lorem Lorem ut incididunt dolor sint nulla eiusmod magna adipisicing.", - "trail": "267r63tmbyezpck", - "updated": "2024-12-21 00:37:08.033Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a trail share. ", - "operationId": "createTrailShare", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "trail": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "Trail Id" - }, - "user": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id" - }, - "permission": { - "type": "string", - "enum": [ - "view", - "edit" - ], - "description": "Permissions for user" - } - }, - "required": [ - "trail", - "user", - "permission" - ] - }, - "example": { - "trail": "z94vgei3jdc37k4", - "user": "z014o6bpcg680mg", - "permission": "view" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "trail": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - } - }, - "required": [ - "author" - ] - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "expand", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - } - }, - "required": [ - "trail" - ] - }, - "id": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "expand", - "id", - "permission", - "trail", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2025-01-03 12:41:01.998Z", - "expand": { - "trail": { - "author": "3mugf953w4a9fg5", - "category": "pbwx1lg2nmcih0w", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-12-30 18:57:35.453Z", - "date": "2024-12-30 00:00:00.000Z", - "description": "", - "difficulty": "moderate", - "distance": 5631.307320599051, - "duration": 0, - "elevation_gain": 76, - "elevation_loss": 76, - "expand": { - "author": { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2025-01-03 12:32:15.270Z", - "username": "Flomp", - "verified": true - } - }, - "gpx": "blob_0E0x721wan.gpx", - "id": "z94vgei3jdc37k4", - "lat": 47.385232, - "location": "", - "lon": 9.655863, - "name": "Die Pottsau", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_2SQmCCI6DV.jpg", - "caret_right_solid_9154Rrvk6B.svg" - ], - "public": false, - "summit_logs": [ - "95bb1d77c8dfa98" - ], - "thumbnail": 1, - "updated": "2024-12-30 18:59:56.924Z", - "waypoints": [ - "7f6d2a8c9d50136", - "60c2d435a5b66ed" - ] - } - }, - "id": "93jrstjcngapleb", - "permission": "view", - "trail": "z94vgei3jdc37k4", - "updated": "2025-01-03 12:41:01.998Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail-share/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single trail share.", - "operationId": "showTrailShare", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "permission", - "trail", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2024-12-08 21:48:07.886Z", - "id": "98ksbvxgqlp45jl", - "permission": "view", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-08 21:48:07.886Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a trail share.", - "operationId": "updateTrailShare", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "permission": { - "type": "string", - "enum": [ - "view", - "edit" - ] - } - } - }, - "example": { - "permission": "view" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "trail": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "permission", - "trail", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1mns8mlal6uf9ku", - "collectionName": "trail_share", - "created": "2025-01-03 12:41:01.998Z", - "id": "93jrstjcngapleb", - "permission": "edit", - "trail": "z94vgei3jdc37k4", - "updated": "2025-01-03 12:42:13.052Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a trail share.", - "operationId": "deleteTrailShare", - "tags": [ - "trail-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/user/anonymous": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all anonymized users (email and token are hidden).", - "operationId": "listUsersAnonymous", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "username=\"Flomp\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "id", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 2, - "totalPages": 1, - "items": [ - { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - }, - { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 5, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 21:43:09.964Z", - "id": "13ikooi1f6tgjvd", - "rating": 0, - "text": "Comment", - "trail": "267r63tmbyezpck", - "updated": "2024-12-20 21:43:09.964Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 20:37:33.558Z", - "id": "1rjjl1riy4jrdmm", - "rating": 0, - "text": "C", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-12-20 20:37:33.558Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-19 21:18:30.979Z", - "id": "6vcudpc4wgc0cku", - "rating": 0, - "text": "Zehn Ziegen zogen zehn Zentner Zucker zum Zoo!", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-19 21:18:30.979Z", - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-02 17:43:26.303Z", - "id": "p4r2x69bq7iz8ah", - "rating": 0, - "text": "Geht das?", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:43:26.303Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-21 00:37:08.033Z", - "id": "vkwrak7tytf9vur", - "rating": 0, - "text": "Anim minim consequat veniam ad laboris velit magna veniam dolor. Incididunt in non fugiat aliqua. Ullamco sint ipsum cupidatat Lorem deserunt id quis. Irure minim duis pariatur irure commodo non officia cillum et exercitation laborum. Enim nisi ipsum velit nisi. Consectetur et ad enim laboris.\n\nLorem commodo ex deserunt deserunt fugiat et consequat sit ad consequat nulla quis reprehenderit. Commodo sit eu consequat reprehenderit elit labore Lorem pariatur enim do ad irure ex ad. Nisi magna irure est dolore elit laboris commodo consectetur sint aliquip sit. Do exercitation ullamco incididunt culpa eu dolore dolore sint esse laboris elit enim cillum excepteur. Sit veniam veniam ex deserunt Lorem Lorem ut incididunt dolor sint nulla eiusmod magna adipisicing.", - "trail": "267r63tmbyezpck", - "updated": "2024-12-21 00:37:08.033Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/user/anonymous/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single anonymized user (email and token are hidden).", - "operationId": "showUserAnonymous", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "User Id", - "required": true, - "example": "3mugf953w4a9fg5", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - }, - "example": { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/user/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single user. The only valid id is the one of the logged-in user. Use the \"user/anonymous/{id}\" endpoint for all other users.", - "operationId": "showUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "User Id", - "required": true, - "example": "3mugf953w4a9fg5", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "email": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "email", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "example": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "email": "notmymail@googlemail.com", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a user.", - "operationId": "updateUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "User Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "username": { - "type": "string", - "minLength": 3 - }, - "password": { - "type": "string", - "minLength": 8 - }, - "passwordConfirm": { - "type": "string", - "minLength": 8, - "description": "Must be equal to \"password\"" - }, - "email": { - "type": "string", - "format": "email" - }, - "bio": { - "type": "string", - "description": "User biography" - } - } - }, - "example": { - "username": "Kim_Hettinger23", - "password": "minim elit", - "passwordConfirm": "minim elit", - "email": "Theodora_Kovacek@yahoo.com", - "bio": "A sed velit cum esse. Delectus minus nulla animi fugit minima omnis. Perspiciatis voluptas iure ipsa a dignissimos. Sequi magni odio beatae quisquam." - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "email": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "email", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "example": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "email": "mymail@gmail.com", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2025-01-03 12:29:55.103Z", - "username": "Flomp", - "verified": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a user.", - "operationId": "deleteUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/user": { - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a user. ", - "operationId": "createUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "username": { - "type": "string", - "minLength": 3 - }, - "password": { - "type": "string", - "minLength": 8 - }, - "passwordConfirm": { - "type": "string", - "minLength": 8, - "description": "Must be equal to \"password\"" - }, - "email": { - "type": "string", - "format": "email" - } - }, - "required": [ - "username", - "password", - "passwordConfirm", - "email" - ] - }, - "example": { - "username": "Angela.Pacocha95", - "password": "deserunt", - "passwordConfirm": "deserunt", - "email": "Braulio98@gmail.com" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "example": { - "avatar": "", - "bio": "", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2025-01-03 12:23:01.865Z", - "emailVisibility": false, - "id": "nfynp8jhat2o4sy", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSBuZnlucDhqaGF0Mm80c3kgT1Igc2hhcmVzID0gbmZ5bnA4amhhdDJvNHN5In19fQ.RtK_w6Bjqni720FEjVqIwaWhtrqqy5rFPA7qAdPd0iA", - "updated": "2025-01-03 12:23:01.867Z", - "username": "Dewayne33", - "verified": false - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [] - } - }, - "/user/{id}/file": { - "post": { - "summary": "file", - "deprecated": false, - "description": "Uploads an avatar file for a user.", - "operationId": "fileUser", - "tags": [ - "user" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "User Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "format": "binary", - "description": "Avatar image file. Allowed file types: PNG, JPG, WEBP, SVG", - "example": "file:///Users/christianbeutel/Downloads/23xxesym0e9w18z2904frnpgy7.jpg" - } - }, - "required": [ - "avatar" - ] - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "email": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "email", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - }, - "example": { - "avatar": "23xxesym0e9w18z2904frnpgy7_OzsVanAmWP.jpg", - "bio": "Enim beatae labore vel. Pariatur hic doloribus quia quasi eos. Cumque error nobis.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "email": "mymail@gmail.com", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2025-01-03 12:32:15.270Z", - "username": "Flomp", - "verified": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/waypoint": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all waypoints.", - "operationId": "listWaypoints", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "name=\"abc\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "description", - "icon", - "id", - "lat", - "lon", - "name", - "photos", - "updated" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 96, - "totalPages": 20, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-11-09 10:33:45.943Z", - "description": "", - "icon": "circle", - "id": "035691efaa5cf0a", - "lat": 47.71415538, - "lon": 11.98004365, - "name": "Kesselalm (1275 m)", - "photos": [], - "updated": "2024-11-09 10:33:45.943Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-10-06 09:33:11.379Z", - "description": "", - "icon": "circle", - "id": "04328b07923294e", - "lat": 47.71415538, - "lon": 11.98004365, - "name": "Kesselalm (1275 m)", - "photos": [], - "updated": "2024-10-06 09:33:11.379Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-11-09 10:31:37.884Z", - "description": "", - "icon": "circle", - "id": "056510042fb882d", - "lat": 47.71215663291514, - "lon": 11.964081572368741, - "name": "Birkenstein (850 m)", - "photos": [], - "updated": "2024-11-09 10:31:37.884Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-09-07 11:11:29.646Z", - "description": "", - "icon": "circle", - "id": "0b8bb0a2c97b669", - "lat": 47.449586391448975, - "lon": 11.238069534301758, - "name": "St. Anton (Restaurant)", - "photos": [], - "updated": "2024-09-07 11:11:29.646Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-09-07 11:11:29.459Z", - "description": "", - "icon": "circle", - "id": "0c4fb8ae0465eb1", - "lat": 47.44074583053589, - "lon": 11.212363243103027, - "name": "Ferchensee (Bushaltestelle)", - "photos": [], - "updated": "2024-09-07 11:11:29.459Z" - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 5, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 21:43:09.964Z", - "id": "13ikooi1f6tgjvd", - "rating": 0, - "text": "Comment", - "trail": "267r63tmbyezpck", - "updated": "2024-12-20 21:43:09.964Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 20:37:33.558Z", - "id": "1rjjl1riy4jrdmm", - "rating": 0, - "text": "C", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-12-20 20:37:33.558Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-19 21:18:30.979Z", - "id": "6vcudpc4wgc0cku", - "rating": 0, - "text": "Zehn Ziegen zogen zehn Zentner Zucker zum Zoo!", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-19 21:18:30.979Z", - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-02 17:43:26.303Z", - "id": "p4r2x69bq7iz8ah", - "rating": 0, - "text": "Geht das?", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:43:26.303Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-21 00:37:08.033Z", - "id": "vkwrak7tytf9vur", - "rating": 0, - "text": "Anim minim consequat veniam ad laboris velit magna veniam dolor. Incididunt in non fugiat aliqua. Ullamco sint ipsum cupidatat Lorem deserunt id quis. Irure minim duis pariatur irure commodo non officia cillum et exercitation laborum. Enim nisi ipsum velit nisi. Consectetur et ad enim laboris.\n\nLorem commodo ex deserunt deserunt fugiat et consequat sit ad consequat nulla quis reprehenderit. Commodo sit eu consequat reprehenderit elit labore Lorem pariatur enim do ad irure ex ad. Nisi magna irure est dolore elit laboris commodo consectetur sint aliquip sit. Do exercitation ullamco incididunt culpa eu dolore dolore sint esse laboris elit enim cillum excepteur. Sit veniam veniam ex deserunt Lorem Lorem ut incididunt dolor sint nulla eiusmod magna adipisicing.", - "trail": "267r63tmbyezpck", - "updated": "2024-12-21 00:37:08.033Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a waypoint. ", - "operationId": "createWaypoint", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "lat": { - "type": "number", - "minimum": -90, - "maximum": 90 - }, - "lon": { - "type": "number", - "minimum": -180, - "maximum": 180 - }, - "icon": { - "type": "string", - "description": "Fontawesome icon string (https://fontawesome.com/v6/search?o=r&m=free)" - }, - "author": { - "type": "string", - "description": "User Id", - "minLength": 15, - "maxLength": 15 - } - }, - "required": [ - "lon", - "lat", - "author" - ] - }, - "example": { - "name": "non repellat possimus", - "description": "Impedit modi nisi quibusdam eum rerum illo. Minus mollitia delectus vitae optio vero. Maiores praesentium dolores nostrum laborum saepe. Dolorem qui non. Dolorem dolores facere facere reiciendis ab doloribus.", - "lat": -81.44545573482735, - "lon": 178.9999004930424, - "icon": "pen", - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "description", - "icon", - "id", - "lat", - "lon", - "name", - "photos", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2025-01-03 13:07:25.852Z", - "description": "Impedit modi nisi quibusdam eum rerum illo. Minus mollitia delectus vitae optio vero. Maiores praesentium dolores nostrum laborum saepe. Dolorem qui non. Dolorem dolores facere facere reiciendis ab doloribus.", - "icon": "pen", - "id": "fjqcwd17fawiy83", - "lat": -81.44545573482735, - "lon": 178.9999004930424, - "name": "non repellat possimus", - "photos": [], - "updated": "2025-01-03 13:07:25.852Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/waypoint/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single waypoint.", - "operationId": "showWaypoint", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Waypoint Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "description", - "icon", - "id", - "lat", - "lon", - "name", - "photos", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2024-11-09 10:33:45.943Z", - "description": "", - "icon": "circle", - "id": "035691efaa5cf0a", - "lat": 47.71415538, - "lon": 11.98004365, - "name": "Kesselalm (1275 m)", - "photos": [], - "updated": "2024-11-09 10:33:45.943Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a waypoint.", - "operationId": "updateWaypoint", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Waypoint Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "lat": { - "type": "number", - "minimum": -90, - "maximum": 90 - }, - "lon": { - "type": "number", - "minimum": -180, - "maximum": 180 - }, - "icon": { - "type": "string", - "description": "Fontawesome icon string (https://fontawesome.com/v6/search?o=r&m=free)" - } - } - }, - "example": { - "name": "molestias suscipit asperiores", - "description": "Quidem illum labore illum quo doloribus ratione temporibus. Voluptatem voluptatum tempore deleniti amet voluptate. Consectetur soluta repellat accusantium blanditiis. Quis sapiente inventore. Sed excepturi cum incidunt dolores tempora illum neque. Non nostrum alias ut facere assumenda.", - "lat": -78.53460271991707, - "lon": 112.79017323734126, - "icon": "house" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "description", - "icon", - "id", - "lat", - "lon", - "name", - "photos", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "goeo2ubp103rzp9", - "collectionName": "waypoints", - "created": "2025-01-03 13:07:25.852Z", - "description": "Quidem illum labore illum quo doloribus ratione temporibus. Voluptatem voluptatum tempore deleniti amet voluptate. Consectetur soluta repellat accusantium blanditiis. Quis sapiente inventore. Sed excepturi cum incidunt dolores tempora illum neque. Non nostrum alias ut facere assumenda.", - "icon": "house", - "id": "fjqcwd17fawiy83", - "lat": -78.53460271991707, - "lon": 112.79017323734126, - "name": "molestias suscipit asperiores", - "photos": [], - "updated": "2025-01-03 13:09:45.168Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a waypoint.", - "operationId": "deleteWaypoint", - "tags": [ - "waypoint" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Waypoint Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all lists.", - "operationId": "listLists", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "name=\"abc\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated", - "expand" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "example": { - "page": 1, - "perPage": 5, - "totalItems": 4, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "640px_mont_saint_michel_vu_du_ciel_MvWoudBkPE.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-09-09 22:10:07.972Z", - "description": "La Véloscénie is a 450-kilometre (280 mi) cycle route that takes you on an adventure from Paris to Mont-Saint-Michel on the Channel coast. From the capital to the beaches, passing through numerous hamlets and stunning towns such as Chartres, this journey westwards has many surprises in store.\r\n\r\nWe suggest you complete this journey in seven stages. This is a challenging pace, but should still leave you time to discover the many attractions en route. Cathedrals, castles, lakes, stunning landscapes and historic villages will show you that you don't have to wait for Mont-Saint-Michel to be amazed.\r\n\r\nThe itinerary alternates between little-used secondary roads, greenways and trails. This trip is best ridden on a bike that can handle rougher trails, like a touring, hybrid or gravel bike.\r\n\r\nParis is easy to reach from anywhere in France, but the choice is more limited if you want to leave from Mont-Saint-Michel. The nearest railway station is in Pontorson, 10 kilometres (6 mi) from Mont-Saint-Michel. From Pontorson, direct trains to Paris leave every evening, around 6pm on weekdays and at weekends, only between June and the end of September. Bikes can be taken on board free of charge by prior arrangement. Apart from this seasonal service, there are other ways of returning to Paris, with at least one train change required. For more information: veloscenic.com/reaching-the-veloscenic-cycle-route\r\n\r\nAlthough the route is accessible all year round, some accommodation and tourist attractions are likely to close in the low season, so it’s best to ride in spring or summer. While some stages end in big cities, others end in more rural areas and you’ll need to book your accommodation in advance. It’s not necessary to book restaurants along the route, but it is best to plan stops for refreshments, as not all the villages you pass through have restaurants or shops.", - "id": "bdv9iukn4d2lf2i", - "name": "From Paris to Mont-Saint-Michel — La Véloscénie", - "public": false, - "trails": [ - "jou2tcf0y8jj9m3", - "ilyvsa4xr52lxlr", - "2y8o7bwmor4yltt", - "gmh81mczhjp834l", - "6hpvcyosmqr8uk8", - "iql9fifaxnb5u6m", - "y9hjysn5xhbmi86", - "fehuzqkfi49hkwn", - "fmin7pbj8urtxx0", - "14y4qxqbqh0n10m", - "6fv6krwusycttbl", - "66jj108gizquc2r", - "wbuwzu8tp48hljg", - "x3lo6ru4ly753w6", - "h91u3vl8n5ekune", - "bzodytd0vd2e56g", - "oy1auygew9fvha0", - "6atd6i73bzle0ar", - "iz2ohx9hbn8irrc", - "2o9c3pxfvrzclud", - "btn09xkl7ab0n9k", - "ek2cb00tw4v4fav" - ], - "updated": "2024-12-27 00:55:25.917Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "caret_right_solid_iUtggzDoh7.svg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2024-12-27 00:55:21.456Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 0, - "type": "number", - "inclusive": false, - "exact": false, - "message": "Number must be greater than 0", - "path": [ - "page" - ] - } - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a list. ", - "operationId": "createList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name of the list" - }, - "description": { - "type": "string", - "description": "Description of the list" - }, - "public": { - "type": "boolean", - "description": "Visible for everyone" - }, - "trails": { - "type": "array", - "items": { - "type": "string", - "description": "Trail Id", - "minLength": 15, - "maxLength": 15 - }, - "description": "List of trail Ids contained in the list", - "minItems": 0 - }, - "author": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id" - } - }, - "required": [ - "name", - "public", - "trails", - "author" - ] - }, - "example": { - "name": "API List", - "description": "A list created via the wanderer API", - "public": true, - "trails": [], - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "A list created via the wanderer API", - "id": "4yql7587j64qdo5", - "name": "API List", - "public": true, - "trails": [], - "updated": "2025-01-02 22:29:19.092Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "name" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single list.", - "operationId": "showList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Comment Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated", - "expand" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a list.", - "operationId": "updateList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name of the list" - }, - "description": { - "type": "string", - "description": "Description of the list" - }, - "public": { - "type": "boolean", - "description": "Visible for everyone" - }, - "trails": { - "type": "array", - "items": { - "type": "string", - "description": "Trail Id", - "minLength": 15, - "maxLength": 15 - }, - "description": "List of trail Ids contained in the list", - "minItems": 0 - } - } - }, - "example": { - "name": "API List", - "description": "A list created via the wanderer API", - "public": true, - "trails": [], - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a list.", - "operationId": "deleteList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list/{id}/file": { - "post": { - "summary": "file", - "deprecated": false, - "description": "Uploads an avatar file for a list.", - "operationId": "fileList", - "tags": [ - "list" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "format": "binary", - "description": "Avatar image file. Allowed file types: PNG, JPG, WEBP, SVG", - "example": "file:///Users/christianbeutel/Downloads/23xxesym0e9w18z2904frnpgy7.jpg" - } - }, - "required": [ - "avatar" - ] - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "id", - "name", - "public", - "trails", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "avatar": "23xxesym0e9w18z2904frnpgy7_bmAvN4NpoA.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2025-01-02 23:06:30.788Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list-share": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all list-shares.", - "operationId": "listListShares", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "permission=\"view\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "user", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "user": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "user" - ] - } - } - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 1, - "totalPages": 1, - "items": [ - { - "collectionId": "1kot7t9na3hi0gl", - "collectionName": "list_share", - "created": "2024-11-15 16:34:15.333Z", - "id": "xjn56wlra4rqdtl", - "list": "bdv9iukn4d2lf2i", - "permission": "view", - "updated": "2024-11-15 16:34:15.333Z", - "user": "znhd3hgrxl85c9f", - "expand": { - "user": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 5, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 21:43:09.964Z", - "id": "13ikooi1f6tgjvd", - "rating": 0, - "text": "Comment", - "trail": "267r63tmbyezpck", - "updated": "2024-12-20 21:43:09.964Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-20 20:37:33.558Z", - "id": "1rjjl1riy4jrdmm", - "rating": 0, - "text": "C", - "trail": "l4u85lr0x6jgojd", - "updated": "2024-12-20 20:37:33.558Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-19 21:18:30.979Z", - "id": "6vcudpc4wgc0cku", - "rating": 0, - "text": "Zehn Ziegen zogen zehn Zentner Zucker zum Zoo!", - "trail": "oual4h0zovut2ph", - "updated": "2024-12-19 21:18:30.979Z", - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-02 17:43:26.303Z", - "id": "p4r2x69bq7iz8ah", - "rating": 0, - "text": "Geht das?", - "trail": "6558yf0g9knodhv", - "updated": "2024-12-02 17:43:26.303Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "lf06qip3f4d11yk", - "collectionName": "comments", - "created": "2024-12-21 00:37:08.033Z", - "id": "vkwrak7tytf9vur", - "rating": 0, - "text": "Anim minim consequat veniam ad laboris velit magna veniam dolor. Incididunt in non fugiat aliqua. Ullamco sint ipsum cupidatat Lorem deserunt id quis. Irure minim duis pariatur irure commodo non officia cillum et exercitation laborum. Enim nisi ipsum velit nisi. Consectetur et ad enim laboris.\n\nLorem commodo ex deserunt deserunt fugiat et consequat sit ad consequat nulla quis reprehenderit. Commodo sit eu consequat reprehenderit elit labore Lorem pariatur enim do ad irure ex ad. Nisi magna irure est dolore elit laboris commodo consectetur sint aliquip sit. Do exercitation ullamco incididunt culpa eu dolore dolore sint esse laboris elit enim cillum excepteur. Sit veniam veniam ex deserunt Lorem Lorem ut incididunt dolor sint nulla eiusmod magna adipisicing.", - "trail": "267r63tmbyezpck", - "updated": "2024-12-21 00:37:08.033Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a list share. ", - "operationId": "createListShare", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "list": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "List Id" - }, - "user": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id" - }, - "permission": { - "type": "string", - "enum": [ - "view", - "edit" - ], - "description": "Permissions for user" - } - }, - "required": [ - "list", - "user", - "permission" - ] - }, - "example": { - "list": "dci7qk44birm2bn", - "user": "z014o6bpcg680mg", - "permission": "view" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "list": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "avatar": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "description": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "emailVisibility": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "token": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "username": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "emailVisibility", - "id", - "token", - "updated", - "username", - "verified" - ] - } - }, - "required": [ - "author" - ] - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "public": { - "type": "boolean" - }, - "trails": { - "type": "array", - "items": { - "type": "string" - } - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "avatar", - "collectionId", - "collectionName", - "created", - "description", - "expand", - "id", - "name", - "public", - "trails", - "updated" - ] - } - }, - "required": [ - "list" - ] - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "expand", - "id", - "list", - "permission", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1kot7t9na3hi0gl", - "collectionName": "list_share", - "created": "2025-01-03 10:36:23.596Z", - "expand": { - "list": { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "_pb_users_auth_", - "collectionName": "users", - "created": "2024-06-29 19:23:47.731Z", - "emailVisibility": false, - "id": "3mugf953w4a9fg5", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXlVaWQiOiIzMjk3NmExMi03ODE1LTQ1NGQtYTU5Yi1hNzY0ZTE4NmJjNjIiLCJzZWFyY2hSdWxlcyI6eyJjaXRpZXM1MDAiOnt9LCJ0cmFpbHMiOnsiZmlsdGVyIjoicHVibGljID0gdHJ1ZSBPUiBhdXRob3IgPSAzbXVnZjk1M3c0YTlmZzUgT1Igc2hhcmVzID0gM211Z2Y5NTN3NGE5Zmc1In19fQ.swips6eep2qMd0Nf3hdZr711N2fHyikOo7syWvuLEIA", - "updated": "2024-12-30 18:36:39.161Z", - "username": "Flomp", - "verified": true - } - }, - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z" - } - }, - "id": "r8r938af52vdae1", - "list": "dci7qk44birm2bn", - "permission": "view", - "updated": "2025-01-03 10:36:23.596Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "received": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - }, - "message": { - "type": "string" - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_type", - "expected": "string", - "received": "number", - "path": [ - "text" - ], - "message": "Expected string, received number" - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/list-share/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single list share.", - "operationId": "showListShare", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "list", - "permission", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1kot7t9na3hi0gl", - "collectionName": "list_share", - "created": "2024-11-15 16:34:15.333Z", - "id": "xjn56wlra4rqdtl", - "list": "bdv9iukn4d2lf2i", - "permission": "view", - "updated": "2024-11-15 16:34:15.333Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a list share.", - "operationId": "updateListShare", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "permission": { - "type": "string", - "enum": [ - "view", - "edit" - ] - } - } - }, - "example": { - "permission": "view" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "required": [ - "collectionId", - "collectionName", - "created", - "id", - "list", - "permission", - "updated", - "user" - ] - }, - "example": { - "collectionId": "1kot7t9na3hi0gl", - "collectionName": "list_share", - "created": "2025-01-03 10:36:23.596Z", - "id": "r8r938af52vdae1", - "list": "dci7qk44birm2bn", - "permission": "edit", - "updated": "2025-01-03 10:39:28.597Z", - "user": "znhd3hgrxl85c9f" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a list share.", - "operationId": "deleteListShare", - "tags": [ - "list-share" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "List Share Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/notification": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all notifications.", - "operationId": "listNotifications", - "tags": [ - "notification" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "recipient=\"r8r938af52vdae1\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "metadata": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - } - }, - "required": [ - "author", - "id", - "list" - ] - }, - "recipient": { - "type": "string" - }, - "seen": { - "type": "boolean" - }, - "type": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "recipient": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - }, - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "recipient", - "author" - ] - } - } - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 1, - "totalPages": 1, - "items": [ - { - "author": "znhd3hgrxl85c9f", - "collectionId": "khrcci2uqknny8h", - "collectionName": "notifications", - "created": "2025-01-03 10:36:23.603Z", - "id": "yu9vp1kbid56s6u", - "metadata": { - "author": "Flomp", - "id": "dci7qk44birm2bn", - "list": "Liste mit Oachkatzerl" - }, - "recipient": "3mugf953w4a9fg5", - "seen": false, - "type": "list_share", - "updated": "2025-01-03 10:49:22.945Z", - "expand": { - "recipient": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - }, - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 4, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "640px_mont_saint_michel_vu_du_ciel_MvWoudBkPE.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-09-09 22:10:07.972Z", - "description": "La Véloscénie is a 450-kilometre (280 mi) cycle route that takes you on an adventure from Paris to Mont-Saint-Michel on the Channel coast. From the capital to the beaches, passing through numerous hamlets and stunning towns such as Chartres, this journey westwards has many surprises in store.\r\n\r\nWe suggest you complete this journey in seven stages. This is a challenging pace, but should still leave you time to discover the many attractions en route. Cathedrals, castles, lakes, stunning landscapes and historic villages will show you that you don't have to wait for Mont-Saint-Michel to be amazed.\r\n\r\nThe itinerary alternates between little-used secondary roads, greenways and trails. This trip is best ridden on a bike that can handle rougher trails, like a touring, hybrid or gravel bike.\r\n\r\nParis is easy to reach from anywhere in France, but the choice is more limited if you want to leave from Mont-Saint-Michel. The nearest railway station is in Pontorson, 10 kilometres (6 mi) from Mont-Saint-Michel. From Pontorson, direct trains to Paris leave every evening, around 6pm on weekdays and at weekends, only between June and the end of September. Bikes can be taken on board free of charge by prior arrangement. Apart from this seasonal service, there are other ways of returning to Paris, with at least one train change required. For more information: veloscenic.com/reaching-the-veloscenic-cycle-route\r\n\r\nAlthough the route is accessible all year round, some accommodation and tourist attractions are likely to close in the low season, so it’s best to ride in spring or summer. While some stages end in big cities, others end in more rural areas and you’ll need to book your accommodation in advance. It’s not necessary to book restaurants along the route, but it is best to plan stops for refreshments, as not all the villages you pass through have restaurants or shops.", - "id": "bdv9iukn4d2lf2i", - "name": "From Paris to Mont-Saint-Michel — La Véloscénie", - "public": false, - "trails": [ - "jou2tcf0y8jj9m3", - "ilyvsa4xr52lxlr", - "2y8o7bwmor4yltt", - "gmh81mczhjp834l", - "6hpvcyosmqr8uk8", - "iql9fifaxnb5u6m", - "y9hjysn5xhbmi86", - "fehuzqkfi49hkwn", - "fmin7pbj8urtxx0", - "14y4qxqbqh0n10m", - "6fv6krwusycttbl", - "66jj108gizquc2r", - "wbuwzu8tp48hljg", - "x3lo6ru4ly753w6", - "h91u3vl8n5ekune", - "bzodytd0vd2e56g", - "oy1auygew9fvha0", - "6atd6i73bzle0ar", - "iz2ohx9hbn8irrc", - "2o9c3pxfvrzclud", - "btn09xkl7ab0n9k", - "ek2cb00tw4v4fav" - ], - "updated": "2024-12-27 00:55:25.917Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "caret_right_solid_iUtggzDoh7.svg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2024-12-27 00:55:21.456Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/notification/{id}": { - "post": { - "summary": "update", - "deprecated": false, - "description": "Marks a notification as seen.", - "operationId": "updateNotification", - "tags": [ - "notification" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Notification Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "seen": { - "type": "boolean", - "default": true - } - }, - "required": [ - "seen" - ] - }, - "example": { - "seen": true - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "metadata": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "id": { - "type": "string" - }, - "list": { - "type": "string" - } - }, - "required": [ - "author", - "id", - "list" - ] - }, - "recipient": { - "type": "string" - }, - "seen": { - "type": "boolean" - }, - "type": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "id", - "metadata", - "recipient", - "seen", - "type", - "updated" - ] - }, - "example": { - "author": "znhd3hgrxl85c9f", - "collectionId": "khrcci2uqknny8h", - "collectionName": "notifications", - "created": "2025-01-03 10:36:23.603Z", - "id": "yu9vp1kbid56s6u", - "metadata": { - "author": "Flomp", - "id": "dci7qk44birm2bn", - "list": "Liste mit Oachkatzerl" - }, - "recipient": "3mugf953w4a9fg5", - "seen": true, - "type": "list_share", - "updated": "2025-01-03 10:57:22.899Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/summit-log": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all summit logs.", - "operationId": "listSummitLogs", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "distance>=500", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "integer" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 14, - "totalPages": 3, - "items": [ - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-12-02 00:06:13.761Z", - "date": "2024-12-02 00:00:00.000Z", - "distance": 0, - "duration": 0, - "elevation_gain": 0, - "elevation_loss": 0, - "gpx": "", - "id": "22879d2ce902f57", - "photos": [ - "wanderer_stats_QbRDtbqXp8.png" - ], - "text": "Heute war auch nicht schlecht!", - "updated": "2024-12-02 00:06:13.802Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-11-11 15:34:42.149Z", - "date": "2024-11-11 00:00:00.000Z", - "distance": 0, - "duration": 0, - "elevation_gain": 0, - "elevation_loss": 0, - "gpx": "", - "id": "282aa2f6aa2901d", - "photos": [], - "text": "", - "updated": "2024-11-11 15:34:42.149Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-12-30 18:42:22.407Z", - "date": "2010-06-26 00:00:00.000Z", - "distance": 17.272892451353634, - "duration": 19, - "elevation_gain": 0.48071279999999916, - "elevation_loss": 3.845214800000001, - "gpx": "blob_li_rt_ludnm5_CTr98mgc40.tcx", - "id": "4p1gjllhdrhnuyr", - "photos": [], - "text": "", - "updated": "2024-12-30 18:42:22.463Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-12-26 21:35:23.376Z", - "date": "2024-12-26 00:00:00.000Z", - "distance": 14055.576293821563, - "duration": 5060, - "elevation_gain": 1197, - "elevation_loss": 1194, - "gpx": "herzogstand_4uFe02QqSL.gpx", - "id": "5yftqj5opprl9ju", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_hR8ogccdVG.jpg" - ], - "text": "", - "updated": "2024-12-26 21:35:23.458Z" - }, - { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-11-05 22:05:43.778Z", - "date": "2024-11-02 00:00:00.000Z", - "distance": 12452.945922907797, - "duration": 16993, - "elevation_gain": 770.0000000000002, - "elevation_loss": 770.4800000000002, - "gpx": "kranzberg_tzNjcOwhf2.gpx", - "id": "7072f62edbb8e62", - "photos": [], - "text": "", - "updated": "2024-11-05 22:06:19.100Z" - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 4, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "640px_mont_saint_michel_vu_du_ciel_MvWoudBkPE.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-09-09 22:10:07.972Z", - "description": "La Véloscénie is a 450-kilometre (280 mi) cycle route that takes you on an adventure from Paris to Mont-Saint-Michel on the Channel coast. From the capital to the beaches, passing through numerous hamlets and stunning towns such as Chartres, this journey westwards has many surprises in store.\r\n\r\nWe suggest you complete this journey in seven stages. This is a challenging pace, but should still leave you time to discover the many attractions en route. Cathedrals, castles, lakes, stunning landscapes and historic villages will show you that you don't have to wait for Mont-Saint-Michel to be amazed.\r\n\r\nThe itinerary alternates between little-used secondary roads, greenways and trails. This trip is best ridden on a bike that can handle rougher trails, like a touring, hybrid or gravel bike.\r\n\r\nParis is easy to reach from anywhere in France, but the choice is more limited if you want to leave from Mont-Saint-Michel. The nearest railway station is in Pontorson, 10 kilometres (6 mi) from Mont-Saint-Michel. From Pontorson, direct trains to Paris leave every evening, around 6pm on weekdays and at weekends, only between June and the end of September. Bikes can be taken on board free of charge by prior arrangement. Apart from this seasonal service, there are other ways of returning to Paris, with at least one train change required. For more information: veloscenic.com/reaching-the-veloscenic-cycle-route\r\n\r\nAlthough the route is accessible all year round, some accommodation and tourist attractions are likely to close in the low season, so it’s best to ride in spring or summer. While some stages end in big cities, others end in more rural areas and you’ll need to book your accommodation in advance. It’s not necessary to book restaurants along the route, but it is best to plan stops for refreshments, as not all the villages you pass through have restaurants or shops.", - "id": "bdv9iukn4d2lf2i", - "name": "From Paris to Mont-Saint-Michel — La Véloscénie", - "public": false, - "trails": [ - "jou2tcf0y8jj9m3", - "ilyvsa4xr52lxlr", - "2y8o7bwmor4yltt", - "gmh81mczhjp834l", - "6hpvcyosmqr8uk8", - "iql9fifaxnb5u6m", - "y9hjysn5xhbmi86", - "fehuzqkfi49hkwn", - "fmin7pbj8urtxx0", - "14y4qxqbqh0n10m", - "6fv6krwusycttbl", - "66jj108gizquc2r", - "wbuwzu8tp48hljg", - "x3lo6ru4ly753w6", - "h91u3vl8n5ekune", - "bzodytd0vd2e56g", - "oy1auygew9fvha0", - "6atd6i73bzle0ar", - "iz2ohx9hbn8irrc", - "2o9c3pxfvrzclud", - "btn09xkl7ab0n9k", - "ek2cb00tw4v4fav" - ], - "updated": "2024-12-27 00:55:25.917Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "caret_right_solid_iUtggzDoh7.svg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2024-12-27 00:55:21.456Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a summit log. ", - "operationId": "createSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "date": { - "type": "string", - "description": "Date of the summit log", - "format": "date" - }, - "text": { - "type": "string", - "description": "Description of the summit log" - }, - "distance": { - "type": "number", - "minimum": 0, - "description": "Distance in meters" - }, - "elevation_gain": { - "type": "number", - "minimum": 0, - "description": "Elevation gain in vertical meters" - }, - "elevation_loss": { - "type": "number", - "minimum": 0, - "description": "Elevation loss in vertical meters" - }, - "duration": { - "type": "number", - "minimum": 0, - "description": "Duration in seconds" - }, - "author": { - "type": "string", - "description": "User Id", - "minLength": 15, - "maxLength": 15 - } - }, - "required": [ - "date", - "author" - ] - }, - "example": { - "date": "2025-01-01", - "text": "Created by wanderer API", - "distance": 12, - "elevation_gain": 34, - "elevation_loss": 42, - "duration": 21, - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "integer" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2025-01-03 09:56:37.620Z", - "date": "2025-01-01 00:00:00.000Z", - "distance": 12, - "duration": 21, - "elevation_gain": 34, - "elevation_loss": 42, - "gpx": "", - "id": "58iuq9j30qbbwmq", - "photos": [], - "text": "Created by wanderer API", - "updated": "2025-01-03 09:56:37.620Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "validation": { - "type": "string" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "code", - "message", - "path" - ] - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_string", - "validation": "date", - "message": "Invalid date", - "path": [ - "date" - ] - }, - { - "code": "custom", - "message": "invalid-date", - "path": [ - "date" - ] - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/summit-log/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single summit log.", - "operationId": "showSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "95bb1d77c8dfa98", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated", - "expand" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2024-12-30 18:58:04.809Z", - "date": "2024-12-10 00:00:00.000Z", - "distance": 283396.31855792465, - "duration": 0, - "elevation_gain": 0, - "elevation_loss": 0, - "gpx": "2024_10_22_04_28_2024_10_22_21_29_AicYbqRkLD.gpx", - "id": "95bb1d77c8dfa98", - "photos": [ - "dscn0010_7MuzM5ExLa.jpg", - "caret_right_solid_OLanLqeV1l.svg" - ], - "text": "", - "updated": "2024-12-30 18:59:56.822Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "Updates a summit log.", - "operationId": "updateSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "6vcudpc4wgc0ckk", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "date": { - "type": "string", - "description": "Date of the summit log", - "format": "date" - }, - "text": { - "type": "string", - "description": "Description of the summit log" - }, - "distance": { - "type": "number", - "minimum": 0, - "description": "Distance in meters" - }, - "elevation_gain": { - "type": "number", - "minimum": 0, - "description": "Elevation gain in vertical meters" - }, - "elevation_loss": { - "type": "number", - "minimum": 0, - "description": "Elevation loss in vertical meters" - }, - "duration": { - "type": "number", - "minimum": 0, - "description": "Duration in seconds" - } - } - }, - "example": "{\n \"date\": \"2025-12-12\",\n \"text\": \"Updated by wanderer API\",\n \"distance\": 32,\n \"elevation_gain\": 45,\n \"elevation_loss\": 21,\n \"duration\": 29,\n}" - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2025-01-03 09:56:37.620Z", - "date": "2025-01-02 00:00:00.000Z", - "distance": 36983010.25256769, - "duration": 68163654.92949024, - "elevation_gain": 44389248.880456366, - "elevation_loss": 6494274.720874871, - "gpx": "", - "id": "58iuq9j30qbbwmq", - "photos": [], - "text": "et magna veniam anim cillum", - "updated": "2025-01-03 10:11:22.553Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a summit log.", - "operationId": "deleteSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/summit-log/{id}/file": { - "post": { - "summary": "file", - "deprecated": false, - "description": "Uploads or removes photos, uploads GPS data file for a summit log.", - "operationId": "fileSummitLog", - "tags": [ - "summit-log" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "photos": { - "format": "binary", - "type": "string", - "description": "List of image files to add. Allowed file types: PNG, JPG, WEBP, SVG", - "example": [ - "" - ] - }, - "photos-": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of file names to delete.", - "example": "" - }, - "gpx": { - "type": "string", - "format": "binary", - "minLength": 0, - "maxLength": 1, - "description": "File containing GPS track data. Allowed file types: GPX, JSON, FIT, KML", - "example": "file:///Users/christianbeutel/Downloads/2021-10-24_536064034_Essen-Mitte.nach.Bochum-Hauptbahnhof.gpx" - } - } - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "text": { - "type": "string" - }, - "updated": { - "type": "string" - } - }, - "required": [ - "author", - "collectionId", - "collectionName", - "created", - "date", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "photos", - "text", - "updated" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "collectionId": "dd2l9a4vxpy2ni8", - "collectionName": "summit_logs", - "created": "2025-01-03 09:56:37.620Z", - "date": "2025-01-02 00:00:00.000Z", - "distance": 36983010.25256769, - "duration": 68163654.92949024, - "elevation_gain": 44389248.880456366, - "elevation_loss": 6494274.720874871, - "gpx": "2021_11_14_564807964_dusseldorf_angermund_nach_n4R1NcyDsY.Neuss-Hamm.gpx", - "id": "58iuq9j30qbbwmq", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_CTPOstkHAC.jpg" - ], - "text": "et magna veniam anim cillum", - "updated": "2025-01-03 10:22:09.893Z" - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail": { - "get": { - "summary": "list", - "deprecated": false, - "description": "Lists all trails.", - "operationId": "listTrails", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "Page number starting at 1", - "required": false, - "example": 1, - "schema": { - "type": "number" - } - }, - { - "name": "perPage", - "in": "query", - "description": "Items per page", - "required": false, - "example": 5, - "schema": { - "type": "number" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort string (-/+)", - "required": false, - "example": "-created", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter string (https://pocketbase.io/docs/api-rules-and-filters/#filters-syntax)", - "required": false, - "example": "name=\"MyTrail\"", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "author", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "my-key", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "page": { - "type": "integer" - }, - "perPage": { - "type": "integer" - }, - "totalItems": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints", - "expand" - ] - } - } - }, - "required": [ - "page", - "perPage", - "totalItems", - "totalPages", - "items" - ] - }, - "examples": { - "1": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 53, - "totalPages": 11, - "items": [ - { - "author": "3mugf953w4a9fg5", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-10-06 09:33:11.404Z", - "date": "2024-10-06 00:00:00.000Z", - "description": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", - "difficulty": "easy", - "distance": 7504.162098327643, - "duration": 0, - "elevation_gain": 840.19189453125, - "elevation_loss": 0, - "gpx": "breitenstein_3_DvymxgjEm5.gpx", - "id": "074jf18neqwfbsr", - "lat": 47.71215663291514, - "location": "", - "lon": 11.964081572368741, - "name": "Breitenstein", - "photos": [], - "public": false, - "summit_logs": [], - "thumbnail": 0, - "updated": "2024-11-05 21:54:20.799Z", - "waypoints": [ - "43570e9537dd83a", - "2efed4a4b90e8b3", - "d1ae45c1f4e6353", - "69de69fdb3b47b5", - "162d22a68a1a98b", - "04328b07923294e" - ], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-09-14 14:18:27.538Z", - "date": "2024-09-14 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 18487.660615835353, - "duration": 0, - "elevation_gain": 209.55000000000015, - "elevation_loss": 0, - "gpx": "blob_BaoYdHnfYw.gpx", - "id": "14y4qxqbqh0n10m", - "lat": 48.311547246, - "location": "", - "lon": 0.993056622, - "name": "Thiron-Gardais - Nogent-le-Rotrou", - "photos": [], - "public": true, - "summit_logs": [], - "thumbnail": 0, - "updated": "2024-12-08 21:26:17.269Z", - "waypoints": [], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "znhd3hgrxl85c9f", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-11-15 18:50:36.223Z", - "date": "2024-11-15 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 283396.31855792465, - "duration": 0, - "elevation_gain": 0, - "elevation_loss": 0, - "gpx": "2024_10_22_04_28_2024_10_22_21_29_UUGET8zBuk.gpx", - "id": "267r63tmbyezpck", - "lat": 41.754053, - "location": "", - "lon": -2.484733, - "name": "Gassi", - "photos": [], - "public": true, - "summit_logs": [ - "e980ffa422f1603" - ], - "thumbnail": 0, - "updated": "2024-11-16 12:49:33.814Z", - "waypoints": [], - "expand": { - "author": { - "avatar": "screenshot_2024_06_30_at_22_55_34_jpeg_grafik_1024_1024_pixel_skaliert_89_GnBqL3uYqZ.png", - "bio": "", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-30 21:02:11.693Z", - "id": "znhd3hgrxl85c9f", - "private": false, - "username": "John" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-09-14 14:18:26.946Z", - "date": "2024-09-14 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 10942.463179990422, - "duration": 0, - "elevation_gain": 66.64999999999999, - "elevation_loss": 0, - "gpx": "blob_ZjF1DuT8Rl.gpx", - "id": "2o9c3pxfvrzclud", - "lat": 48.626390603, - "location": "", - "lon": -0.960178937, - "name": "Mortain - St-Hilaire-du-Harcouët", - "photos": [], - "public": true, - "summit_logs": [], - "thumbnail": 0, - "updated": "2024-12-08 21:26:17.888Z", - "waypoints": [], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "category": "x5y2ikswxzoznek", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-09-14 14:18:27.604Z", - "date": "2024-09-14 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 23920.21858179372, - "duration": 0, - "elevation_gain": 238.07999999999996, - "elevation_loss": 0, - "gpx": "blob_oyW3EXsfqS.gpx", - "id": "2y8o7bwmor4yltt", - "lat": 48.8029381, - "location": "", - "lon": 2.1264017, - "name": "Versailles - St-Rémy-lès-Chevreuse", - "photos": [], - "public": true, - "summit_logs": [], - "thumbnail": 0, - "updated": "2024-12-08 21:26:16.840Z", - "waypoints": [], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - }, - "3": { - "summary": "Success", - "value": { - "page": 1, - "perPage": 5, - "totalItems": 4, - "totalPages": 1, - "items": [ - { - "author": "3mugf953w4a9fg5", - "avatar": "", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2025-01-02 22:29:19.092Z", - "description": "This list was updated by the wanderer API", - "id": "4yql7587j64qdo5", - "name": "Updated API List", - "public": false, - "trails": [], - "updated": "2025-01-02 22:39:36.944Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "640px_mont_saint_michel_vu_du_ciel_MvWoudBkPE.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-09-09 22:10:07.972Z", - "description": "La Véloscénie is a 450-kilometre (280 mi) cycle route that takes you on an adventure from Paris to Mont-Saint-Michel on the Channel coast. From the capital to the beaches, passing through numerous hamlets and stunning towns such as Chartres, this journey westwards has many surprises in store.\r\n\r\nWe suggest you complete this journey in seven stages. This is a challenging pace, but should still leave you time to discover the many attractions en route. Cathedrals, castles, lakes, stunning landscapes and historic villages will show you that you don't have to wait for Mont-Saint-Michel to be amazed.\r\n\r\nThe itinerary alternates between little-used secondary roads, greenways and trails. This trip is best ridden on a bike that can handle rougher trails, like a touring, hybrid or gravel bike.\r\n\r\nParis is easy to reach from anywhere in France, but the choice is more limited if you want to leave from Mont-Saint-Michel. The nearest railway station is in Pontorson, 10 kilometres (6 mi) from Mont-Saint-Michel. From Pontorson, direct trains to Paris leave every evening, around 6pm on weekdays and at weekends, only between June and the end of September. Bikes can be taken on board free of charge by prior arrangement. Apart from this seasonal service, there are other ways of returning to Paris, with at least one train change required. For more information: veloscenic.com/reaching-the-veloscenic-cycle-route\r\n\r\nAlthough the route is accessible all year round, some accommodation and tourist attractions are likely to close in the low season, so it’s best to ride in spring or summer. While some stages end in big cities, others end in more rural areas and you’ll need to book your accommodation in advance. It’s not necessary to book restaurants along the route, but it is best to plan stops for refreshments, as not all the villages you pass through have restaurants or shops.", - "id": "bdv9iukn4d2lf2i", - "name": "From Paris to Mont-Saint-Michel — La Véloscénie", - "public": false, - "trails": [ - "jou2tcf0y8jj9m3", - "ilyvsa4xr52lxlr", - "2y8o7bwmor4yltt", - "gmh81mczhjp834l", - "6hpvcyosmqr8uk8", - "iql9fifaxnb5u6m", - "y9hjysn5xhbmi86", - "fehuzqkfi49hkwn", - "fmin7pbj8urtxx0", - "14y4qxqbqh0n10m", - "6fv6krwusycttbl", - "66jj108gizquc2r", - "wbuwzu8tp48hljg", - "x3lo6ru4ly753w6", - "h91u3vl8n5ekune", - "bzodytd0vd2e56g", - "oy1auygew9fvha0", - "6atd6i73bzle0ar", - "iz2ohx9hbn8irrc", - "2o9c3pxfvrzclud", - "btn09xkl7ab0n9k", - "ek2cb00tw4v4fav" - ], - "updated": "2024-12-27 00:55:25.917Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "dscn0010_xN987yGxE0.jpg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-30 17:41:00.152Z", - "description": "Hallo", - "id": "dci7qk44birm2bn", - "name": "Liste mit Oachkatzerl", - "public": true, - "trails": [ - "ovo0m6pxxjupfp9", - "yesm2tqc6jok8jq", - "z94vgei3jdc37k4" - ], - "updated": "2024-12-30 18:58:44.269Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - }, - { - "author": "3mugf953w4a9fg5", - "avatar": "caret_right_solid_iUtggzDoh7.svg", - "collectionId": "r6gu2ajyidy1x69", - "collectionName": "lists", - "created": "2024-12-13 12:46:49.620Z", - "description": "", - "id": "m59tuo2yyretv7z", - "name": "Flomp's List 2", - "public": false, - "trails": [ - "ovo0m6pxxjupfp9" - ], - "updated": "2024-12-27 00:55:21.456Z", - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - ] - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "x-400:Invalid sort/expand/filter": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Something went wrong while processing your request.", - "detail": { - "code": 400, - "message": "Something went wrong while processing your request.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "put": { - "summary": "create", - "deprecated": false, - "description": "Creates a trail.", - "operationId": "createTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request id. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name of the trail" - }, - "public": { - "type": "boolean", - "description": "Visible for everyone" - }, - "category": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "Category Id" - }, - "date": { - "type": "string", - "format": "date", - "description": "Date of the trail" - }, - "description": { - "type": "string", - "description": "Description of the trail" - }, - "difficulty": { - "type": "string", - "enum": [ - "easy", - "moderate", - "hard" - ], - "description": "Difficulty of the trail" - }, - "distance": { - "type": "number", - "description": "Distance in meters", - "minimum": 0 - }, - "duration": { - "type": "number", - "description": "Duration in seconds", - "minimum": 0 - }, - "elevation_gain": { - "type": "number", - "description": "Elevation gain in vertical meters", - "minimum": 0 - }, - "elevation_loss": { - "type": "number", - "description": "Elevation loss in vertical meters", - "minimum": 0 - }, - "lat": { - "type": "number", - "description": "Latitude of the starting point", - "minimum": -90, - "maximum": 90 - }, - "location": { - "type": "string", - "description": "Nearest city/village" - }, - "lon": { - "type": "number", - "description": "Longitude of the starting point", - "minimum": -180, - "maximum": 180 - }, - "thumbnail": { - "type": "integer", - "description": "Index of the photo that should be used as the thumbnail.", - "minimum": 0 - }, - "author": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "User Id" - } - }, - "required": [ - "name", - "public", - "author" - ] - }, - "example": { - "name": "at error minus", - "public": false, - "category": "l3q348pprel6opd", - "date": "2025-01-03T00:36:48.554Z", - "description": "Minima architecto maiores maiores architecto. Nobis aliquid magni magni ipsum. Itaque maxime mollitia. Laboriosam placeat ipsa omnis magni atque non.", - "difficulty": "moderate", - "distance": 46585640.67167308, - "duration": 8687485.195364153, - "elevation_gain": 4089694.238652264, - "elevation_loss": 12108588.345680581, - "lat": 86.60827022966254, - "location": "sunt", - "lon": 112.96378311445648, - "thumbnail": 0, - "author": "3mugf953w4a9fg5" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "l3q348pprel6opd", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2025-01-03 11:36:58.976Z", - "date": "2025-01-03 00:36:48.554Z", - "description": "Minima architecto maiores maiores architecto. Nobis aliquid magni magni ipsum. Itaque maxime mollitia. Laboriosam placeat ipsa omnis magni atque non.", - "difficulty": "moderate", - "distance": 46585640.67167308, - "duration": 8687485.195364153, - "elevation_gain": 4089694.238652264, - "elevation_loss": 12108588.345680581, - "gpx": "", - "id": "d9ba280yjycrk0k", - "lat": 86.60827022966254, - "location": "sunt", - "lon": 112.96378311445648, - "name": "at error minus", - "photos": [], - "public": false, - "summit_logs": [], - "thumbnail": 0, - "updated": "2025-01-03 11:36:58.976Z", - "waypoints": [] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "Failed to create record.", - "detail": { - "code": 400, - "message": "Failed to create record.", - "data": { - "author": { - "code": "validation_missing_rel_records", - "message": "Failed to find all relation records with the provided ids." - } - } - } - } - } - }, - "headers": {} - }, - "x-400:Invalid Params": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "validation": { - "type": "string" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "code", - "message", - "path" - ] - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "invalid_string", - "validation": "date", - "message": "Invalid date", - "path": [ - "date" - ] - }, - { - "code": "custom", - "message": "invalid-date", - "path": [ - "date" - ] - } - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail/{id}": { - "get": { - "summary": "show", - "deprecated": false, - "description": "Shows a single trail.", - "operationId": "showTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Trail Id", - "required": true, - "example": "95bb1d77c8dfa98", - "schema": { - "type": "string", - "minLength": 15, - "maxLength": 15 - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "example": "", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "integer" - }, - "elevation_gain": { - "type": "integer" - }, - "elevation_loss": { - "type": "integer" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - }, - "expand": { - "type": "object", - "properties": { - "author": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "bio": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "id": { - "type": "string" - }, - "private": { - "type": "boolean" - }, - "username": { - "type": "string" - } - }, - "required": [ - "avatar", - "bio", - "collectionId", - "collectionName", - "created", - "id", - "private", - "username" - ] - } - }, - "required": [ - "author" - ] - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints", - "expand" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "pbwx1lg2nmcih0w", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2024-12-30 18:57:35.453Z", - "date": "2024-12-30", - "description": "", - "difficulty": "moderate", - "distance": 5631.307320599051, - "duration": 0, - "elevation_gain": 76, - "elevation_loss": 76, - "gpx": "blob_0E0x721wan.gpx", - "id": "z94vgei3jdc37k4", - "lat": 47.385232, - "location": "", - "lon": 9.655863, - "name": "Die Pottsau", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_2SQmCCI6DV.jpg", - "caret_right_solid_9154Rrvk6B.svg" - ], - "public": false, - "summit_logs": [ - "95bb1d77c8dfa98" - ], - "thumbnail": 1, - "updated": "2024-12-30 18:59:56.924Z", - "waypoints": [ - "7f6d2a8c9d50136", - "60c2d435a5b66ed" - ], - "expand": { - "author": { - "avatar": "pexels_photo_2230444_WILu8cRHVb.jpg", - "bio": "ex aliqua velit deserunt ea exercitation do. Velit ullamco elit culpa eiusmod officia irure aute Lorem in ullamco labore ex. Officia ea qui in exercitation amet. Consequat laboris id duis enim Lorem dolore fugiat excepteur sunt. Sint consectetur duis tempor deserunt non. Ex amet sunt eu commodo.\n\nMollit labore cupidatat qui enim consectetur irure. Ea et reprehenderit ipsum adipisicing duis proident tempor esse excepteur dolor dolore anim consectetur aliqua. Laborum culpa eiusmod id ea consectetur do sit reprehenderit consequat voluptate mollit commodo. Ullamco aute ea minim enim et cupidatat ipsum cillum fugiat. Proident consectetur commodo Lorem do incididunt labore pariatur esse ea officia adipisicing. Do et sint culpa proident enim irure aliqua dolore magna. Laborum Lorem sunt amet occaecat occaecat mollit consectetur laborum ut.", - "collectionId": "xku110v5a5xbufa", - "collectionName": "users_anonymous", - "created": "2024-06-29 19:23:47.731Z", - "id": "3mugf953w4a9fg5", - "private": false, - "username": "Flomp" - } - } - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [] - }, - "post": { - "summary": "update", - "deprecated": false, - "description": "", - "operationId": "updateTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Trail Id", - "required": true, - "example": "", - "schema": { - "type": "string" - } - }, - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/json", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name of the trail" - }, - "category": { - "type": "string", - "minLength": 15, - "maxLength": 15, - "description": "Category Id" - }, - "date": { - "type": "string", - "format": "date", - "description": "Date of the trail" - }, - "description": { - "type": "string", - "description": "Description of the trail" - }, - "difficulty": { - "type": "string", - "enum": [ - "easy", - "moderate", - "hard" - ], - "description": "Difficulty of the trail" - }, - "distance": { - "type": "number", - "description": "Distance in meters", - "minimum": 0 - }, - "duration": { - "type": "number", - "description": "Duration in seconds", - "minimum": 0 - }, - "elevation_gain": { - "type": "number", - "description": "Elevation gain in vertical meters", - "minimum": 0 - }, - "elevation_loss": { - "type": "number", - "description": "Elevation loss in vertical meters", - "minimum": 0 - }, - "lat": { - "type": "number", - "description": "Latitude of the starting point", - "minimum": -90, - "maximum": 90 - }, - "location": { - "type": "string", - "description": "Nearest city/village" - }, - "lon": { - "type": "number", - "description": "Longitude of the starting point", - "minimum": -180, - "maximum": 180 - }, - "public": { - "type": "boolean", - "description": "Visible for everyone" - }, - "thumbnail": { - "type": "integer", - "description": "Index of the photo that should be used as the thumbnail.", - "minimum": 0 - } - } - }, - "example": { - "name": "inventore est laboriosam", - "category": "7sqwezntokmbvdr", - "date": "2025-01-03T07:14:55.803Z", - "description": "At dolor deleniti architecto nulla nemo in perspiciatis. Iste iusto ex quidem sed modi. Ipsam unde doloribus aut. Molestias ducimus molestias soluta.", - "difficulty": "easy", - "distance": 71499916.19683264, - "duration": 87771408.86514412, - "elevation_gain": 67291819.86293587, - "elevation_loss": 76718134.08675973, - "lat": 85.23610854378416, - "location": "ex laborum", - "lon": -48.60959423486602, - "public": true, - "thumbnail": 0 - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "7sqwezntokmbvdr", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2025-01-03 11:42:07.848Z", - "date": "2025-01-03 07:14:55.803Z", - "description": "At dolor deleniti architecto nulla nemo in perspiciatis. Iste iusto ex quidem sed modi. Ipsam unde doloribus aut. Molestias ducimus molestias soluta.", - "difficulty": "easy", - "distance": 71499916.19683264, - "duration": 87771408.86514412, - "elevation_gain": 67291819.86293587, - "elevation_loss": 76718134.08675973, - "gpx": "2021_11_14_564807964_dusseldorf_angermund_nach_ZpNsRB5SEW.Neuss-Hamm.gpx", - "id": "hfdmpa1n1ulyr64", - "lat": 85.23610854378416, - "location": "ex laborum", - "lon": -48.60959423486602, - "name": "inventore est laboriosam", - "photos": [], - "public": true, - "summit_logs": [ - "3pagejfjt1cz4vr" - ], - "thumbnail": 0, - "updated": "2025-01-03 11:48:41.963Z", - "waypoints": [] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - }, - "delete": { - "summary": "delete", - "deprecated": false, - "description": "Deletes a summit log.", - "operationId": "deleteTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Summit Log Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - }, - { - "name": "expand", - "in": "query", - "description": "Expand a foreign key column (https://pocketbase.io/docs/working-with-relations/#expanding-relations).", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "requestKey", - "in": "query", - "description": "Unique request key. Prevents auto cancel when sending multiple requests.", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "acknowledged": { - "type": "boolean" - } - }, - "required": [ - "acknowledged" - ] - }, - "example": { - "acknowledged": true - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail/upload": { - "put": { - "summary": "upload", - "deprecated": false, - "description": "Automatically creates a trail from the uploaded file. Tries to infer as much information as possible from the file's metadata.", - "operationId": "uploadTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "Content-Type", - "in": "header", - "description": "", - "required": true, - "example": "application/gpx+xml", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "file": { - "format": "binary", - "type": "string", - "description": "File containing GPS track data. Allowed file types: GPX, JSON, FIT, KML", - "example": "file:///Users/christianbeutel/Downloads/4_champex_to_le_chable.gpx" - }, - "name": { - "description": "File name", - "example": "", - "type": "string" - } - }, - "required": [ - "file" - ] - }, - "example": "/Users/christianbeutel/Downloads/2021-10-24_536064034_Essen-Mitte.nach.Bochum-Hauptbahnhof.gpx" - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2025-01-03 11:42:07.848Z", - "date": "2021-11-14 00:00:00.000Z", - "description": "", - "difficulty": "easy", - "distance": 24077.68400534589, - "duration": 297.01666666666665, - "elevation_gain": 40.10210099999998, - "elevation_loss": 45.42742099999999, - "gpx": "2021_11_14_564807964_dusseldorf_angermund_nach_ZpNsRB5SEW.Neuss-Hamm.gpx", - "id": "hfdmpa1n1ulyr64", - "lat": 51.33429, - "location": "", - "lon": 6.768533, - "name": "Düsseldorf-Angermund nach Neuss-Hamm", - "photos": [], - "public": false, - "summit_logs": [ - "3pagejfjt1cz4vr" - ], - "thumbnail": 0, - "updated": "2025-01-03 11:42:07.962Z", - "waypoints": [] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "status": { - "type": "integer" - }, - "response": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ] - }, - "isAbort": { - "type": "boolean" - }, - "originalError": { - "type": "object", - "properties": { - "status": { - "type": "integer" - }, - "response": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ] - } - }, - "required": [ - "status", - "response" - ] - }, - "name": { - "type": "string" - } - }, - "required": [ - "url", - "status", - "response", - "isAbort", - "originalError", - "name" - ] - }, - "example": { - "url": "", - "status": 400, - "response": { - "message": "Invalid file" - }, - "isAbort": false, - "originalError": { - "status": 400, - "response": { - "message": "Invalid file" - } - }, - "name": "ClientResponseError 400" - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - }, - "/trail/{id}/file": { - "post": { - "summary": "file", - "deprecated": false, - "description": "Uploads or removes photos, uploads GPS data file for a trail.", - "operationId": "fileTrail", - "tags": [ - "trail" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Trail Id", - "required": true, - "example": "4yql7587j64qdo5", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "photos": { - "format": "binary", - "type": "string", - "description": "List of image files to add. Allowed file types: PNG, JPG, WEBP, SVG", - "example": [ - "" - ] - }, - "photos-": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of file names to delete.", - "example": "" - }, - "gpx": { - "type": "string", - "format": "binary", - "minLength": 0, - "maxLength": 1, - "description": "File containing GPS track data. Allowed file types: GPX, JSON, FIT, KML", - "example": "file:///Users/christianbeutel/Downloads/2021-10-24_536064034_Essen-Mitte.nach.Bochum-Hauptbahnhof.gpx" - } - } - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "category": { - "type": "string" - }, - "collectionId": { - "type": "string" - }, - "collectionName": { - "type": "string" - }, - "created": { - "type": "string" - }, - "date": { - "type": "string" - }, - "description": { - "type": "string" - }, - "difficulty": { - "type": "string" - }, - "distance": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "elevation_gain": { - "type": "number" - }, - "elevation_loss": { - "type": "number" - }, - "gpx": { - "type": "string" - }, - "id": { - "type": "string" - }, - "lat": { - "type": "number" - }, - "location": { - "type": "string" - }, - "lon": { - "type": "number" - }, - "name": { - "type": "string" - }, - "photos": { - "type": "array", - "items": { - "type": "string" - } - }, - "public": { - "type": "boolean" - }, - "summit_logs": { - "type": "array", - "items": { - "type": "string" - } - }, - "thumbnail": { - "type": "integer" - }, - "updated": { - "type": "string" - }, - "waypoints": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "author", - "category", - "collectionId", - "collectionName", - "created", - "date", - "description", - "difficulty", - "distance", - "duration", - "elevation_gain", - "elevation_loss", - "gpx", - "id", - "lat", - "location", - "lon", - "name", - "photos", - "public", - "summit_logs", - "thumbnail", - "updated", - "waypoints" - ] - }, - "example": { - "author": "3mugf953w4a9fg5", - "category": "7sqwezntokmbvdr", - "collectionId": "e864strfxo14pm4", - "collectionName": "trails", - "created": "2025-01-03 11:42:07.848Z", - "date": "2025-01-03 07:14:55.803Z", - "description": "At dolor deleniti architecto nulla nemo in perspiciatis. Iste iusto ex quidem sed modi. Ipsam unde doloribus aut. Molestias ducimus molestias soluta.", - "difficulty": "easy", - "distance": 71499916.19683264, - "duration": 87771408.86514412, - "elevation_gain": 67291819.86293587, - "elevation_loss": 76718134.08675973, - "gpx": "4_champex_to_le_chable_h8sE0CwAes.gpx", - "id": "hfdmpa1n1ulyr64", - "lat": 85.23610854378416, - "location": "ex laborum", - "lon": -48.60959423486602, - "name": "inventore est laboriosam", - "photos": [ - "23xxesym0e9w18z2904frnpgy7_0h84aa22yv.jpg", - "23xxesym0e9w18z2904frnpgy7_7JhLWsRrsm.jpg" - ], - "public": true, - "summit_logs": [ - "3pagejfjt1cz4vr" - ], - "thumbnail": 0, - "updated": "2025-01-03 12:08:43.037Z", - "waypoints": [] - } - } - }, - "headers": {} - }, - "400": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "minimum": { - "type": "integer" - }, - "type": { - "type": "string" - }, - "inclusive": { - "type": "boolean" - }, - "exact": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "message", - "details" - ] - }, - "example": { - "message": "invalid_params", - "details": [ - { - "code": "too_small", - "minimum": 15, - "type": "string", - "inclusive": true, - "exact": true, - "message": "String must contain exactly 15 character(s)", - "path": [ - "id" - ] - } - ] - } - } - }, - "headers": {} - }, - "404": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "detail": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "data": { - "type": "object", - "properties": {} - } - }, - "required": [ - "code", - "message", - "data" - ] - } - }, - "required": [ - "message", - "detail" - ] - }, - "example": { - "message": "The requested resource wasn't found.", - "detail": { - "code": 404, - "message": "The requested resource wasn't found.", - "data": {} - } - } - } - }, - "headers": {} - } - }, - "security": [ - { - "apikey-header-pb_auth": [] - } - ] - } - } - }, - "components": { - "schemas": {}, - "securitySchemes": { - "apikey-header-pb_auth": { - "type": "apiKey", - "in": "header", - "name": "pb_auth" - } - } - }, - "servers": [], - "security": [ - { - "apikey-header-pb_auth": [] - } - ] -} \ No newline at end of file diff --git a/web/vite.config.ts b/web/vite.config.ts index 91ed557e..a9908e30 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,10 +1,22 @@ import tailwindcss from '@tailwindcss/vite'; import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vitest/config'; +import openapiPlugin from 'sveltekit-openapi-generator'; import fs from 'fs'; +const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf-8')); + export default defineConfig({ - plugins: [tailwindcss(), sveltekit()], + plugins: [openapiPlugin({ + info: { + title: 'Wanderer API', + version: `${packageJson.version}`, + description: 'API documentation for wanderer backend', + }, + outputPath: 'static/docs/api/wanderer.openapi.json', + include: ['src/routes/api/v1/**/*.{js,ts}'], + baseSchemasPath: 'src/lib/models/api/openapi_schemas.ts', + }),tailwindcss(), sveltekit()], test: { include: ['src/**/*.{test,spec}.{js,ts}'] }, ssr: { noExternal: ['three'] }, ...(process.env.WANDERER_ENV == "dev" ? {