diff --git a/api-docs/openapi.json b/api-docs/openapi.json index ccaca5ea..a040ac4f 100644 --- a/api-docs/openapi.json +++ b/api-docs/openapi.json @@ -3995,6 +3995,310 @@ } } }, + "/api/groups": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Returns all custom role groups (role ID >= 3)", + "tags": [ + "groups" + ], + "summary": "List all groups", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.APIResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + } + } + }, + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Creates a new custom role group with name and permissions (Pro feature)", + "tags": [ + "groups" + ], + "summary": "Create a new group", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/pro.CreateGroupRequest" + } + } + }, + "description": "Group creation details", + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.APIResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "409": { + "description": "Conflict", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + } + } + } + }, + "/api/groups/{id}": { + "put": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Updates an existing group's name or permissions (Pro feature)", + "tags": [ + "groups" + ], + "summary": "Update a group", + "parameters": [ + { + "description": "Group ID", + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/pro.UpdateGroupRequest" + } + } + }, + "description": "Fields to update", + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.APIResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "409": { + "description": "Conflict", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + } + } + }, + "delete": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Deletes a custom role group. Fails if users are still assigned to it. (Pro feature)", + "tags": [ + "groups" + ], + "summary": "Delete a group", + "parameters": [ + { + "description": "Group ID", + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.APIResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + }, + "409": { + "description": "Conflict", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/utils.HTTPErrorResult" + } + } + } + } + } + } + }, "/api/image/{name}": { "get": { "security": [ @@ -11076,6 +11380,37 @@ "type": "integer", "format": "uint32" }, + "pro.CreateGroupRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "permissions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/utils.Permission" + } + } + } + }, + "pro.UpdateGroupRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "permissions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/utils.Permission" + } + } + } + }, "storage.FormatDiskJSON": { "type": "object", "required": [ diff --git a/api-docs/swagger.json b/api-docs/swagger.json index 9a0780ea..43fabfa4 100644 --- a/api-docs/swagger.json +++ b/api-docs/swagger.json @@ -3304,6 +3304,242 @@ } } }, + "/api/groups": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Returns all custom role groups (role ID \u003e= 3)", + "produces": [ + "application/json" + ], + "tags": [ + "groups" + ], + "summary": "List all groups", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utils.APIResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + } + } + }, + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Creates a new custom role group with name and permissions (Pro feature)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "groups" + ], + "summary": "Create a new group", + "parameters": [ + { + "description": "Group creation details", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/pro.CreateGroupRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utils.APIResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + } + } + } + }, + "/api/groups/{id}": { + "put": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Updates an existing group's name or permissions (Pro feature)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "groups" + ], + "summary": "Update a group", + "parameters": [ + { + "type": "integer", + "description": "Group ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Fields to update", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/pro.UpdateGroupRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utils.APIResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + } + } + }, + "delete": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Deletes a custom role group. Fails if users are still assigned to it. (Pro feature)", + "produces": [ + "application/json" + ], + "tags": [ + "groups" + ], + "summary": "Delete a group", + "parameters": [ + { + "type": "integer", + "description": "Group ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utils.APIResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/utils.HTTPErrorResult" + } + } + } + } + }, "/api/image/{name}": { "get": { "security": [ @@ -9391,6 +9627,37 @@ "ModePerm" ] }, + "pro.CreateGroupRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "permissions": { + "type": "array", + "items": { + "$ref": "#/definitions/utils.Permission" + } + } + } + }, + "pro.UpdateGroupRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "permissions": { + "type": "array", + "items": { + "$ref": "#/definitions/utils.Permission" + } + } + } + }, "storage.FormatDiskJSON": { "type": "object", "required": [ diff --git a/api-docs/swagger.yaml b/api-docs/swagger.yaml index 8f09c70e..2e2075f5 100644 --- a/api-docs/swagger.yaml +++ b/api-docs/swagger.yaml @@ -1025,6 +1025,26 @@ definitions: - ModeIrregular - ModeType - ModePerm + pro.CreateGroupRequest: + properties: + name: + type: string + permissions: + items: + $ref: '#/definitions/utils.Permission' + type: array + required: + - name + type: object + pro.UpdateGroupRequest: + properties: + name: + type: string + permissions: + items: + $ref: '#/definitions/utils.Permission' + type: array + type: object storage.FormatDiskJSON: properties: disk: @@ -4069,6 +4089,159 @@ paths: summary: Get backup file tags: - config + /api/groups: + get: + description: Returns all custom role groups (role ID >= 3) + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/utils.APIResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "403": + description: Forbidden + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + security: + - BearerAuth: [] + summary: List all groups + tags: + - groups + post: + consumes: + - application/json + description: Creates a new custom role group with name and permissions (Pro + feature) + parameters: + - description: Group creation details + in: body + name: request + required: true + schema: + $ref: '#/definitions/pro.CreateGroupRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/utils.APIResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "403": + description: Forbidden + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "409": + description: Conflict + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + security: + - BearerAuth: [] + summary: Create a new group + tags: + - groups + /api/groups/{id}: + delete: + description: Deletes a custom role group. Fails if users are still assigned + to it. (Pro feature) + parameters: + - description: Group ID + in: path + name: id + required: true + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/utils.APIResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "403": + description: Forbidden + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "404": + description: Not Found + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "409": + description: Conflict + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + security: + - BearerAuth: [] + summary: Delete a group + tags: + - groups + put: + consumes: + - application/json + description: Updates an existing group's name or permissions (Pro feature) + parameters: + - description: Group ID + in: path + name: id + required: true + type: integer + - description: Fields to update + in: body + name: request + required: true + schema: + $ref: '#/definitions/pro.UpdateGroupRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/utils.APIResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "403": + description: Forbidden + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "404": + description: Not Found + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + "409": + description: Conflict + schema: + $ref: '#/definitions/utils.HTTPErrorResult' + security: + - BearerAuth: [] + summary: Update a group + tags: + - groups /api/image/{name}: get: description: Returns a previously uploaded image by name diff --git a/go-sdk/client.gen.go b/go-sdk/client.gen.go index 5557b5fe..90b546e6 100644 --- a/go-sdk/client.gen.go +++ b/go-sdk/client.gen.go @@ -768,6 +768,18 @@ type NatPortSet map[string]interface{} // OsFileMode defines model for os.FileMode. type OsFileMode = uint32 +// ProCreateGroupRequest defines model for pro.CreateGroupRequest. +type ProCreateGroupRequest struct { + Name string `json:"name"` + Permissions *[]UtilsPermission `json:"permissions,omitempty"` +} + +// ProUpdateGroupRequest defines model for pro.UpdateGroupRequest. +type ProUpdateGroupRequest struct { + Name *string `json:"name,omitempty"` + Permissions *[]UtilsPermission `json:"permissions,omitempty"` +} + // StorageFormatDiskJSON defines model for storage.FormatDiskJSON. type StorageFormatDiskJSON struct { Disk string `json:"disk"` @@ -1576,6 +1588,12 @@ type PostApiDisksFormatJSONRequestBody = StorageFormatDiskJSON // PostApiDockerServiceJSONRequestBody defines body for PostApiDockerService for application/json ContentType. type PostApiDockerServiceJSONRequestBody = DockerDockerServiceCreateRequest +// PostApiGroupsJSONRequestBody defines body for PostApiGroups for application/json ContentType. +type PostApiGroupsJSONRequestBody = ProCreateGroupRequest + +// PutApiGroupsIdJSONRequestBody defines body for PutApiGroupsId for application/json ContentType. +type PutApiGroupsIdJSONRequestBody = ProUpdateGroupRequest + // PostApiInviteJSONRequestBody defines body for PostApiInvite for application/json ContentType. type PostApiInviteJSONRequestBody = UserInviteRequestJSON @@ -2006,6 +2024,22 @@ type ClientInterface interface { // GetApiGetBackup request GetApiGetBackup(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetApiGroups request + GetApiGroups(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + + // PostApiGroupsWithBody request with any body + PostApiGroupsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + PostApiGroups(ctx context.Context, body PostApiGroupsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DeleteApiGroupsId request + DeleteApiGroupsId(ctx context.Context, id int, reqEditors ...RequestEditorFn) (*http.Response, error) + + // PutApiGroupsIdWithBody request with any body + PutApiGroupsIdWithBody(ctx context.Context, id int, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + PutApiGroupsId(ctx context.Context, id int, body PutApiGroupsIdJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetApiImageName request GetApiImageName(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -3451,6 +3485,78 @@ func (c *Client) GetApiGetBackup(ctx context.Context, reqEditors ...RequestEdito return c.Client.Do(req) } +func (c *Client) GetApiGroups(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetApiGroupsRequest(c.Server) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) PostApiGroupsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPostApiGroupsRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) PostApiGroups(ctx context.Context, body PostApiGroupsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPostApiGroupsRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DeleteApiGroupsId(ctx context.Context, id int, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteApiGroupsIdRequest(c.Server, id) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) PutApiGroupsIdWithBody(ctx context.Context, id int, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPutApiGroupsIdRequestWithBody(c.Server, id, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) PutApiGroupsId(ctx context.Context, id int, body PutApiGroupsIdJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPutApiGroupsIdRequest(c.Server, id, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) GetApiImageName(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewGetApiImageNameRequest(c.Server, name) if err != nil { @@ -7443,6 +7549,154 @@ func NewGetApiGetBackupRequest(server string) (*http.Request, error) { return req, nil } +// NewGetApiGroupsRequest generates requests for GetApiGroups +func NewGetApiGroupsRequest(server string) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/groups") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewPostApiGroupsRequest calls the generic PostApiGroups builder with application/json body +func NewPostApiGroupsRequest(server string, body PostApiGroupsJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewPostApiGroupsRequestWithBody(server, "application/json", bodyReader) +} + +// NewPostApiGroupsRequestWithBody generates requests for PostApiGroups with any type of body +func NewPostApiGroupsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/groups") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDeleteApiGroupsIdRequest generates requests for DeleteApiGroupsId +func NewDeleteApiGroupsIdRequest(server string, id int) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "integer", Format: ""}) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/groups/%s", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewPutApiGroupsIdRequest calls the generic PutApiGroupsId builder with application/json body +func NewPutApiGroupsIdRequest(server string, id int, body PutApiGroupsIdJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewPutApiGroupsIdRequestWithBody(server, id, "application/json", bodyReader) +} + +// NewPutApiGroupsIdRequestWithBody generates requests for PutApiGroupsId with any type of body +func NewPutApiGroupsIdRequestWithBody(server string, id int, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "integer", Format: ""}) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/groups/%s", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewGetApiImageNameRequest generates requests for GetApiImageName func NewGetApiImageNameRequest(server string, name string) (*http.Request, error) { var err error @@ -11205,6 +11459,22 @@ type ClientWithResponsesInterface interface { // GetApiGetBackupWithResponse request GetApiGetBackupWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetApiGetBackupResponse, error) + // GetApiGroupsWithResponse request + GetApiGroupsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetApiGroupsResponse, error) + + // PostApiGroupsWithBodyWithResponse request with any body + PostApiGroupsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostApiGroupsResponse, error) + + PostApiGroupsWithResponse(ctx context.Context, body PostApiGroupsJSONRequestBody, reqEditors ...RequestEditorFn) (*PostApiGroupsResponse, error) + + // DeleteApiGroupsIdWithResponse request + DeleteApiGroupsIdWithResponse(ctx context.Context, id int, reqEditors ...RequestEditorFn) (*DeleteApiGroupsIdResponse, error) + + // PutApiGroupsIdWithBodyWithResponse request with any body + PutApiGroupsIdWithBodyWithResponse(ctx context.Context, id int, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PutApiGroupsIdResponse, error) + + PutApiGroupsIdWithResponse(ctx context.Context, id int, body PutApiGroupsIdJSONRequestBody, reqEditors ...RequestEditorFn) (*PutApiGroupsIdResponse, error) + // GetApiImageNameWithResponse request GetApiImageNameWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetApiImageNameResponse, error) @@ -13140,6 +13410,110 @@ func (r GetApiGetBackupResponse) StatusCode() int { return 0 } +type GetApiGroupsResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *UtilsAPIResponse + JSON401 *UtilsHTTPErrorResult + JSON403 *UtilsHTTPErrorResult +} + +// Status returns HTTPResponse.Status +func (r GetApiGroupsResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetApiGroupsResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type PostApiGroupsResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *UtilsAPIResponse + JSON400 *UtilsHTTPErrorResult + JSON401 *UtilsHTTPErrorResult + JSON403 *UtilsHTTPErrorResult + JSON409 *UtilsHTTPErrorResult +} + +// Status returns HTTPResponse.Status +func (r PostApiGroupsResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r PostApiGroupsResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DeleteApiGroupsIdResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *UtilsAPIResponse + JSON400 *UtilsHTTPErrorResult + JSON401 *UtilsHTTPErrorResult + JSON403 *UtilsHTTPErrorResult + JSON404 *UtilsHTTPErrorResult + JSON409 *UtilsHTTPErrorResult +} + +// Status returns HTTPResponse.Status +func (r DeleteApiGroupsIdResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DeleteApiGroupsIdResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type PutApiGroupsIdResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *UtilsAPIResponse + JSON400 *UtilsHTTPErrorResult + JSON401 *UtilsHTTPErrorResult + JSON403 *UtilsHTTPErrorResult + JSON404 *UtilsHTTPErrorResult + JSON409 *UtilsHTTPErrorResult +} + +// Status returns HTTPResponse.Status +func (r PutApiGroupsIdResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r PutApiGroupsIdResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type GetApiImageNameResponse struct { Body []byte HTTPResponse *http.Response @@ -16177,6 +16551,58 @@ func (c *ClientWithResponses) GetApiGetBackupWithResponse(ctx context.Context, r return ParseGetApiGetBackupResponse(rsp) } +// GetApiGroupsWithResponse request returning *GetApiGroupsResponse +func (c *ClientWithResponses) GetApiGroupsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetApiGroupsResponse, error) { + rsp, err := c.GetApiGroups(ctx, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetApiGroupsResponse(rsp) +} + +// PostApiGroupsWithBodyWithResponse request with arbitrary body returning *PostApiGroupsResponse +func (c *ClientWithResponses) PostApiGroupsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostApiGroupsResponse, error) { + rsp, err := c.PostApiGroupsWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePostApiGroupsResponse(rsp) +} + +func (c *ClientWithResponses) PostApiGroupsWithResponse(ctx context.Context, body PostApiGroupsJSONRequestBody, reqEditors ...RequestEditorFn) (*PostApiGroupsResponse, error) { + rsp, err := c.PostApiGroups(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePostApiGroupsResponse(rsp) +} + +// DeleteApiGroupsIdWithResponse request returning *DeleteApiGroupsIdResponse +func (c *ClientWithResponses) DeleteApiGroupsIdWithResponse(ctx context.Context, id int, reqEditors ...RequestEditorFn) (*DeleteApiGroupsIdResponse, error) { + rsp, err := c.DeleteApiGroupsId(ctx, id, reqEditors...) + if err != nil { + return nil, err + } + return ParseDeleteApiGroupsIdResponse(rsp) +} + +// PutApiGroupsIdWithBodyWithResponse request with arbitrary body returning *PutApiGroupsIdResponse +func (c *ClientWithResponses) PutApiGroupsIdWithBodyWithResponse(ctx context.Context, id int, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PutApiGroupsIdResponse, error) { + rsp, err := c.PutApiGroupsIdWithBody(ctx, id, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePutApiGroupsIdResponse(rsp) +} + +func (c *ClientWithResponses) PutApiGroupsIdWithResponse(ctx context.Context, id int, body PutApiGroupsIdJSONRequestBody, reqEditors ...RequestEditorFn) (*PutApiGroupsIdResponse, error) { + rsp, err := c.PutApiGroupsId(ctx, id, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePutApiGroupsIdResponse(rsp) +} + // GetApiImageNameWithResponse request returning *GetApiImageNameResponse func (c *ClientWithResponses) GetApiImageNameWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetApiImageNameResponse, error) { rsp, err := c.GetApiImageName(ctx, name, reqEditors...) @@ -20039,6 +20465,222 @@ func ParseGetApiGetBackupResponse(rsp *http.Response) (*GetApiGetBackupResponse, return response, nil } +// ParseGetApiGroupsResponse parses an HTTP response from a GetApiGroupsWithResponse call +func ParseGetApiGroupsResponse(rsp *http.Response) (*GetApiGroupsResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetApiGroupsResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest UtilsAPIResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON401 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON403 = &dest + + } + + return response, nil +} + +// ParsePostApiGroupsResponse parses an HTTP response from a PostApiGroupsWithResponse call +func ParsePostApiGroupsResponse(rsp *http.Response) (*PostApiGroupsResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &PostApiGroupsResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest UtilsAPIResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON401 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON403 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 409: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON409 = &dest + + } + + return response, nil +} + +// ParseDeleteApiGroupsIdResponse parses an HTTP response from a DeleteApiGroupsIdWithResponse call +func ParseDeleteApiGroupsIdResponse(rsp *http.Response) (*DeleteApiGroupsIdResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DeleteApiGroupsIdResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest UtilsAPIResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON401 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON403 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON404 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 409: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON409 = &dest + + } + + return response, nil +} + +// ParsePutApiGroupsIdResponse parses an HTTP response from a PutApiGroupsIdWithResponse call +func ParsePutApiGroupsIdResponse(rsp *http.Response) (*PutApiGroupsIdResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &PutApiGroupsIdResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest UtilsAPIResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON401 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON403 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON404 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 409: + var dest UtilsHTTPErrorResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON409 = &dest + + } + + return response, nil +} + // ParseGetApiImageNameResponse parses an HTTP response from a GetApiImageNameWithResponse call func ParseGetApiImageNameResponse(rsp *http.Response) (*GetApiImageNameResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -23964,293 +24606,298 @@ func ParsePostRcloneVfsStatsResponse(rsp *http.Response) (*PostRcloneVfsStatsRes // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "QQfvBoeR0WkPvn359v8CAAD//7cTwX9MhQIA", + "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", + "TNDBu8FhZHTag2+fv/3/AQAA///iM+BdZpYCAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/scripts/pre-commit b/scripts/pre-commit index 0610e6cf..d576d329 100644 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -8,7 +8,7 @@ git add api-docs/ go-sdk/client.gen.go go-sdk/version.go # --- Pro leak check --- errors=0 -for dir in "src/pro" "client/src/pro"; do +for dir in "client/src/pro"; do count=$(find "$dir" -type f | wc -l) if [ "$count" -ne 1 ]; then echo "ERROR: $dir/ must contain exactly 1 file, found $count" diff --git a/src/pro/groups.go b/src/pro/groups.go new file mode 100644 index 00000000..f6d85a54 --- /dev/null +++ b/src/pro/groups.go @@ -0,0 +1,112 @@ +package pro + +import ( + "net/http" + + "github.com/azukaar/cosmos-server/src/utils" +) + +type CreateGroupRequest struct { + Name string `json:"name" validate:"required"` + Permissions []utils.Permission `json:"permissions"` +} + +type UpdateGroupRequest struct { + Name *string `json:"name,omitempty"` + Permissions []utils.Permission `json:"permissions,omitempty"` +} + +func GroupsRoute(w http.ResponseWriter, req *http.Request) { + utils.Error("This is a pro and is not currently available on your server. Please upgrade to Cosmos Pro to access this feature.", nil) + utils.HTTPError(w, "This feature is only available in Cosmos Pro", http.StatusForbidden, "PRO001") + return +} + +func GroupsIdRoute(w http.ResponseWriter, req *http.Request) { + if req.Method == "PUT" { + updateGroup(w, req) + } else if req.Method == "DELETE" { + deleteGroup(w, req) + } else { + utils.Error("GroupsIdRoute: Method not allowed "+req.Method, nil) + utils.HTTPError(w, "Method not allowed", http.StatusMethodNotAllowed, "HTTP001") + } +} + +// listGroups godoc +// @Summary List all groups +// @Description Returns all custom role groups (role ID >= 3) +// @Tags groups +// @Produce json +// @Security BearerAuth +// @Success 200 {object} utils.APIResponse +// @Failure 401 {object} utils.HTTPErrorResult +// @Failure 403 {object} utils.HTTPErrorResult +// @Router /api/groups [get] +func listGroups(w http.ResponseWriter, req *http.Request) { + utils.Error("This is a pro and is not currently available on your server. Please upgrade to Cosmos Pro to access this feature.", nil) + utils.HTTPError(w, "This feature is only available in Cosmos Pro", http.StatusForbidden, "PRO001") + return +} + +// createGroup godoc +// @Summary Create a new group +// @Description Creates a new custom role group with name and permissions (Pro feature) +// @Tags groups +// @Accept json +// @Produce json +// @Security BearerAuth +// @Param request body CreateGroupRequest true "Group creation details" +// @Success 200 {object} utils.APIResponse +// @Failure 400 {object} utils.HTTPErrorResult +// @Failure 401 {object} utils.HTTPErrorResult +// @Failure 403 {object} utils.HTTPErrorResult +// @Failure 409 {object} utils.HTTPErrorResult +// @Router /api/groups [post] +func createGroup(w http.ResponseWriter, req *http.Request) { + utils.Error("This is a pro and is not currently available on your server. Please upgrade to Cosmos Pro to access this feature.", nil) + utils.HTTPError(w, "This feature is only available in Cosmos Pro", http.StatusForbidden, "PRO001") + return +} + +// updateGroup godoc +// @Summary Update a group +// @Description Updates an existing group's name or permissions (Pro feature) +// @Tags groups +// @Accept json +// @Produce json +// @Security BearerAuth +// @Param id path int true "Group ID" +// @Param request body UpdateGroupRequest true "Fields to update" +// @Success 200 {object} utils.APIResponse +// @Failure 400 {object} utils.HTTPErrorResult +// @Failure 401 {object} utils.HTTPErrorResult +// @Failure 403 {object} utils.HTTPErrorResult +// @Failure 404 {object} utils.HTTPErrorResult +// @Failure 409 {object} utils.HTTPErrorResult +// @Router /api/groups/{id} [put] +func updateGroup(w http.ResponseWriter, req *http.Request) { + utils.Error("This is a pro and is not currently available on your server. Please upgrade to Cosmos Pro to access this feature.", nil) + utils.HTTPError(w, "This feature is only available in Cosmos Pro", http.StatusForbidden, "PRO001") + return +} + +// deleteGroup godoc +// @Summary Delete a group +// @Description Deletes a custom role group. Fails if users are still assigned to it. (Pro feature) +// @Tags groups +// @Produce json +// @Security BearerAuth +// @Param id path int true "Group ID" +// @Success 200 {object} utils.APIResponse +// @Failure 400 {object} utils.HTTPErrorResult +// @Failure 401 {object} utils.HTTPErrorResult +// @Failure 403 {object} utils.HTTPErrorResult +// @Failure 404 {object} utils.HTTPErrorResult +// @Failure 409 {object} utils.HTTPErrorResult +// @Router /api/groups/{id} [delete] +func deleteGroup(w http.ResponseWriter, req *http.Request) { + utils.Error("This is a pro and is not currently available on your server. Please upgrade to Cosmos Pro to access this feature.", nil) + utils.HTTPError(w, "This feature is only available in Cosmos Pro", http.StatusForbidden, "PRO001") + return +}