Skip to content

Commit d34fcb9

Browse files
author
Bernhard B
committed
added new API endpoints to add/remove admins to/from Signal Groups
see #232
1 parent 60b4d8a commit d34fcb9

File tree

6 files changed

+431
-0
lines changed

6 files changed

+431
-0
lines changed

src/api/api.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ type ChangeGroupMembersRequest struct {
5151
Members []string `json:"members"`
5252
}
5353

54+
type ChangeGroupAdminsRequest struct {
55+
Admins []string `json:"admins"`
56+
}
57+
5458
type LoggingConfiguration struct {
5559
Level string `json:"Level"`
5660
}
@@ -602,6 +606,94 @@ func (a *Api) RemoveMembersFromGroup(c *gin.Context) {
602606
c.Status(http.StatusNoContent)
603607
}
604608

609+
// @Summary Add one or more admins to an existing Signal Group.
610+
// @Tags Groups
611+
// @Description Add one or more admins to an existing Signal Group.
612+
// @Accept json
613+
// @Produce json
614+
// @Success 204 {string} OK
615+
// @Failure 400 {object} Error
616+
// @Param data body ChangeGroupAdminsRequest true "Admins"
617+
// @Param number path string true "Registered Phone Number"
618+
// @Router /v1/groups/{number}/{groupid}/admins [post]
619+
func (a *Api) AddAdminsToGroup(c *gin.Context) {
620+
number := c.Param("number")
621+
if number == "" {
622+
c.JSON(400, Error{Msg: "Couldn't process request - number missing"})
623+
return
624+
}
625+
626+
groupId := c.Param("groupid")
627+
if groupId == "" {
628+
c.JSON(400, Error{Msg: "Couldn't process request - group id missing"})
629+
return
630+
}
631+
632+
var req ChangeGroupAdminsRequest
633+
err := c.BindJSON(&req)
634+
if err != nil {
635+
c.JSON(400, Error{Msg: "Couldn't process request - invalid request"})
636+
return
637+
}
638+
639+
err = a.signalClient.AddAdminsToGroup(number, groupId, req.Admins)
640+
if err != nil {
641+
switch err.(type) {
642+
case *client.NotFoundError:
643+
c.JSON(404, Error{Msg: err.Error()})
644+
return
645+
default:
646+
c.JSON(400, Error{Msg: err.Error()})
647+
return
648+
}
649+
}
650+
c.Status(http.StatusNoContent)
651+
}
652+
653+
// @Summary Remove one or more admins from an existing Signal Group.
654+
// @Tags Groups
655+
// @Description Remove one or more admins from an existing Signal Group.
656+
// @Accept json
657+
// @Produce json
658+
// @Success 204 {string} OK
659+
// @Failure 400 {object} Error
660+
// @Param data body ChangeGroupAdminsRequest true "Admins"
661+
// @Param number path string true "Registered Phone Number"
662+
// @Router /v1/groups/{number}/{groupid}/admins [delete]
663+
func (a *Api) RemoveAdminsFromGroup(c *gin.Context) {
664+
number := c.Param("number")
665+
if number == "" {
666+
c.JSON(400, Error{Msg: "Couldn't process request - number missing"})
667+
return
668+
}
669+
670+
groupId := c.Param("groupid")
671+
if groupId == "" {
672+
c.JSON(400, Error{Msg: "Couldn't process request - group id missing"})
673+
return
674+
}
675+
676+
var req ChangeGroupAdminsRequest
677+
err := c.BindJSON(&req)
678+
if err != nil {
679+
c.JSON(400, Error{Msg: "Couldn't process request - invalid request"})
680+
return
681+
}
682+
683+
err = a.signalClient.RemoveAdminsFromGroup(number, groupId, req.Admins)
684+
if err != nil {
685+
switch err.(type) {
686+
case *client.NotFoundError:
687+
c.JSON(404, Error{Msg: err.Error()})
688+
return
689+
default:
690+
c.JSON(400, Error{Msg: err.Error()})
691+
return
692+
}
693+
}
694+
c.Status(http.StatusNoContent)
695+
}
696+
605697
// @Summary List all Signal Groups.
606698
// @Tags Groups
607699
// @Description List all Signal Groups.

src/client/client.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,69 @@ func (s *SignalClient) RemoveMembersFromGroup(number string, groupId string, mem
749749
return s.updateGroupMembers(number, groupId, members, false)
750750
}
751751

