Download OpenAPI specification:
Fishing forum API (modular monolith, Clean Architecture).
| username required | string (Username) [ 3 .. 50 ] characters ^[a-zA-Z0-9_]+$ |
| email required | string <email> (Email) |
| password required | string (Password) [ 8 .. 128 ] characters |
{- "username": "string",
- "email": "user@example.com",
- "password": "stringst"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "email": "string",
- "is_active": true,
- "roles": [
- "string"
], - "permissions": [
- "string"
]
}| login required | string (Login) [ 1 .. 255 ] characters |
| password required | string (Password) [ 1 .. 128 ] characters |
{- "login": "string",
- "password": "string"
}{- "access_token": "string",
- "refresh_token": "string",
- "token_type": "bearer",
- "expires_in": 0
}Lightweight projection — phase-6 will turn this into a cursor-paginated view.
| limit | integer (Limit) [ 1 .. 200 ] Default: 50 |
| offset | integer (Offset) >= 0 Default: 0 |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "email": "string",
- "is_active": true,
- "roles": [
- "string"
], - "permissions": [
- "string"
]
}
]| user_id required | string <uuid> (User Id) |
| role required | string (Role) [ 1 .. 50 ] characters |
{- "role": "string"
}{- "detail": [
- {
- "loc": [
- "string"
], - "msg": "string",
- "type": "string",
- "input": null,
- "ctx": { }
}
]
}| user_id required | string <uuid> (User Id) |
| permission required | string (Permission) [ 1 .. 100 ] characters |
| granted | boolean (Granted) Default: true true => override grants the permission; false => override denies it (deny wins). |
{- "permission": "string",
- "granted": true
}{- "detail": [
- {
- "loc": [
- "string"
], - "msg": "string",
- "type": "string",
- "input": null,
- "ctx": { }
}
]
}| user_id required | string <uuid> (User Id) |
| blocked required | boolean (Blocked) |
{- "blocked": true
}{- "detail": [
- {
- "loc": [
- "string"
], - "msg": "string",
- "type": "string",
- "input": null,
- "ctx": { }
}
]
}Cursor (string) or Cursor (null) (Cursor) | |
| limit | integer (Limit) [ 1 .. 100 ] Default: 20 |
Category Id (string) or Category Id (null) (Category Id) | |
Tag (string) or Tag (null) (Tag) | |
Author Id (string) or Author Id (null) (Author Id) |
{- "items": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "slug": "string",
- "content": "string",
- "content_format": "string",
- "author": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "username": "string"
}, - "category": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "name": "string",
- "slug": "string"
}, - "tags": [
- {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "name": "string",
- "slug": "string"
}
], - "is_deleted": true,
- "comment_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "next_cursor": "string"
}| title required | string (Title) [ 3 .. 200 ] characters |
| content required | string (Content) non-empty |
| content_format | string (Content Format) ^(plain|markdown)$ Default: "markdown" |
Category Id (string) or Category Id (null) (Category Id) | |
| tags | Array of strings (Tags) <= 10 items |
{- "title": "string",
- "content": "string",
- "content_format": "markdown",
- "category_id": "8de4c9fd-61a4-4c0b-bf88-0ed3a0fe3fa2",
- "tags": [
- "string"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "slug": "string",
- "content": "string",
- "content_format": "string",
- "author": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "username": "string"
}, - "category": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "name": "string",
- "slug": "string"
}, - "tags": [
- {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "name": "string",
- "slug": "string"
}
], - "is_deleted": true,
- "comment_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "slug": "string",
- "content": "string",
- "content_format": "string",
- "author": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "username": "string"
}, - "category": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "name": "string",
- "slug": "string"
}, - "tags": [
- {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "name": "string",
- "slug": "string"
}
], - "is_deleted": true,
- "comment_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| post_id required | string <uuid> (Post Id) |
Title (string) or Title (null) (Title) | |
Content (string) or Content (null) (Content) | |
Content Format (string) or Content Format (null) (Content Format) | |
Category Id (string) or Category Id (null) (Category Id) | |
Array of Tags (strings) or Tags (null) (Tags) |
{- "title": "string",
- "content": "string",
- "content_format": "string",
- "category_id": "8de4c9fd-61a4-4c0b-bf88-0ed3a0fe3fa2",
- "tags": [
- "string"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "slug": "string",
- "content": "string",
- "content_format": "string",
- "author": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "username": "string"
}, - "category": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "name": "string",
- "slug": "string"
}, - "tags": [
- {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "name": "string",
- "slug": "string"
}
], - "is_deleted": true,
- "comment_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| post_id required | string <uuid> (Post Id) UUID of the post to fetch comments for |
{- "items": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "post_id": "dd3504b4-6e8d-47e2-aab1-573a0c9d6149",
- "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
- "depth": 0,
- "path": "string",
- "content": "string",
- "content_format": "string",
- "is_deleted": true,
- "author": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "username": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}| post_id required | string <uuid> (Post Id) |
| content required | string (Content) non-empty |
| content_format | string (Content Format) ^(plain|markdown)$ Default: "markdown" |
Parent Id (string) or Parent Id (null) (Parent Id) |
{- "post_id": "dd3504b4-6e8d-47e2-aab1-573a0c9d6149",
- "content": "string",
- "content_format": "markdown",
- "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "post_id": "dd3504b4-6e8d-47e2-aab1-573a0c9d6149",
- "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
- "depth": 0,
- "path": "string",
- "content": "string",
- "content_format": "string",
- "is_deleted": true,
- "author": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "username": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| comment_id required | string <uuid> (Comment Id) |
| content required | string (Content) non-empty |
Content Format (string) or Content Format (null) (Content Format) |
{- "content": "string",
- "content_format": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "post_id": "dd3504b4-6e8d-47e2-aab1-573a0c9d6149",
- "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
- "depth": 0,
- "path": "string",
- "content": "string",
- "content_format": "string",
- "is_deleted": true,
- "author": {
- "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
- "username": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| name required | string (Name) [ 1 .. 100 ] characters |
Slug (string) or Slug (null) (Slug) | |
Description (string) or Description (null) (Description) |
{- "name": "string",
- "slug": "string",
- "description": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "slug": "string",
- "description": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05"
}| original_name required | string (Original Name) [ 1 .. 255 ] characters |
| content_type required | string (Content Type) [ 3 .. 150 ] characters |
| size_bytes required | integer (Size Bytes) > 0 |
{- "original_name": "string",
- "content_type": "string",
- "size_bytes": 0
}{- "file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767",
- "storage_key": "string",
- "upload_url": "string",
- "method": "string",
- "expires_in_seconds": 0,
- "max_size_bytes": 0
}| file_id required | string <uuid> (File Id) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}| file required | string <application/octet-stream> (File) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}| limit | integer (Limit) [ 1 .. 100 ] Default: 20 |
| offset | integer (Offset) >= 0 Default: 0 |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}
]| file_id required | string <uuid> (File Id) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}| file_id required | string <uuid> (File Id) |
| download | boolean (Download) Default: false |
Variant (string) or Variant (null) (Variant) |
null| post_id required | string <uuid> (Post Id) |
| file_ids required | Array of strings <uuid> (File Ids) [ 1 .. 20 ] items [ items <uuid > ] |
{- "file_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}
][- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}
]| comment_id required | string <uuid> (Comment Id) |
| file_ids required | Array of strings <uuid> (File Ids) [ 1 .. 20 ] items [ items <uuid > ] |
{- "file_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}
]| comment_id required | string <uuid> (Comment Id) |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}
]| file required | string <application/octet-stream> (File) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}| category_id required | string <uuid> (Category Id) |
| file required | string <application/octet-stream> (File) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}| post_id required | string <uuid> (Post Id) |
| file required | string <application/octet-stream> (File) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "original_name": "string",
- "content_type": "string",
- "kind": "string",
- "size_bytes": 0,
- "sha256": "string",
- "status": "string",
- "owner_type": "string",
- "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
- "width": 0,
- "height": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "url": "string",
- "download_url": "string",
- "variants": {
- "property1": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}, - "property2": {
- "name": "string",
- "url": "string",
- "width": 0,
- "height": 0,
- "size_bytes": 0
}
}
}Thread with the most likes (optionally within a category).
The path is deliberately not under /posts/... to avoid colliding with
the content module's GET /posts/{id} route.
Category Id (string) or Category Id (null) (Category Id) |
{- "post_id": "dd3504b4-6e8d-47e2-aab1-573a0c9d6149",
- "likes": 0
}