{ "swagger": "2.0", "info": { "description": "An Anonymous BBS \\n Note: PUT methods are used to PARTLY update, and we don't use PATCH method.", "title": "Open Tree Hole", "contact": { "name": "Maintainer Ke Chen", "email": "dev@danta.tech" }, "license": { "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "version": "2.1.0" }, "basePath": "/api", "paths": { "/": { "get": { "produces": [ "application/json" ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/config/search": { "post": { "produces": [ "application/json" ], "tags": [ "Search" ], "summary": "change search config", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/floor.SearchConfigModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Map" } } } } }, "/divisions": { "get": { "produces": [ "application/json" ], "tags": [ "Division" ], "summary": "List All Divisions", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Division" } } } } }, "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Division" ], "summary": "Add A Division", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/division.CreateModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Division" } }, "201": { "description": "Created", "schema": { "$ref": "#/definitions/models.Division" } } } } }, "/divisions/{division_id}/holes": { "get": { "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "List Holes In A Division", "parameters": [ { "type": "integer", "description": "division_id", "name": "division_id", "in": "path", "required": true }, { "type": "string", "description": "updated time \u003c offset (default is now)", "name": "offset", "in": "query" }, { "type": "string", "name": "order", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "size", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "post": { "description": "Create a hole, create tags and floor binding to it and set the name mapping", "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "Create A Hole", "parameters": [ { "type": "integer", "description": "division id", "name": "division_id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/hole.CreateModel" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/models.Hole" } } } } }, "/divisions/{division_id}/holes/_sfw": { "get": { "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "List SFW Holes In A Division", "parameters": [ { "type": "integer", "description": "division_id", "name": "division_id", "in": "path", "required": true }, { "type": "string", "description": "updated time \u003c offset (default is now)", "name": "offset", "in": "query" }, { "type": "string", "name": "order", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "size", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/divisions/{id}": { "get": { "produces": [ "application/json" ], "tags": [ "Division" ], "summary": "Get Division", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Division" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "put": { "produces": [ "application/json" ], "tags": [ "Division" ], "summary": "Modify A Division", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/division.ModifyDivisionModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Division" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "delete": { "description": "Delete a division and move all of its holes to another given division", "produces": [ "application/json" ], "tags": [ "Division" ], "summary": "Delete A Division", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/division.DeleteModel" } } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/divisions/{id}/_webvpn": { "patch": { "produces": [ "application/json" ], "tags": [ "Division" ], "summary": "Modify A Division", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/division.ModifyDivisionModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Division" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors": { "get": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Old API for Listing Floors", "deprecated": true, "parameters": [ { "type": "integer", "name": "hole_id", "in": "query" }, { "maximum": 50, "minimum": 0, "type": "integer", "name": "length", "in": "query" }, { "type": "string", "name": "s", "in": "query" }, { "type": "integer", "name": "start_floor", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Floor" } } } } }, "post": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Old API for Creating A Floor", "deprecated": true, "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/floor.CreateOldModel" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/floor.CreateOldResponse" } } } } }, "/floors/_sensitive": { "get": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "List sensitive floors, admin only", "parameters": [ { "type": "boolean", "name": "all", "in": "query" }, { "type": "string", "name": "offset", "in": "query" }, { "type": "boolean", "name": "open", "in": "query" }, { "enum": [ "time_created", "time_updated" ], "type": "string", "default": "time_created", "name": "order_by", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "size", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/floor.SensitiveFloorResponse" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors/search": { "get": { "produces": [ "application/json" ], "tags": [ "Search" ], "summary": "SearchFloors In ElasticSearch", "parameters": [ { "type": "boolean", "default": false, "description": "Accurate is used to determine whether to use accurate search", "name": "accurate", "in": "query" }, { "type": "integer", "name": "end_time", "in": "query" }, { "minimum": 0, "type": "integer", "default": 0, "name": "offset", "in": "query" }, { "type": "string", "name": "search", "in": "query", "required": true }, { "minimum": 0, "type": "integer", "default": 10, "name": "size", "in": "query" }, { "type": "integer", "description": "StartTime and EndTime are used to filter floors by time\nBoth are Unix timestamps, and are optional", "name": "start_time", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Floor" } } } } }, "post": { "produces": [ "application/json" ], "tags": [ "Search" ], "summary": "SearchFloors In ElasticSearch", "parameters": [ { "type": "boolean", "default": false, "description": "Accurate is used to determine whether to use accurate search", "name": "accurate", "in": "query" }, { "type": "integer", "name": "end_time", "in": "query" }, { "minimum": 0, "type": "integer", "default": 0, "name": "offset", "in": "query" }, { "type": "string", "name": "search", "in": "query", "required": true }, { "minimum": 0, "type": "integer", "default": 10, "name": "size", "in": "query" }, { "type": "integer", "description": "StartTime and EndTime are used to filter floors by time\nBoth are Unix timestamps, and are optional", "name": "start_time", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Floor" } } } } } }, "/floors/{id}": { "get": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Get A Floor", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Floor" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "put": { "description": "when both \"fold_v2\" and \"fold\" are empty, reset fold; else, \"fold_v2\" has the priority", "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Modify A Floor", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/floor.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Floor" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "delete": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Delete A Floor", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/floor.DeleteModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Floor" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors/{id}/_sensitive": { "put": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Modify A Floor's actual_sensitive, admin only", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/floor.ModifySensitiveFloorRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Floor" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors/{id}/_sensitive/_webvpn": { "patch": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Modify A Floor's actual_sensitive, admin only", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/floor.ModifySensitiveFloorRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Floor" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors/{id}/_webvpn": { "patch": { "description": "when both \"fold_v2\" and \"fold\" are empty, reset fold; else, \"fold_v2\" has the priority", "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Modify A Floor", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/floor.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Floor" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors/{id}/history": { "get": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Get A Floor's History, admin only", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.FloorHistory" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors/{id}/like/{like}": { "post": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Modify A Floor's like", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "type": "integer", "description": "1 is like, 0 is reset, -1 is dislike", "name": "like", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Floor" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors/{id}/punishment": { "get": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Get A Floor's Punishment History, admin only", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors/{id}/restore/{floor_history_id}": { "post": { "description": "Restore A Floor From A History Version", "tags": [ "Floor" ], "summary": "Restore A Floor, admin only", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "type": "integer", "description": "floor_history_id", "name": "floor_history_id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/floor.RestoreModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Floor" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/floors/{id}/user_silence": { "get": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Get A User's Silence Status According To FloorID, admin only", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "{'1': '2024-05-01T14:42:31.722026326+08:00'}", "schema": { "$ref": "#/definitions/floor.BanDivision" } }, "403": { "description": "Forbidden", "schema": { "$ref": "#/definitions/common.HttpError" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.HttpError" } } } } }, "/holes": { "get": { "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "API for Listing Holes", "parameters": [ { "type": "string", "name": "created_end", "in": "query" }, { "type": "string", "name": "created_start", "in": "query" }, { "type": "integer", "name": "division_id", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "length", "in": "query" }, { "type": "string", "name": "offset", "in": "query" }, { "type": "string", "name": "order", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "size", "in": "query" }, { "type": "string", "name": "start_time", "in": "query" }, { "type": "string", "name": "tag", "in": "query" }, { "type": "array", "items": { "type": "string" }, "collectionFormat": "csv", "name": "tags", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } } } }, "post": { "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "Old API for Creating A Hole", "deprecated": true, "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/hole.CreateOldModel" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/hole.CreateOldResponse" } } } } }, "/holes/_good": { "get": { "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "List good holes", "parameters": [ { "type": "string", "description": "updated time \u003c offset (default is now)", "name": "offset", "in": "query" }, { "type": "string", "name": "order", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "size", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } } } } }, "/holes/_homepage": { "get": { "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "List Holes In Home Page", "parameters": [ { "type": "array", "items": { "type": "integer" }, "collectionFormat": "csv", "description": "default is all", "name": "exclude_division_ids", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "length", "in": "query" }, { "type": "string", "name": "offset", "in": "query" }, { "type": "string", "name": "order", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "size", "in": "query" }, { "type": "string", "description": "updated time \u003c offset (default is now)", "name": "start_time", "in": "query" }, { "type": "array", "items": { "type": "string" }, "collectionFormat": "csv", "name": "tags", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/holes/{hole_id}/floors": { "get": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "List Floors In A Hole", "parameters": [ { "type": "integer", "description": "hole id", "name": "hole_id", "in": "path", "required": true }, { "minimum": 0, "type": "integer", "default": 0, "name": "offset", "in": "query" }, { "enum": [ "id", "like" ], "type": "string", "default": "id", "description": "SQL ORDER BY field", "name": "order_by", "in": "query" }, { "minimum": 0, "type": "integer", "default": 30, "name": "size", "in": "query" }, { "enum": [ "asc", "desc" ], "type": "string", "default": "asc", "description": "Sort order", "name": "sort", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Floor" } } } } }, "post": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "Create A Floor", "parameters": [ { "type": "integer", "description": "hole id", "name": "hole_id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/floor.CreateModel" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/models.Floor" } } } } }, "/holes/{id}": { "get": { "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "Get A Hole", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Hole" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "put": { "description": "Modify a hole, modify tags and set the name mapping\nOnly admin can modify division, tags, hidden, lock\n`unhidden` take effect only when hole is hidden and set to true", "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "Modify A Hole", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/hole.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Hole" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "delete": { "description": "Hide a hole, but visible to admins. This may affect many floors, DO NOT ABUSE!!!", "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "Delete A Hole", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "patch": { "description": "Add hole.view", "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "Patch A Hole", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/holes/{id}/_force": { "delete": { "description": "Delete a hole, admin only", "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "Delete A Hole", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/models.MessageModel" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/holes/{id}/_webvpn": { "patch": { "description": "Modify a hole, modify tags and set the name mapping\nOnly admin can modify division, tags, hidden, lock\n`unhidden` take effect only when hole is hidden and set to true", "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "Modify A Hole", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/hole.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Hole" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/messages": { "get": { "produces": [ "application/json" ], "tags": [ "Message" ], "summary": "List Messages of a User", "parameters": [ { "type": "boolean", "default": false, "name": "not_read", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Message" } } } } }, "put": { "produces": [ "application/json" ], "tags": [ "Message" ], "summary": "Clear Messages Deprecated", "responses": { "204": { "description": "No Content" } } }, "post": { "description": "Send to multiple recipients and save to db, admin only.", "produces": [ "application/json" ], "tags": [ "Message" ], "summary": "Send a Mail", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/message.CreateModel" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/models.Message" } } } } }, "/messages/_webvpn": { "patch": { "produces": [ "application/json" ], "tags": [ "Message" ], "summary": "Clear Messages Deprecated", "responses": { "204": { "description": "No Content" } } } }, "/messages/clear": { "post": { "produces": [ "application/json" ], "tags": [ "Message" ], "summary": "Clear Messages of a User", "responses": { "204": { "description": "No Content" } } } }, "/messages/{id}": { "delete": { "produces": [ "application/json" ], "tags": [ "Message" ], "summary": "Delete a message of a user", "parameters": [ { "type": "integer", "description": "message id", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" } } } }, "/penalty/{floor_id}": { "post": { "produces": [ "application/json" ], "tags": [ "Penalty" ], "summary": "Ban publisher of a floor", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/penalty.PostBody" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/models.User" } } } } }, "/penalty/{floor_id}/_forever": { "post": { "produces": [ "application/json" ], "tags": [ "Penalty" ], "summary": "Ban publisher of a floor forever", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/penalty.ForeverPostBody" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/models.User" } } } } }, "/reports": { "get": { "produces": [ "application/json" ], "tags": [ "Report" ], "summary": "List All Reports", "parameters": [ { "minimum": 0, "type": "integer", "default": 0, "name": "offset", "in": "query" }, { "enum": [ "id" ], "type": "string", "default": "id", "name": "order_by", "in": "query" }, { "enum": [ 0, 1, 2 ], "type": "integer", "x-enum-varnames": [ "RangeNotDealt", "RangeDealt", "RangeAll" ], "description": "Range, 0: not dealt, 1: dealt, 2: all", "name": "range", "in": "query" }, { "maximum": 50, "minimum": 0, "type": "integer", "default": 30, "name": "size", "in": "query" }, { "enum": [ "asc", "desc" ], "type": "string", "default": "desc", "description": "Sort order, default is desc", "name": "sort", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Report" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "post": { "description": "Add a report and send notification to admins", "produces": [ "application/json" ], "tags": [ "Report" ], "summary": "Add a report", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/report.AddModel" } } ], "responses": { "204": { "description": "No Content" }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.HttpError" } } } } }, "/reports/ban/{id}": { "post": { "produces": [ "application/json" ], "tags": [ "Report" ], "summary": "Ban reporter of a report", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/report.banBody" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/models.User" } } } } }, "/reports/{id}": { "get": { "produces": [ "application/json" ], "tags": [ "Report" ], "summary": "Get A Report", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Report" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "delete": { "description": "Mark a report as \"dealt\" and send notification to reporter", "produces": [ "application/json" ], "tags": [ "Report" ], "summary": "Deal a report", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/report.DeleteModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Report" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.HttpError" } } } } }, "/tags": { "get": { "produces": [ "application/json" ], "tags": [ "Tag" ], "summary": "List All Tags", "parameters": [ { "maxLength": 32, "type": "string", "description": "search tag by name", "name": "s", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Tag" } } } } }, "post": { "produces": [ "application/json" ], "tags": [ "Tag" ], "summary": "Create A Tag", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/tag.CreateModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Tag" } }, "201": { "description": "Created", "schema": { "$ref": "#/definitions/models.Tag" } } } } }, "/tags/{id}": { "get": { "produces": [ "application/json" ], "tags": [ "Tag" ], "summary": "Get A Tag", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Tag" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "put": { "produces": [ "application/json" ], "tags": [ "Tag" ], "summary": "Modify A Tag, admin only", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/tag.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Tag" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } }, "delete": { "description": "Delete a tag and link all of its holes to another given tag", "produces": [ "application/json" ], "tags": [ "Tag" ], "summary": "Delete A Tag", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/tag.DeleteModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Tag" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/tags/{id}/_webvpn": { "patch": { "produces": [ "application/json" ], "tags": [ "Tag" ], "summary": "Modify A Tag, admin only", "parameters": [ { "type": "integer", "description": "id", "name": "id", "in": "path", "required": true }, { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/tag.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Tag" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/tags/{tag_name}/holes": { "get": { "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "List Holes By Tag", "parameters": [ { "type": "string", "description": "tag_name", "name": "tag_name", "in": "path", "required": true }, { "type": "string", "description": "updated time \u003c offset (default is now)", "name": "offset", "in": "query" }, { "type": "string", "name": "order", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "size", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/user/favorite_groups": { "get": { "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "List User's Favorite Groups", "parameters": [ { "enum": [ "id", "time_created", "time_updated" ], "type": "string", "default": "time_created", "name": "order", "in": "query" }, { "type": "boolean", "default": false, "name": "plain", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.FavoriteGroup" } } } } }, "put": { "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "Modify User's Favorite Group", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/favourite.ModifyFavoriteGroupModel" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.FavoriteGroup" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.HttpError" } } } }, "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "Add A Favorite Group", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/favourite.AddFavoriteGroupModel" } } ], "responses": { "201": { "description": "Created", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.FavoriteGroup" } } } } }, "delete": { "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "Delete A Favorite Group", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/favourite.DeleteFavoriteGroupModel" } } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.HttpError" } } } } }, "/user/favorite_groups/_webvpn": { "patch": { "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "Modify User's Favorite Group", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/favourite.ModifyFavoriteGroupModel" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.FavoriteGroup" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.HttpError" } } } } }, "/user/favorites": { "get": { "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "List User's Favorites", "parameters": [ { "type": "integer", "name": "favorite_group_id", "in": "query" }, { "enum": [ "id", "time_created", "hole_time_updated" ], "type": "string", "default": "time_created", "name": "order", "in": "query" }, { "type": "boolean", "default": false, "name": "plain", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } } } }, "put": { "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "Modify User's Favorites", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/favourite.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/favourite.Response" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/favourite.Response" } } } }, "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "Add A Favorite", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/favourite.AddModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/favourite.Response" } }, "201": { "description": "Created", "schema": { "$ref": "#/definitions/favourite.Response" } } } }, "delete": { "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "Delete A Favorite", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/favourite.DeleteModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/favourite.Response" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/favourite.Response" } } } } }, "/user/favorites/_webvpn": { "patch": { "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "Modify User's Favorites", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/favourite.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/favourite.Response" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/favourite.Response" } } } } }, "/user/favorites/move": { "put": { "produces": [ "application/json" ], "tags": [ "Favorite" ], "summary": "Move User's Favorite", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/favourite.MoveModel" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/favourite.Response" } } } } }, "/users/me": { "get": { "produces": [ "application/json" ], "tags": [ "user" ], "summary": "get current user", "deprecated": true, "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.User" } } } }, "put": { "produces": [ "application/json" ], "tags": [ "User" ], "summary": "modify current user profiles", "parameters": [ { "description": "modify user", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/user.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.User" } } } } }, "/users/me/_webvpn": { "patch": { "produces": [ "application/json" ], "tags": [ "User" ], "summary": "modify current user profiles", "parameters": [ { "description": "modify user", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/user.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.User" } } } } }, "/users/me/floors": { "get": { "produces": [ "application/json" ], "tags": [ "Floor" ], "summary": "List User's Reply Floors", "parameters": [ { "minimum": 0, "type": "integer", "default": 0, "name": "offset", "in": "query" }, { "enum": [ "id", "like" ], "type": "string", "default": "id", "description": "SQL ORDER BY field", "name": "order_by", "in": "query" }, { "minimum": 0, "type": "integer", "default": 30, "name": "size", "in": "query" }, { "enum": [ "asc", "desc" ], "type": "string", "default": "asc", "description": "Sort order", "name": "sort", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Floor" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/models.MessageModel" } } } } }, "/users/me/holes": { "get": { "produces": [ "application/json" ], "tags": [ "Hole" ], "summary": "List a Hole Created By User", "parameters": [ { "type": "string", "description": "updated time \u003c offset (default is now)", "name": "offset", "in": "query" }, { "type": "string", "name": "order", "in": "query" }, { "maximum": 10, "type": "integer", "default": 10, "name": "size", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } } } } }, "/users/me/punishments": { "get": { "produces": [ "application/json" ], "tags": [ "Penalty" ], "summary": "List my punishments", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Punishment" } } } } } }, "/users/subscription": { "delete": { "produces": [ "application/json" ], "tags": [ "Subscription" ], "summary": "Delete A Subscription", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/subscription.DeleteModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/subscription.Response" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/subscription.Response" } } } } }, "/users/subscriptions": { "get": { "produces": [ "application/json" ], "tags": [ "Subscription" ], "summary": "List User's Subscriptions", "parameters": [ { "type": "boolean", "default": false, "name": "plain", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Hole" } } } } }, "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Subscription" ], "summary": "Add A Subscription", "parameters": [ { "description": "json", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/subscription.AddModel" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/subscription.Response" } } } } }, "/users/{id}/punishments": { "get": { "produces": [ "application/json" ], "tags": [ "Penalty" ], "summary": "List punishments by user id", "parameters": [ { "type": "integer", "description": "User ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Punishment" } } } } } }, "/users/{user_id}": { "get": { "produces": [ "application/json" ], "tags": [ "user" ], "summary": "get user by id, owner or admin", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.User" } } } }, "put": { "produces": [ "application/json" ], "tags": [ "User" ], "summary": "modify user profiles", "parameters": [ { "type": "integer", "description": "user id", "name": "user_id", "in": "path", "required": true }, { "description": "modify user", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/user.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.User" } } } } }, "/users/{user_id}/_webvpn": { "patch": { "produces": [ "application/json" ], "tags": [ "User" ], "summary": "modify user profiles", "parameters": [ { "type": "integer", "description": "user id", "name": "user_id", "in": "path", "required": true }, { "description": "modify user", "name": "json", "in": "body", "required": true, "schema": { "$ref": "#/definitions/user.ModifyModel" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.User" } } } } } }, "definitions": { "common.ErrorDetailElement": { "type": "object", "properties": { "field": { "type": "string" }, "message": { "type": "string" }, "param": { "type": "string" }, "struct_field": { "type": "string" }, "tag": { "type": "string" }, "value": {} } }, "common.HttpError": { "type": "object", "properties": { "code": { "type": "integer" }, "detail": { "type": "array", "items": { "$ref": "#/definitions/common.ErrorDetailElement" } }, "message": { "type": "string" } } }, "division.CreateModel": { "type": "object", "properties": { "description": { "type": "string" }, "name": { "type": "string" } } }, "division.DeleteModel": { "type": "object", "properties": { "to": { "description": "Admin only\nID of the target division that all the deleted division's holes will be moved to", "type": "integer", "default": 1 } } }, "division.ModifyDivisionModel": { "type": "object", "properties": { "description": { "type": "string" }, "name": { "type": "string" }, "pinned": { "type": "array", "items": { "type": "integer" } } } }, "favourite.AddFavoriteGroupModel": { "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "maxLength": 64 } } }, "favourite.AddModel": { "type": "object", "properties": { "favorite_group_id": { "type": "integer", "default": 0 }, "hole_id": { "type": "integer" } } }, "favourite.DeleteFavoriteGroupModel": { "type": "object", "required": [ "favorite_group_id" ], "properties": { "favorite_group_id": { "type": "integer" } } }, "favourite.DeleteModel": { "type": "object", "properties": { "favorite_group_id": { "type": "integer", "default": 0 }, "hole_id": { "type": "integer" } } }, "favourite.ModifyFavoriteGroupModel": { "type": "object", "required": [ "favorite_group_id", "name" ], "properties": { "favorite_group_id": { "type": "integer" }, "name": { "type": "string", "maxLength": 64 } } }, "favourite.ModifyModel": { "type": "object", "properties": { "favorite_group_id": { "type": "integer", "default": 0 }, "hole_ids": { "type": "array", "items": { "type": "integer" } } } }, "favourite.MoveModel": { "type": "object", "required": [ "from_favorite_group_id", "to_favorite_group_id" ], "properties": { "from_favorite_group_id": { "type": "integer", "default": 0 }, "hole_ids": { "type": "array", "items": { "type": "integer" } }, "to_favorite_group_id": { "type": "integer" } } }, "favourite.Response": { "type": "object", "properties": { "data": { "type": "array", "items": { "type": "integer" } }, "message": { "type": "string" } } }, "floor.BanDivision": { "type": "object", "additionalProperties": { "type": "string" } }, "floor.CreateModel": { "type": "object", "required": [ "content" ], "properties": { "content": { "type": "string" }, "reply_to": { "description": "id of the floor to which replied", "type": "integer", "minimum": 0 }, "special_tag": { "description": "Admin and Operator only", "type": "string", "maxLength": 16 } } }, "floor.CreateOldModel": { "type": "object", "required": [ "content" ], "properties": { "content": { "type": "string" }, "hole_id": { "type": "integer", "minimum": 1 }, "reply_to": { "description": "id of the floor to which replied", "type": "integer", "minimum": 0 }, "special_tag": { "description": "Admin and Operator only", "type": "string", "maxLength": 16 } } }, "floor.CreateOldResponse": { "type": "object", "properties": { "data": { "$ref": "#/definitions/models.Floor" }, "message": { "type": "string" } } }, "floor.DeleteModel": { "type": "object", "properties": { "delete_reason": { "type": "string", "maxLength": 32 } } }, "floor.ModifyModel": { "type": "object", "properties": { "content": { "description": "Owner or admin, the original content should be moved to floor_history", "type": "string" }, "fold": { "description": "仅管理员,留空则重置,低优先级", "type": "array", "items": { "type": "string" } }, "fold_v2": { "description": "仅管理员,留空则重置,高优先级", "type": "string", "maxLength": 64 }, "like": { "description": "All user, deprecated, \"add\" is like, \"cancel\" is reset", "type": "string", "enum": [ "add", "cancel" ] }, "special_tag": { "description": "Admin and Operator only", "type": "string", "maxLength": 16 } } }, "floor.ModifySensitiveFloorRequest": { "type": "object", "properties": { "is_actual_sensitive": { "type": "boolean" } } }, "floor.RestoreModel": { "type": "object", "required": [ "restore_reason" ], "properties": { "restore_reason": { "type": "string", "maxLength": 32 } } }, "floor.SearchConfigModel": { "type": "object", "properties": { "open": { "type": "boolean" } } }, "floor.SensitiveFloorResponse": { "type": "object", "properties": { "content": { "type": "string" }, "deleted": { "type": "boolean" }, "hole_id": { "type": "integer" }, "id": { "type": "integer" }, "is_actual_sensitive": { "type": "boolean" }, "modified": { "type": "integer" }, "sensitive_detail": { "type": "string" }, "time_created": { "type": "string" }, "time_updated": { "type": "string" } } }, "gorm.DeletedAt": { "type": "object", "properties": { "time": { "type": "string" }, "valid": { "description": "Valid is true if Time is not NULL", "type": "boolean" } } }, "hole.CreateModel": { "type": "object", "required": [ "content" ], "properties": { "content": { "type": "string" }, "special_tag": { "description": "Admin and Operator only", "type": "string", "maxLength": 16 }, "tags": { "description": "All users", "type": "array", "maxItems": 10, "minItems": 1, "items": { "$ref": "#/definitions/tag.CreateModel" } } } }, "hole.CreateOldModel": { "type": "object", "required": [ "content" ], "properties": { "content": { "type": "string" }, "division_id": { "type": "integer", "default": 1, "minimum": 1 }, "special_tag": { "description": "Admin and Operator only", "type": "string", "maxLength": 16 }, "tags": { "description": "All users", "type": "array", "maxItems": 10, "minItems": 1, "items": { "$ref": "#/definitions/tag.CreateModel" } } } }, "hole.CreateOldResponse": { "type": "object", "properties": { "data": { "$ref": "#/definitions/models.Hole" }, "message": { "type": "string" } } }, "hole.ModifyModel": { "type": "object", "properties": { "division_id": { "description": "Admin and owner only", "type": "integer", "minimum": 1 }, "frozen": { "description": "admin only", "type": "boolean" }, "hidden": { "description": "Admin only", "type": "boolean" }, "lock": { "description": "admin only", "type": "boolean" }, "tags": { "description": "All users", "type": "array", "maxItems": 10, "minItems": 1, "items": { "$ref": "#/definitions/tag.CreateModel" } }, "unhidden": { "description": "admin only", "type": "boolean" } } }, "message.CreateModel": { "type": "object", "required": [ "recipients" ], "properties": { "description": { "description": "MessageTypeMail", "type": "string" }, "recipients": { "type": "array", "items": { "type": "integer" } } } }, "models.Division": { "type": "object", "properties": { "description": { "type": "string" }, "division_id": { "description": "/ generated field", "type": "integer" }, "hidden": { "type": "boolean" }, "id": { "description": "/ saved fields", "type": "integer" }, "name": { "description": "/ base info", "type": "string" }, "pinned": { "description": "return pinned hole to frontend", "type": "array", "items": { "$ref": "#/definitions/models.Hole" } }, "show_in_home_page": { "type": "boolean" }, "time_created": { "type": "string" }, "time_updated": { "type": "string" } } }, "models.FavoriteGroup": { "type": "object", "properties": { "count": { "type": "integer" }, "deleted": { "type": "boolean" }, "favorite_group_id": { "type": "integer" }, "name": { "type": "string", "default": "默认" }, "time_created": { "type": "string" }, "time_updated": { "type": "string" }, "user_id": { "type": "integer" } } }, "models.Floor": { "type": "object", "properties": { "anonyname": { "description": "a random username", "type": "string" }, "content": { "description": "content of the floor, no more than 15000, should be sensitive checked, no more than 10000 in frontend", "type": "string" }, "deleted": { "description": "whether the floor is deleted", "type": "boolean" }, "dislike": { "description": "dislike number", "type": "integer" }, "disliked": { "description": "whether the user has disliked the floor", "type": "boolean" }, "floor_id": { "description": "old version compatibility", "type": "integer" }, "fold": { "description": "fold reason, for v1", "type": "array", "items": { "type": "string" } }, "fold_v2": { "description": "fold reason", "type": "string" }, "hole_id": { "description": "the hole it belongs to", "type": "integer" }, "id": { "description": "/ saved fields", "type": "integer" }, "is_actual_sensitive": { "description": "manual sensitive check", "type": "boolean" }, "is_me": { "description": "whether the user is the author of the floor", "type": "boolean" }, "is_sensitive": { "description": "auto sensitive check", "type": "boolean" }, "like": { "description": "like number", "type": "integer" }, "liked": { "description": "whether the user has liked the floor", "type": "boolean" }, "mention": { "description": "many to many mentions", "type": "array", "items": { "$ref": "#/definitions/models.Floor" } }, "modified": { "description": "the modification times of floor.content", "type": "integer" }, "ranking": { "description": "the ranking of this floor in the hole", "type": "integer" }, "reply_to": { "description": "floor_id that it replies to, for dialog mode, in the same hole", "type": "integer" }, "sensitive_detail": { "description": "auto sensitive check detail", "type": "string" }, "special_tag": { "description": "additional info, like \"树洞管理团队\"", "type": "string" }, "time_created": { "type": "string" }, "time_updated": { "type": "string" } } }, "models.FloorHistory": { "type": "object", "properties": { "content": { "type": "string" }, "floor_id": { "type": "integer" }, "id": { "description": "/ base info", "type": "integer" }, "is_actual_sensitive": { "description": "manual sensitive check", "type": "boolean" }, "is_sensitive": { "description": "auto sensitive check", "type": "boolean" }, "reason": { "type": "string" }, "sensitive_detail": { "type": "string" }, "time_created": { "type": "string" }, "time_updated": { "type": "string" }, "user_id": { "description": "The one who modified the floor", "type": "integer" } } }, "models.Hole": { "type": "object", "properties": { "ai_summary_available": { "description": "AI 摘要可用性,仅用于序列化", "type": "boolean" }, "division_id": { "description": "所属 division 的 id", "type": "integer" }, "favorite_count": { "type": "integer" }, "floors": { "description": "返回给前端的楼层列表,包括首楼、尾楼和预加载的前 n 个楼层", "type": "object", "properties": { "first_floor": { "description": "首楼", "allOf": [ { "$ref": "#/definitions/models.Floor" } ] }, "last_floor": { "description": "尾楼", "allOf": [ { "$ref": "#/definitions/models.Floor" } ] }, "prefetch": { "description": "预加载的楼层", "type": "array", "items": { "$ref": "#/definitions/models.Floor" } } } }, "frozen": { "description": "冻结状态,仅管理员可见 true\nFrozenFrontend *bool `json:\"frozen,omitempty\" gorm:\"-:all\"`\nFrozenFrontend *bool `json:\"frozen\" gorm:\"-:all\"`\nCompatibility for Swift client", "type": "boolean" }, "good": { "type": "boolean" }, "hidden": { "description": "是否隐藏,隐藏的洞用户不可见,管理员可见", "type": "boolean" }, "hole_id": { "description": "兼容旧版 id", "type": "integer" }, "id": { "description": "/ saved fields", "type": "integer" }, "locked": { "description": "锁定帖子,如果锁定则非管理员无法发帖,也无法修改已有发帖", "type": "boolean" }, "no_purge": { "type": "boolean" }, "reply": { "description": "回复量(即该洞下 floor 的数量 - 1)", "type": "integer" }, "subscription_count": { "type": "integer" }, "tags": { "description": "tag 列表;不超过 10 个", "type": "array", "items": { "$ref": "#/definitions/models.Tag" } }, "time_created": { "type": "string" }, "time_deleted": { "$ref": "#/definitions/gorm.DeletedAt" }, "time_updated": { "type": "string" }, "view": { "description": "浏览量", "type": "integer" } } }, "models.Map": { "type": "object", "additionalProperties": true }, "models.Message": { "type": "object", "properties": { "code": { "$ref": "#/definitions/models.MessageType" }, "data": {}, "description": { "type": "string" }, "has_read": { "description": "兼容旧版, 永远为false,以MessageUser的HasRead为准", "type": "boolean" }, "id": { "type": "integer" }, "message": { "type": "string" }, "message_id": { "description": "兼容旧版 id", "type": "integer" }, "related_floor_id": { "type": "integer" }, "related_hole_id": { "type": "integer" }, "time_created": { "type": "string" }, "time_updated": { "type": "string" }, "url": { "type": "string" } } }, "models.MessageModel": { "type": "object", "properties": { "message": { "type": "string" } } }, "models.MessageType": { "type": "string", "enum": [ "favorite", "reply", "mention", "modify", "permission", "report", "report_dealt", "mail", "sensitive" ], "x-enum-comments": { "MessageTypeModify": "including fold and delete" }, "x-enum-descriptions": [ "", "", "", "including fold and delete", "", "", "", "", "" ], "x-enum-varnames": [ "MessageTypeFavorite", "MessageTypeReply", "MessageTypeMention", "MessageTypeModify", "MessageTypePermission", "MessageTypeReport", "MessageTypeReportDealt", "MessageTypeMail", "MessageTypeSensitive" ] }, "models.Punishment": { "type": "object", "properties": { "created_at": { "description": "time when this punishment creates", "type": "string" }, "day": { "type": "integer" }, "division": { "description": "foreign key", "allOf": [ { "$ref": "#/definitions/models.Division" } ] }, "division_id": { "type": "integer" }, "duration": { "type": "integer" }, "end_time": { "description": "end_time of this punishment", "type": "string" }, "floor": { "description": "foreign key", "allOf": [ { "$ref": "#/definitions/models.Floor" } ] }, "floor_id": { "description": "punished because of this floor", "type": "integer" }, "id": { "type": "integer" }, "made_by": { "description": "admin user_id who made this punish", "type": "integer" }, "reason": { "description": "reason", "type": "string" }, "start_time": { "description": "start from end_time of previous punishment (punishment accumulation of different floors)\nif no previous punishment or previous punishment end time less than time.Now() (synced), set start time time.Now()", "type": "string" }, "updated_at": { "type": "string" }, "user_id": { "description": "user punished", "type": "integer" } } }, "models.Report": { "type": "object", "properties": { "dealt": { "description": "the report has been dealt", "type": "boolean" }, "dealt_by": { "description": "who dealt the report", "type": "integer" }, "floor": { "$ref": "#/definitions/models.Floor" }, "floor_id": { "type": "integer" }, "hole_id": { "type": "integer" }, "id": { "type": "integer" }, "reason": { "type": "string" }, "report_id": { "type": "integer" }, "result": { "description": "deal result", "type": "string" }, "time_created": { "type": "string" }, "time_updated": { "type": "string" } } }, "models.Tag": { "type": "object", "properties": { "id": { "description": "/ saved fields", "type": "integer" }, "name": { "description": "/ base info", "type": "string" }, "nsfw": { "type": "boolean" }, "tag_id": { "description": "/ generated field", "type": "integer" }, "temperature": { "type": "integer" } } }, "models.User": { "type": "object", "properties": { "config": { "$ref": "#/definitions/models.UserConfig" }, "default_special_tag": { "type": "string" }, "favorite_group_count": { "type": "integer" }, "has_answered_questions": { "type": "boolean" }, "id": { "description": "/ base info", "type": "integer" }, "is_admin": { "description": "get from jwt", "type": "boolean" }, "joined_time": { "type": "string" }, "nickname": { "type": "string" }, "permission": { "type": "object", "properties": { "admin": { "description": "管理员权限到期时间", "type": "string" }, "offense_count": { "type": "integer" }, "silent": { "description": "key: division_id value: 对应分区禁言解除时间", "type": "object", "additionalProperties": { "type": "string" } } } }, "special_tags": { "type": "array", "items": { "type": "string" } }, "user_id": { "type": "integer" } } }, "models.UserConfig": { "type": "object", "properties": { "notify": { "description": "used when notify", "type": "array", "items": { "type": "string" } }, "show_folded": { "description": "对折叠内容的处理\nfold 折叠, hide 隐藏, show 展示", "type": "string" } } }, "penalty.ForeverPostBody": { "type": "object", "properties": { "reason": { "description": "optional", "type": "string" } } }, "penalty.PostBody": { "type": "object", "properties": { "days": { "description": "high priority", "type": "integer", "minimum": 1 }, "divisions": { "description": "high priority", "type": "array", "minItems": 1, "items": { "type": "integer" } }, "penalty_level": { "description": "low priority, deprecated", "type": "integer" }, "reason": { "description": "optional", "type": "string" } } }, "report.AddModel": { "type": "object", "required": [ "floor_id", "reason" ], "properties": { "floor_id": { "type": "integer" }, "reason": { "type": "string", "maxLength": 128 } } }, "report.DeleteModel": { "type": "object", "required": [ "result" ], "properties": { "result": { "description": "The deal result, send it to reporter", "type": "string", "maxLength": 128 } } }, "report.Range": { "type": "integer", "enum": [ 0, 1, 2 ], "x-enum-varnames": [ "RangeNotDealt", "RangeDealt", "RangeAll" ] }, "report.banBody": { "type": "object", "properties": { "days": { "type": "integer", "minimum": 1 }, "reason": { "description": "optional", "type": "string" } } }, "subscription.AddModel": { "type": "object", "properties": { "hole_id": { "type": "integer" } } }, "subscription.DeleteModel": { "type": "object", "properties": { "hole_id": { "type": "integer" } } }, "subscription.Response": { "type": "object", "properties": { "data": { "type": "array", "items": { "type": "integer" } }, "message": { "type": "string" } } }, "tag.CreateModel": { "type": "object", "properties": { "name": { "description": "Admin only", "type": "string", "maxLength": 20 } } }, "tag.DeleteModel": { "type": "object", "properties": { "to": { "description": "Admin only\nName of the target tag that all the deleted tag's holes will be connected to", "type": "string" } } }, "tag.ModifyModel": { "type": "object", "properties": { "name": { "description": "Admin only", "type": "string", "maxLength": 20 }, "temperature": { "description": "Admin only", "type": "integer" } } }, "user.ModifyModel": { "type": "object", "properties": { "config": { "$ref": "#/definitions/user.UserConfigModel" }, "nickname": { "type": "string", "minLength": 1 } } }, "user.UserConfigModel": { "type": "object", "properties": { "notify": { "type": "array", "items": { "type": "string" } }, "show_folded": { "type": "string" } } } } }