diff --git a/src/api/api.go b/src/api/api.go index ad16b1e..9aec337 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -51,6 +51,10 @@ type ChangeGroupMembersRequest struct { Members []string `json:"members"` } +type ChangeGroupAdminsRequest struct { + Admins []string `json:"admins"` +} + type LoggingConfiguration struct { Level string `json:"Level"` } @@ -602,6 +606,94 @@ func (a *Api) RemoveMembersFromGroup(c *gin.Context) { c.Status(http.StatusNoContent) } +// @Summary Add one or more admins to an existing Signal Group. +// @Tags Groups +// @Description Add one or more admins to an existing Signal Group. +// @Accept json +// @Produce json +// @Success 204 {string} OK +// @Failure 400 {object} Error +// @Param data body ChangeGroupAdminsRequest true "Admins" +// @Param number path string true "Registered Phone Number" +// @Router /v1/groups/{number}/{groupid}/admins [post] +func (a *Api) AddAdminsToGroup(c *gin.Context) { + number := c.Param("number") + if number == "" { + c.JSON(400, Error{Msg: "Couldn't process request - number missing"}) + return + } + + groupId := c.Param("groupid") + if groupId == "" { + c.JSON(400, Error{Msg: "Couldn't process request - group id missing"}) + return + } + + var req ChangeGroupAdminsRequest + err := c.BindJSON(&req) + if err != nil { + c.JSON(400, Error{Msg: "Couldn't process request - invalid request"}) + return + } + + err = a.signalClient.AddAdminsToGroup(number, groupId, req.Admins) + if err != nil { + switch err.(type) { + case *client.NotFoundError: + c.JSON(404, Error{Msg: err.Error()}) + return + default: + c.JSON(400, Error{Msg: err.Error()}) + return + } + } + c.Status(http.StatusNoContent) +} + +// @Summary Remove one or more admins from an existing Signal Group. +// @Tags Groups +// @Description Remove one or more admins from an existing Signal Group. +// @Accept json +// @Produce json +// @Success 204 {string} OK +// @Failure 400 {object} Error +// @Param data body ChangeGroupAdminsRequest true "Admins" +// @Param number path string true "Registered Phone Number" +// @Router /v1/groups/{number}/{groupid}/admins [delete] +func (a *Api) RemoveAdminsFromGroup(c *gin.Context) { + number := c.Param("number") + if number == "" { + c.JSON(400, Error{Msg: "Couldn't process request - number missing"}) + return + } + + groupId := c.Param("groupid") + if groupId == "" { + c.JSON(400, Error{Msg: "Couldn't process request - group id missing"}) + return + } + + var req ChangeGroupAdminsRequest + err := c.BindJSON(&req) + if err != nil { + c.JSON(400, Error{Msg: "Couldn't process request - invalid request"}) + return + } + + err = a.signalClient.RemoveAdminsFromGroup(number, groupId, req.Admins) + if err != nil { + switch err.(type) { + case *client.NotFoundError: + c.JSON(404, Error{Msg: err.Error()}) + return + default: + c.JSON(400, Error{Msg: err.Error()}) + return + } + } + c.Status(http.StatusNoContent) +} + // @Summary List all Signal Groups. // @Tags Groups // @Description List all Signal Groups. diff --git a/src/client/client.go b/src/client/client.go index 6361d28..c2c13f2 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -749,6 +749,69 @@ func (s *SignalClient) RemoveMembersFromGroup(number string, groupId string, mem return s.updateGroupMembers(number, groupId, members, false) } +func (s *SignalClient) updateGroupAdmins(number string, groupId string, admins []string, add bool) error { + var err error + + if len(admins) == 0 { + return nil + } + + group, err := s.GetGroup(number, groupId) + if err != nil { + return err + } + + if group == nil { + return &NotFoundError{Description: "No group with that group id (" + groupId + ") found"} + } + + internalGroupId, err := ConvertGroupIdToInternalGroupId(groupId) + if err != nil { + return errors.New("Invalid group id") + } + + if s.signalCliMode == JsonRpc { + type Request struct { + Name string `json:"name,omitempty"` + Admins []string `json:"admin,omitempty"` + RemoveAdmins []string `json:"remove-admin,omitempty"` + GroupId string `json:"groupId"` + } + request := Request{GroupId: internalGroupId} + if add { + request.Admins = append(request.Admins, admins...) + } else { + request.RemoveAdmins = append(request.RemoveAdmins, admins...) + } + + jsonRpc2Client, err := s.getJsonRpc2Client(number) + if err != nil { + return err + } + _, err = jsonRpc2Client.getRaw("updateGroup", request) + } else { + cmd := []string{"--config", s.signalCliConfig, "-a", number, "updateGroup", "-g", internalGroupId} + + if add { + cmd = append(cmd, "--admin") + } else { + cmd = append(cmd, "--remove-admin") + } + cmd = append(cmd, admins...) + + _, err = runSignalCli(true, cmd, "", s.signalCliMode) + } + return err +} + +func (s *SignalClient) AddAdminsToGroup(number string, groupId string, admins []string) error { + return s.updateGroupAdmins(number, groupId, admins, true) +} + +func (s *SignalClient) RemoveAdminsFromGroup(number string, groupId string, admins []string) error { + return s.updateGroupAdmins(number, groupId, admins, false) +} + func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { groupEntries := []GroupEntry{} diff --git a/src/docs/docs.go b/src/docs/docs.go index 62b45c5..5bab120 100644 --- a/src/docs/docs.go +++ b/src/docs/docs.go @@ -467,6 +467,98 @@ var doc = `{ } } }, + "/v1/groups/{number}/{groupid}/admins": { + "post": { + "description": "Add one or more admins to an existing Signal Group.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Groups" + ], + "summary": "Add one or more admins to an existing Signal Group.", + "parameters": [ + { + "description": "Admins", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.ChangeGroupAdminsRequest" + } + }, + { + "type": "string", + "description": "Registered Phone Number", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.Error" + } + } + } + }, + "delete": { + "description": "Remove one or more admins from an existing Signal Group.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Groups" + ], + "summary": "Remove one or more admins from an existing Signal Group.", + "parameters": [ + { + "description": "Admins", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.ChangeGroupAdminsRequest" + } + }, + { + "type": "string", + "description": "Registered Phone Number", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.Error" + } + } + } + } + }, "/v1/groups/{number}/{groupid}/block": { "post": { "description": "Block the specified Signal Group.", @@ -1358,6 +1450,17 @@ var doc = `{ } } }, + "api.ChangeGroupAdminsRequest": { + "type": "object", + "properties": { + "admins": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "api.ChangeGroupMembersRequest": { "type": "object", "properties": { diff --git a/src/docs/swagger.json b/src/docs/swagger.json index baa8ed2..403fc6e 100644 --- a/src/docs/swagger.json +++ b/src/docs/swagger.json @@ -451,6 +451,98 @@ } } }, + "/v1/groups/{number}/{groupid}/admins": { + "post": { + "description": "Add one or more admins to an existing Signal Group.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Groups" + ], + "summary": "Add one or more admins to an existing Signal Group.", + "parameters": [ + { + "description": "Admins", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.ChangeGroupAdminsRequest" + } + }, + { + "type": "string", + "description": "Registered Phone Number", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.Error" + } + } + } + }, + "delete": { + "description": "Remove one or more admins from an existing Signal Group.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Groups" + ], + "summary": "Remove one or more admins from an existing Signal Group.", + "parameters": [ + { + "description": "Admins", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/api.ChangeGroupAdminsRequest" + } + }, + { + "type": "string", + "description": "Registered Phone Number", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.Error" + } + } + } + } + }, "/v1/groups/{number}/{groupid}/block": { "post": { "description": "Block the specified Signal Group.", @@ -1342,6 +1434,17 @@ } } }, + "api.ChangeGroupAdminsRequest": { + "type": "object", + "properties": { + "admins": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "api.ChangeGroupMembersRequest": { "type": "object", "properties": { diff --git a/src/docs/swagger.yaml b/src/docs/swagger.yaml index 3eabee1..5a853fc 100644 --- a/src/docs/swagger.yaml +++ b/src/docs/swagger.yaml @@ -5,6 +5,13 @@ definitions: uri: type: string type: object + api.ChangeGroupAdminsRequest: + properties: + admins: + items: + type: string + type: array + type: object api.ChangeGroupMembersRequest: properties: members: @@ -514,6 +521,67 @@ paths: summary: List a Signal Group. tags: - Groups + /v1/groups/{number}/{groupid}/admins: + delete: + consumes: + - application/json + description: Remove one or more admins from an existing Signal Group. + parameters: + - description: Admins + in: body + name: data + required: true + schema: + $ref: '#/definitions/api.ChangeGroupAdminsRequest' + - description: Registered Phone Number + in: path + name: number + required: true + type: string + produces: + - application/json + responses: + "204": + description: No Content + schema: + type: string + "400": + description: Bad Request + schema: + $ref: '#/definitions/api.Error' + summary: Remove one or more admins from an existing Signal Group. + tags: + - Groups + post: + consumes: + - application/json + description: Add one or more admins to an existing Signal Group. + parameters: + - description: Admins + in: body + name: data + required: true + schema: + $ref: '#/definitions/api.ChangeGroupAdminsRequest' + - description: Registered Phone Number + in: path + name: number + required: true + type: string + produces: + - application/json + responses: + "204": + description: No Content + schema: + type: string + "400": + description: Bad Request + schema: + $ref: '#/definitions/api.Error' + summary: Add one or more admins to an existing Signal Group. + tags: + - Groups /v1/groups/{number}/{groupid}/block: post: consumes: diff --git a/src/main.go b/src/main.go index fdb6a70..c53aa24 100644 --- a/src/main.go +++ b/src/main.go @@ -188,6 +188,8 @@ func main() { groups.POST(":number/:groupid/quit", api.QuitGroup) groups.POST(":number/:groupid/members", api.AddMembersToGroup) groups.DELETE(":number/:groupid/members", api.RemoveMembersFromGroup) + groups.POST(":number/:groupid/admins", api.AddAdminsToGroup) + groups.DELETE(":number/:groupid/admins", api.RemoveAdminsFromGroup) } link := v1.Group("qrcodelink")