diff --git a/src/api/api.go b/src/api/api.go index 26a9acc..767d469 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -75,6 +75,10 @@ type ChangeGroupAdminsRequest struct { Admins []string `json:"admins"` } +type JoinGroupByLinkRequest struct { + Uri string `json:"uri"` +} + type LoggingConfiguration struct { Level string `json:"Level"` } @@ -1739,6 +1743,47 @@ func (a *Api) JoinGroup(c *gin.Context) { c.Status(http.StatusNoContent) } +// @Summary Join a Signal Group via an invitation link. +// @Tags Groups +// @Description Join a Signal Group using an invitation link. The uri starts with https://signal.group/# +// @Accept json +// @Produce json +// @Success 204 {string} OK +// @Failure 400 {object} Error +// @Param number path string true "Registered Phone Number" +// @Param data body JoinGroupByLinkRequest true "Invitation link" +// @Router /v1/groups/{number}/join [post] +func (a *Api) JoinGroupByLink(c *gin.Context) { + number, err := url.PathUnescape(c.Param("number")) + if err != nil { + c.JSON(400, Error{Msg: "Couldn't process request - malformed number"}) + return + } + if number == "" { + c.JSON(400, Error{Msg: "Couldn't process request - number missing"}) + return + } + + var req JoinGroupByLinkRequest + err = c.BindJSON(&req) + if err != nil { + c.JSON(400, Error{Msg: "Couldn't process request - invalid request"}) + return + } + if req.Uri == "" { + c.JSON(400, Error{Msg: "Couldn't process request - uri missing"}) + return + } + + err = a.signalClient.JoinGroupByLink(number, req.Uri) + if err != nil { + c.JSON(400, Error{Msg: err.Error()}) + return + } + + c.Status(http.StatusNoContent) +} + // @Summary Quit a Signal Group. // @Tags Groups // @Description Quit the specified Signal Group. diff --git a/src/client/client.go b/src/client/client.go index c892fd4..0c23938 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -2063,6 +2063,26 @@ func (s *SignalClient) JoinGroup(number string, groupId string) error { return err } +func (s *SignalClient) JoinGroupByLink(number string, uri string) error { + var err error + var jsonRpc2Client *JsonRpc2Client + if s.signalCliMode == JsonRpc { + type Request struct { + Uri string `json:"uri"` + } + request := Request{Uri: uri} + jsonRpc2Client, err = s.getJsonRpc2Client() + if err != nil { + return err + } + _, err = jsonRpc2Client.getRaw("joinGroup", &number, request) + } else { + cmd := []string{"--config", s.signalCliConfig, "-a", number, "joinGroup", "--uri", uri} + _, err = s.cliClient.Execute(true, cmd, "") + } + return err +} + func (s *SignalClient) QuitGroup(number string, groupId string) error { var err error var jsonRpc2Client *JsonRpc2Client diff --git a/src/docs/docs.go b/src/docs/docs.go index be10280..72e63dc 100644 --- a/src/docs/docs.go +++ b/src/docs/docs.go @@ -208,6 +208,17 @@ const docTemplate = `{ ], "type": "object" }, + "api.JoinGroupByLinkRequest": { + "properties": { + "uri": { + "type": "string" + } + }, + "required": [ + "uri" + ], + "type": "object" + }, "api.LoggingConfiguration": { "properties": { "Level": { @@ -3410,6 +3421,53 @@ const docTemplate = `{ ] } }, + "/v1/groups/{number}/join": { + "post": { + "consumes": [ + "application/json" + ], + "description": "Join a Signal Group using an invitation link. The uri starts with https://signal.group/#", + "parameters": [ + { + "description": "Registered Phone Number", + "in": "path", + "name": "number", + "required": true, + "type": "string" + }, + { + "description": "Invitation link", + "in": "body", + "name": "data", + "required": true, + "schema": { + "$ref": "#/definitions/api.JoinGroupByLinkRequest" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.Error" + } + } + }, + "summary": "Join a Signal Group via an invitation link.", + "tags": [ + "Groups" + ] + } + }, "/v1/groups/{number}/{groupid}": { "delete": { "consumes": [ diff --git a/src/docs/swagger.json b/src/docs/swagger.json index 2b5494d..67a833f 100644 --- a/src/docs/swagger.json +++ b/src/docs/swagger.json @@ -203,6 +203,17 @@ ], "type": "object" }, + "api.JoinGroupByLinkRequest": { + "properties": { + "uri": { + "type": "string" + } + }, + "required": [ + "uri" + ], + "type": "object" + }, "api.LoggingConfiguration": { "properties": { "Level": { @@ -3405,6 +3416,53 @@ ] } }, + "/v1/groups/{number}/join": { + "post": { + "consumes": [ + "application/json" + ], + "description": "Join a Signal Group using an invitation link. The uri starts with https://signal.group/#", + "parameters": [ + { + "description": "Registered Phone Number", + "in": "path", + "name": "number", + "required": true, + "type": "string" + }, + { + "description": "Invitation link", + "in": "body", + "name": "data", + "required": true, + "schema": { + "$ref": "#/definitions/api.JoinGroupByLinkRequest" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.Error" + } + } + }, + "summary": "Join a Signal Group via an invitation link.", + "tags": [ + "Groups" + ] + } + }, "/v1/groups/{number}/{groupid}": { "delete": { "consumes": [ diff --git a/src/main.go b/src/main.go index 548d39b..20ec232 100644 --- a/src/main.go +++ b/src/main.go @@ -232,6 +232,7 @@ func main() { groups.DELETE(":number/:groupid", api.DeleteGroup) groups.POST(":number/:groupid/block", api.BlockGroup) groups.POST(":number/:groupid/join", api.JoinGroup) + groups.POST(":number/join", api.JoinGroupByLink) groups.POST(":number/:groupid/quit", api.QuitGroup) groups.PUT(":number/:groupid", api.UpdateGroup) groups.POST(":number/:groupid/members", api.AddMembersToGroup)