752+
func (s *SignalClient) updateGroupAdmins(number string, groupId string, admins []string, add bool) error {
753+
var err error
754+
755+
if len(admins) == 0 {
756+
return nil
757+
}
758+
759+
group, err := s.GetGroup(number, groupId)
760+
if err != nil {
761+
return err
762+
}
763+
764+
if group == nil {
765+
return &NotFoundError{Description: "No group with that group id (" + groupId + ") found"}
766+
}
767+
768+
internalGroupId, err := ConvertGroupIdToInternalGroupId(groupId)
769+
if err != nil {
770+
return errors.New("Invalid group id")
771+
}
772+
773+
if s.signalCliMode == JsonRpc {
774+
type Request struct {
775+
Name string `json:"name,omitempty"`
776+
Admins []string `json:"admin,omitempty"`
777+
RemoveAdmins []string `json:"remove-admin,omitempty"`
778+
GroupId string `json:"groupId"`
779+
}
780+
request := Request{GroupId: internalGroupId}
781+
if add {
782+
request.Admins = append(request.Admins, admins...)
783+
} else {
784+
request.RemoveAdmins = append(request.RemoveAdmins, admins...)
785+
}
786+
787+
jsonRpc2Client, err := s.getJsonRpc2Client(number)
788+
if err != nil {
789+
return err
790+
}
791+
_, err = jsonRpc2Client.getRaw("updateGroup", request)
792+
} else {
793+
cmd := []string{"--config", s.signalCliConfig, "-a", number, "updateGroup", "-g", internalGroupId}
794+
795+
if add {
796+
cmd = append(cmd, "--admin")
797+
} else {
798+
cmd = append(cmd, "--remove-admin")
799+
}
800+
cmd = append(cmd, admins...)
801+
802+
_, err = runSignalCli(true, cmd, "", s.signalCliMode)
803+
}
804+
return err
805+
}
806+
807+
func (s *SignalClient) AddAdminsToGroup(number string, groupId string, admins []string) error {
808+
return s.updateGroupAdmins(number, groupId, admins, true)
809+
}
810+
811+
func (s *SignalClient) RemoveAdminsFromGroup(number string, groupId string, admins []string) error {
812+
return s.updateGroupAdmins(number, groupId, admins, false)
813+
}
814+
752815
func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) {
753816
groupEntries := []GroupEntry{}
754817

src/docs/docs.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,98 @@ var doc = `{
467467
}
468468
}
469469
},
470+
"/v1/groups/{number}/{groupid}/admins": {
471+
"post": {
472+
"description": "Add one or more admins to an existing Signal Group.",
473+
"consumes": [
474+
"application/json"
475+
],
476+
"produces": [
477+
"application/json"
478+
],
479+
"tags": [
480+
"Groups"
481+
],
482+
"summary": "Add one or more admins to an existing Signal Group.",
483+
"parameters": [
484+
{
485+
"description": "Admins",
486+
"name": "data",
487+
"in": "body",
488+
"required": true,
489+
"schema": {
490+
"$ref": "#/definitions/api.ChangeGroupAdminsRequest"
491+
}
492+
},
493+
{
494+
"type": "string",
495+
"description": "Registered Phone Number",
496+
"name": "number",
497+
"in": "path",
498+
"required": true
499+
}
500+
],
501+
"responses": {
502+
"204": {
503+
"description": "No Content",
504+
"schema": {
505+
"type": "string"
506+
}
507+
},
508+
"400": {
509+
"description": "Bad Request",
510+
"schema": {
511+
"$ref": "#/definitions/api.Error"
512+
}
513+
}
514+
}
515+
},
516+
"delete": {
517+
"description": "Remove one or more admins from an existing Signal Group.",
518+
"consumes": [
519+
"application/json"
520+
],
521+
"produces": [
522+
"application/json"
523+
],
524+
"tags": [
525+
"Groups"
526+
],
527+
"summary": "Remove one or more admins from an existing Signal Group.",
528+
"parameters": [
529+
{
530+
"description": "Admins",
531+
"name": "data",
532+
"in": "body",
533+
"required": true,
534+
"schema": {
535+
"$ref": "#/definitions/api.ChangeGroupAdminsRequest"
536+
}
537+
},
538+
{
539+
"type": "string",
540+
"description": "Registered Phone Number",
541+
"name": "number",
542+
"in": "path",
543+
"required": true
544+
}
545+
],
546+
"responses": {
547+
"204": {
548+
"description": "No Content",
549+
"schema": {
550+
"type": "string"
551+
}
552+
},
553+
"400": {
554+
"description": "Bad Request",
555+
"schema": {
556+
"$ref": "#/definitions/api.Error"
557+
}
558+
}
559+
}
560+
}
561+
},
470562
"/v1/groups/{number}/{groupid}/block": {
471563
"post": {
472564
"description": "Block the specified Signal Group.",
@@ -1358,6 +1450,17 @@ var doc = `{
13581450
}
13591451
}
13601452
},
1453+
"api.ChangeGroupAdminsRequest": {
1454+
"type": "object",
1455+
"properties": {
1456+
"admins": {
1457+
"type": "array",
1458+
"items": {
1459+
"type": "string"
1460+
}
1461+
}
1462+
}
1463+
},
13611464
"api.ChangeGroupMembersRequest": {
13621465
"type": "object",
13631466
"properties": {

0 commit comments

Comments
 (0)