{ "swagger": "2.0", "info": { "description": "{{.Description}}", "title": "Vikunja API", "contact": {}, "license": { "name": "GPLv3" }, "version": "{{.Version}}" }, "host": "{{.Host}}", "basePath": "/api/v1", "paths": { "/lists": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns all lists a user has access to.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "list" ], "summary": "Get all lists a user has access to", "parameters": [ { "type": "integer", "description": "The page number. Used for pagination. If not provided, the first page of results is returned.", "name": "p", "in": "query" }, { "type": "string", "description": "Search lists by title.", "name": "s", "in": "query" } ], "responses": { "200": { "description": "The lists", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.List" } } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/lists/{id}": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns a team by its ID.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "team" ], "summary": "Gets one team", "parameters": [ { "type": "integer", "description": "Team ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "The team", "schema": { "type": "object", "$ref": "#/definitions/models.Team" } }, "403": { "description": "The user does not have access to the team", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "put": { "security": [ { "ApiKeyAuth": [] } ], "description": "Inserts a task into a list.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "task" ], "summary": "Create a task", "parameters": [ { "type": "integer", "description": "List ID", "name": "id", "in": "path", "required": true }, { "description": "The task object", "name": "task", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.ListTask" } } ], "responses": { "200": { "description": "The created task object.", "schema": { "type": "object", "$ref": "#/definitions/models.ListTask" } }, "400": { "description": "Invalid task object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "post": { "security": [ { "ApiKeyAuth": [] } ], "description": "Updates a list. This does not include adding a task (see below).", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "list" ], "summary": "Updates a list", "parameters": [ { "type": "integer", "description": "List ID", "name": "id", "in": "path", "required": true }, { "description": "The list with updated values you want to update.", "name": "list", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.List" } } ], "responses": { "200": { "description": "The updated list.", "schema": { "type": "object", "$ref": "#/definitions/models.List" } }, "400": { "description": "Invalid list object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] } ], "description": "Delets a list", "produces": [ "application/json" ], "tags": [ "list" ], "summary": "Deletes a list", "parameters": [ { "type": "integer", "description": "List ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "The list was successfully deleted.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "400": { "description": "Invalid list object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/lists/{id}/teams": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns a list with all teams which have access on a given list.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Get teams on a list", "parameters": [ { "type": "integer", "description": "List ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "description": "The page number. Used for pagination. If not provided, the first page of results is returned.", "name": "p", "in": "query" }, { "type": "string", "description": "Search teams by its name.", "name": "s", "in": "query" } ], "responses": { "200": { "description": "The teams with their right.", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.TeamWithRight" } } }, "403": { "description": "No right to see the list.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "put": { "security": [ { "ApiKeyAuth": [] } ], "description": "Gives a team access to a list.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Add a team to a list", "parameters": [ { "type": "integer", "description": "List ID", "name": "id", "in": "path", "required": true }, { "description": "The team you want to add to the list.", "name": "list", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.TeamList" } } ], "responses": { "200": { "description": "The created team\u003c-\u003elist relation.", "schema": { "type": "object", "$ref": "#/definitions/models.TeamList" } }, "400": { "description": "Invalid team list object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "The team does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/lists/{id}/users": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns a list with all users which have access on a given list.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Get users on a list", "parameters": [ { "type": "integer", "description": "List ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "description": "The page number. Used for pagination. If not provided, the first page of results is returned.", "name": "p", "in": "query" }, { "type": "string", "description": "Search users by its name.", "name": "s", "in": "query" } ], "responses": { "200": { "description": "The users with the right they have.", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.UserWithRight" } } }, "403": { "description": "No right to see the list.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "put": { "security": [ { "ApiKeyAuth": [] } ], "description": "Gives a user access to a list.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Add a user to a list", "parameters": [ { "type": "integer", "description": "List ID", "name": "id", "in": "path", "required": true }, { "description": "The user you want to add to the list.", "name": "list", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.ListUser" } } ], "responses": { "200": { "description": "The created user\u003c-\u003elist relation.", "schema": { "type": "object", "$ref": "#/definitions/models.ListUser" } }, "400": { "description": "Invalid user list object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "The user does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/lists/{listID}/teams/{teamID}": { "post": { "security": [ { "ApiKeyAuth": [] } ], "description": "Update a team \u003c-\u003e list relation. Mostly used to update the right that team has.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Update a team \u003c-\u003e list relation", "parameters": [ { "type": "integer", "description": "List ID", "name": "listID", "in": "path", "required": true }, { "type": "integer", "description": "Team ID", "name": "teamID", "in": "path", "required": true }, { "description": "The team you want to update.", "name": "list", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.TeamList" } } ], "responses": { "200": { "description": "The updated team \u003c-\u003e list relation.", "schema": { "type": "object", "$ref": "#/definitions/models.TeamList" } }, "403": { "description": "The user does not have admin-access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "Team or list does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] } ], "description": "Delets a team from a list. The team won't have access to the list anymore.", "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Delete a team from a list", "parameters": [ { "type": "integer", "description": "List ID", "name": "listID", "in": "path", "required": true }, { "type": "integer", "description": "Team ID", "name": "teamID", "in": "path", "required": true } ], "responses": { "200": { "description": "The team was successfully deleted.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "Team or list does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/lists/{listID}/users/{userID}": { "post": { "security": [ { "ApiKeyAuth": [] } ], "description": "Update a user \u003c-\u003e list relation. Mostly used to update the right that user has.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Update a user \u003c-\u003e list relation", "parameters": [ { "type": "integer", "description": "List ID", "name": "listID", "in": "path", "required": true }, { "type": "integer", "description": "User ID", "name": "userID", "in": "path", "required": true }, { "description": "The user you want to update.", "name": "list", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.ListUser" } } ], "responses": { "200": { "description": "The updated user \u003c-\u003e list relation.", "schema": { "type": "object", "$ref": "#/definitions/models.ListUser" } }, "403": { "description": "The user does not have admin-access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "User or list does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] } ], "description": "Delets a user from a list. The user won't have access to the list anymore.", "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Delete a user from a list", "parameters": [ { "type": "integer", "description": "List ID", "name": "listID", "in": "path", "required": true }, { "type": "integer", "description": "User ID", "name": "userID", "in": "path", "required": true } ], "responses": { "200": { "description": "The user was successfully removed from the list.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "user or list does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/login": { "post": { "description": "Logs a user in. Returns a JWT-Token to authenticate further requests.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "user" ], "summary": "Login", "parameters": [ { "description": "The login credentials", "name": "credentials", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.UserLogin" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "$ref": "#/definitions/v1.Token" } }, "400": { "description": "Invalid user password model.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "403": { "description": "Invalid username or password.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/namespace/{id}": { "post": { "security": [ { "ApiKeyAuth": [] } ], "description": "Updates a namespace.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "namespace" ], "summary": "Updates a namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "id", "in": "path", "required": true }, { "description": "The namespace with updated values you want to update.", "name": "namespace", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.Namespace" } } ], "responses": { "200": { "description": "The updated namespace.", "schema": { "type": "object", "$ref": "#/definitions/models.Namespace" } }, "400": { "description": "Invalid namespace object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the namespace", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/namespaces": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns all namespaces a user has access to.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "namespace" ], "summary": "Get all namespaces a user has access to", "parameters": [ { "type": "integer", "description": "The page number. Used for pagination. If not provided, the first page of results is returned.", "name": "p", "in": "query" }, { "type": "string", "description": "Search namespaces by name.", "name": "s", "in": "query" } ], "responses": { "200": { "description": "The Namespaces.", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.NamespaceWithLists" } } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "put": { "security": [ { "ApiKeyAuth": [] } ], "description": "Creates a new namespace.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "namespace" ], "summary": "Creates a new namespace", "parameters": [ { "description": "The namespace you want to create.", "name": "namespace", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.Namespace" } } ], "responses": { "200": { "description": "The created namespace.", "schema": { "type": "object", "$ref": "#/definitions/models.Namespace" } }, "400": { "description": "Invalid namespace object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the namespace", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/namespaces/{id}": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns a namespace by its ID.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "namespace" ], "summary": "Gets one namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "The Namespace", "schema": { "type": "object", "$ref": "#/definitions/models.Namespace" } }, "403": { "description": "The user does not have access to that namespace.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] } ], "description": "Delets a namespace", "produces": [ "application/json" ], "tags": [ "namespace" ], "summary": "Deletes a namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "The namespace was successfully deleted.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "400": { "description": "Invalid namespace object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the namespace", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/namespaces/{id}/lists": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns all lists inside of a namespace.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "namespace" ], "summary": "Get all lists in a namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "The lists.", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.List" } } }, "403": { "description": "No access to that namespace.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "404": { "description": "The namespace does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/namespaces/{id}/teams": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns a namespace with all teams which have access on a given namespace.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Get teams on a namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "description": "The page number. Used for pagination. If not provided, the first page of results is returned.", "name": "p", "in": "query" }, { "type": "string", "description": "Search teams by its name.", "name": "s", "in": "query" } ], "responses": { "200": { "description": "The teams with the right they have.", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.TeamWithRight" } } }, "403": { "description": "No right to see the namespace.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "put": { "security": [ { "ApiKeyAuth": [] } ], "description": "Gives a team access to a namespace.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Add a team to a namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "id", "in": "path", "required": true }, { "description": "The team you want to add to the namespace.", "name": "namespace", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.TeamNamespace" } } ], "responses": { "200": { "description": "The created team\u003c-\u003enamespace relation.", "schema": { "type": "object", "$ref": "#/definitions/models.TeamNamespace" } }, "400": { "description": "Invalid team namespace object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The team does not have access to the namespace", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "The team does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/namespaces/{id}/users": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns a namespace with all users which have access on a given namespace.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Get users on a namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "description": "The page number. Used for pagination. If not provided, the first page of results is returned.", "name": "p", "in": "query" }, { "type": "string", "description": "Search users by its name.", "name": "s", "in": "query" } ], "responses": { "200": { "description": "The users with the right they have.", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.UserWithRight" } } }, "403": { "description": "No right to see the namespace.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "put": { "security": [ { "ApiKeyAuth": [] } ], "description": "Gives a user access to a namespace.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Add a user to a namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "id", "in": "path", "required": true }, { "description": "The user you want to add to the namespace.", "name": "namespace", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.NamespaceUser" } } ], "responses": { "200": { "description": "The created user\u003c-\u003enamespace relation.", "schema": { "type": "object", "$ref": "#/definitions/models.NamespaceUser" } }, "400": { "description": "Invalid user namespace object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the namespace", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "The user does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/namespaces/{namespaceID}/lists": { "put": { "security": [ { "ApiKeyAuth": [] } ], "description": "Creates a new list in a given namespace. The user needs write-access to the namespace.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "list" ], "summary": "Creates a new list", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "namespaceID", "in": "path", "required": true }, { "description": "The list you want to create.", "name": "list", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.List" } } ], "responses": { "200": { "description": "The created list.", "schema": { "type": "object", "$ref": "#/definitions/models.List" } }, "400": { "description": "Invalid list object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/namespaces/{namespaceID}/teams/{teamID}": { "post": { "security": [ { "ApiKeyAuth": [] } ], "description": "Update a team \u003c-\u003e namespace relation. Mostly used to update the right that team has.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Update a team \u003c-\u003e namespace relation", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "namespaceID", "in": "path", "required": true }, { "type": "integer", "description": "Team ID", "name": "teamID", "in": "path", "required": true }, { "description": "The team you want to update.", "name": "namespace", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.TeamNamespace" } } ], "responses": { "200": { "description": "The updated team \u003c-\u003e namespace relation.", "schema": { "type": "object", "$ref": "#/definitions/models.TeamNamespace" } }, "403": { "description": "The team does not have admin-access to the namespace", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "Team or namespace does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] } ], "description": "Delets a team from a namespace. The team won't have access to the namespace anymore.", "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Delete a team from a namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "namespaceID", "in": "path", "required": true }, { "type": "integer", "description": "team ID", "name": "teamID", "in": "path", "required": true } ], "responses": { "200": { "description": "The team was successfully deleted.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "403": { "description": "The team does not have access to the namespace", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "team or namespace does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/namespaces/{namespaceID}/users/{userID}": { "post": { "security": [ { "ApiKeyAuth": [] } ], "description": "Update a user \u003c-\u003e namespace relation. Mostly used to update the right that user has.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Update a user \u003c-\u003e namespace relation", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "namespaceID", "in": "path", "required": true }, { "type": "integer", "description": "User ID", "name": "userID", "in": "path", "required": true }, { "description": "The user you want to update.", "name": "namespace", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.NamespaceUser" } } ], "responses": { "200": { "description": "The updated user \u003c-\u003e namespace relation.", "schema": { "type": "object", "$ref": "#/definitions/models.NamespaceUser" } }, "403": { "description": "The user does not have admin-access to the namespace", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "User or namespace does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] } ], "description": "Delets a user from a namespace. The user won't have access to the namespace anymore.", "produces": [ "application/json" ], "tags": [ "sharing" ], "summary": "Delete a user from a namespace", "parameters": [ { "type": "integer", "description": "Namespace ID", "name": "namespaceID", "in": "path", "required": true }, { "type": "integer", "description": "user ID", "name": "userID", "in": "path", "required": true } ], "responses": { "200": { "description": "The user was successfully deleted.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "403": { "description": "The user does not have access to the namespace", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "user or namespace does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/register": { "post": { "description": "Creates a new user account.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "user" ], "summary": "Register", "parameters": [ { "description": "The user credentials", "name": "credentials", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.APIUserPassword" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "$ref": "#/definitions/models.User" } }, "400": { "description": "No or invalid user register object provided / User already exists.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/tasks": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns all tasks on any list the user has access to.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "task" ], "summary": "Get tasks", "parameters": [ { "type": "integer", "description": "The page number. Used for pagination. If not provided, the first page of results is returned.", "name": "p", "in": "query" }, { "type": "string", "description": "Search tasks by task text.", "name": "s", "in": "query" } ], "responses": { "200": { "description": "The tasks", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.List" } } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/tasks/caldav": { "get": { "security": [ { "BasicAuth": [] } ], "description": "Returns a calDAV-parsable format with all tasks as calendar events. Only returns tasks with a due date. Also creates reminders when the task has one.", "produces": [ "text/plain" ], "tags": [ "task" ], "summary": "CalDAV-readable format with all tasks as calendar events.", "responses": { "200": { "description": "The caldav events.", "schema": { "type": "string" } }, "403": { "description": "Unauthorized.", "schema": { "type": "string" } } } } }, "/tasks/{id}": { "post": { "security": [ { "ApiKeyAuth": [] } ], "description": "Updates a task. This includes marking it as done.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "task" ], "summary": "Update a task", "parameters": [ { "type": "integer", "description": "Task ID", "name": "id", "in": "path", "required": true }, { "description": "The task object", "name": "task", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.ListTask" } } ], "responses": { "200": { "description": "The updated task object.", "schema": { "type": "object", "$ref": "#/definitions/models.ListTask" } }, "400": { "description": "Invalid task object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the task (aka its list)", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] } ], "description": "Deletes a task from a list. This does not mean \"mark it done\".", "produces": [ "application/json" ], "tags": [ "task" ], "summary": "Delete a task", "parameters": [ { "type": "integer", "description": "Task ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "The created task object.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "400": { "description": "Invalid task ID provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the list", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/teams": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns all teams the current user is part of.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "team" ], "summary": "Get teams", "parameters": [ { "type": "integer", "description": "The page number. Used for pagination. If not provided, the first page of results is returned.", "name": "p", "in": "query" }, { "type": "string", "description": "Search teams by its name.", "name": "s", "in": "query" } ], "responses": { "200": { "description": "The teams.", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.Team" } } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "put": { "security": [ { "ApiKeyAuth": [] } ], "description": "Creates a new team in a given namespace. The user needs write-access to the namespace.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "team" ], "summary": "Creates a new team", "parameters": [ { "description": "The team you want to create.", "name": "team", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.Team" } } ], "responses": { "200": { "description": "The created team.", "schema": { "type": "object", "$ref": "#/definitions/models.Team" } }, "400": { "description": "Invalid team object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/teams/{id}": { "post": { "security": [ { "ApiKeyAuth": [] } ], "description": "Updates a team.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "team" ], "summary": "Updates a team", "parameters": [ { "type": "integer", "description": "Team ID", "name": "id", "in": "path", "required": true }, { "description": "The team with updated values you want to update.", "name": "team", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.Team" } } ], "responses": { "200": { "description": "The updated team.", "schema": { "type": "object", "$ref": "#/definitions/models.Team" } }, "400": { "description": "Invalid team object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] } ], "description": "Delets a team. This will also remove the access for all users in that team.", "produces": [ "application/json" ], "tags": [ "team" ], "summary": "Deletes a team", "parameters": [ { "type": "integer", "description": "Team ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "The team was successfully deleted.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "400": { "description": "Invalid team object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/teams/{id}/members": { "put": { "security": [ { "ApiKeyAuth": [] } ], "description": "Add a user to a team.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "team" ], "summary": "Add a user to a team", "parameters": [ { "type": "integer", "description": "Team ID", "name": "id", "in": "path", "required": true }, { "description": "The user to be added to a team.", "name": "team", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.TeamMember" } } ], "responses": { "200": { "description": "The newly created member object", "schema": { "type": "object", "$ref": "#/definitions/models.TeamMember" } }, "400": { "description": "Invalid member object provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "403": { "description": "The user does not have access to the team", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/teams/{id}/members/{userID}": { "delete": { "security": [ { "ApiKeyAuth": [] } ], "description": "Remove a user from a team. This will also revoke any access this user might have via that team.", "produces": [ "application/json" ], "tags": [ "team" ], "summary": "Remove a user from a team", "parameters": [ { "type": "integer", "description": "Team ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "description": "User ID", "name": "userID", "in": "path", "required": true } ], "responses": { "200": { "description": "The user was successfully removed from the team.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/user": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Returns the current user object.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "user" ], "summary": "Get user information", "responses": { "200": { "description": "OK", "schema": { "type": "object", "$ref": "#/definitions/models.User" } }, "404": { "description": "User does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal server error.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/user/confirm": { "post": { "description": "Confirms the email of a newly registered user.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "user" ], "summary": "Confirm the email of a new user", "parameters": [ { "description": "The token.", "name": "credentials", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.EmailConfirm" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "412": { "description": "Bad token provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/user/password": { "post": { "security": [ { "ApiKeyAuth": [] } ], "description": "Lets the current user change its password.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "user" ], "summary": "Change password", "parameters": [ { "description": "The current and new password.", "name": "userPassword", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/v1.UserPassword" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "400": { "description": "Something's invalid.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "404": { "description": "User does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal server error.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/user/password/reset": { "post": { "description": "Resets a user email with a previously reset token.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "user" ], "summary": "Resets a password", "parameters": [ { "description": "The token with the new password.", "name": "credentials", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.PasswordReset" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "400": { "description": "Bad token provided.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/user/password/token": { "post": { "description": "Requests a token to reset a users password. The token is sent via email.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "user" ], "summary": "Request password reset token", "parameters": [ { "description": "The username of the user to request a token for.", "name": "credentials", "in": "body", "required": true, "schema": { "type": "object", "$ref": "#/definitions/models.PasswordTokenRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } }, "404": { "description": "The user does not exist.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal error", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } }, "/users": { "get": { "security": [ { "ApiKeyAuth": [] } ], "description": "Lists all users (without emailadresses). Also possible to search for a specific user.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "user" ], "summary": "Get users", "parameters": [ { "type": "string", "description": "Search for a user by its name.", "name": "s", "in": "query" } ], "responses": { "200": { "description": "All (found) users.", "schema": { "type": "array", "items": { "$ref": "#/definitions/models.User" } } }, "400": { "description": "Something's invalid.", "schema": { "type": "object", "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal server error.", "schema": { "type": "object", "$ref": "#/definitions/models.Message" } } } } } }, "definitions": { "models.APIUserPassword": { "type": "object", "properties": { "email": { "type": "string" }, "id": { "type": "integer" }, "password": { "type": "string" }, "username": { "type": "string" } } }, "models.EmailConfirm": { "type": "object", "properties": { "token": { "type": "string" } } }, "models.HTTPError": { "type": "object", "properties": { "code": { "type": "integer" }, "message": { "type": "string" } } }, "models.List": { "type": "object", "properties": { "created": { "type": "integer" }, "description": { "type": "string" }, "id": { "type": "integer" }, "owner": { "type": "object", "$ref": "#/definitions/models.User" }, "tasks": { "type": "array", "items": { "$ref": "#/definitions/models.ListTask" } }, "title": { "type": "string" }, "updated": { "type": "integer" } } }, "models.ListTask": { "type": "object", "properties": { "created": { "type": "integer" }, "createdBy": { "type": "object", "$ref": "#/definitions/models.User" }, "description": { "type": "string" }, "done": { "type": "boolean" }, "dueDate": { "type": "integer" }, "id": { "type": "integer" }, "listID": { "type": "integer" }, "reminderDates": { "type": "array", "items": { "type": "integer" } }, "repeatAfter": { "type": "integer" }, "text": { "type": "string" }, "updated": { "type": "integer" } } }, "models.ListUser": { "type": "object", "properties": { "created": { "type": "integer" }, "id": { "type": "integer" }, "list_id": { "type": "integer" }, "right": { "type": "integer" }, "updated": { "type": "integer" }, "user_id": { "type": "integer" } } }, "models.Message": { "type": "object", "properties": { "message": { "type": "string" } } }, "models.Namespace": { "type": "object", "properties": { "created": { "type": "integer" }, "description": { "type": "string" }, "id": { "type": "integer" }, "name": { "type": "string" }, "owner": { "type": "object", "$ref": "#/definitions/models.User" }, "updated": { "type": "integer" } } }, "models.NamespaceUser": { "type": "object", "properties": { "created": { "type": "integer" }, "id": { "type": "integer" }, "namespace_id": { "type": "integer" }, "right": { "type": "integer" }, "updated": { "type": "integer" }, "user_id": { "type": "integer" } } }, "models.NamespaceWithLists": { "type": "object", "properties": { "created": { "type": "integer" }, "description": { "type": "string" }, "id": { "type": "integer" }, "lists": { "type": "array", "items": { "$ref": "#/definitions/models.List" } }, "name": { "type": "string" }, "owner": { "type": "object", "$ref": "#/definitions/models.User" }, "updated": { "type": "integer" } } }, "models.PasswordReset": { "type": "object", "properties": { "new_password": { "type": "string" }, "token": { "type": "string" } } }, "models.PasswordTokenRequest": { "type": "object", "properties": { "user_name": { "type": "string" } } }, "models.Team": { "type": "object", "properties": { "created": { "type": "integer" }, "created_by": { "type": "object", "$ref": "#/definitions/models.User" }, "description": { "type": "string" }, "id": { "type": "integer" }, "members": { "type": "array", "items": { "$ref": "#/definitions/models.TeamUser" } }, "name": { "type": "string" }, "updated": { "type": "integer" } } }, "models.TeamList": { "type": "object", "properties": { "created": { "type": "integer" }, "id": { "type": "integer" }, "list_id": { "type": "integer" }, "right": { "type": "integer" }, "team_id": { "type": "integer" }, "updated": { "type": "integer" } } }, "models.TeamMember": { "type": "object", "properties": { "admin": { "type": "boolean" }, "created": { "type": "integer" }, "id": { "type": "integer" }, "team_id": { "type": "integer" }, "updated": { "type": "integer" }, "user_id": { "type": "integer" } } }, "models.TeamNamespace": { "type": "object", "properties": { "created": { "type": "integer" }, "id": { "type": "integer" }, "namespace_id": { "type": "integer" }, "right": { "type": "integer" }, "team_id": { "type": "integer" }, "updated": { "type": "integer" } } }, "models.TeamUser": { "type": "object", "properties": { "admin": { "type": "boolean" }, "created": { "type": "integer" }, "email": { "type": "string" }, "id": { "type": "integer" }, "updated": { "type": "integer" }, "username": { "type": "string" } } }, "models.TeamWithRight": { "type": "object", "properties": { "created": { "type": "integer" }, "created_by": { "type": "object", "$ref": "#/definitions/models.User" }, "description": { "type": "string" }, "id": { "type": "integer" }, "members": { "type": "array", "items": { "$ref": "#/definitions/models.TeamUser" } }, "name": { "type": "string" }, "right": { "type": "integer" }, "updated": { "type": "integer" } } }, "models.User": { "type": "object", "properties": { "created": { "type": "integer" }, "email": { "type": "string" }, "id": { "type": "integer" }, "updated": { "type": "integer" }, "username": { "type": "string" } } }, "models.UserLogin": { "type": "object", "properties": { "password": { "type": "string" }, "username": { "type": "string" } } }, "models.UserWithRight": { "type": "object", "properties": { "created": { "type": "integer" }, "email": { "type": "string" }, "id": { "type": "integer" }, "right": { "type": "integer" }, "updated": { "type": "integer" }, "username": { "type": "string" } } }, "v1.Token": { "type": "object", "properties": { "token": { "type": "string" } } }, "v1.UserPassword": { "type": "object", "properties": { "new_password": { "type": "string" }, "old_password": { "type": "string" } } } }, "securityDefinitions": { "ApiKeyAuth": { "type": "apiKey", "name": "Authorization", "in": "header" }, "BasicAuth": { "type": "basic" } } }