addd API endpoints to join/quit/block Signal Groups

This commit is contained in:
Bernhard B
2021-01-27 18:18:58 +01:00
parent 04e67d058b
commit 2c3a2f30a8
5 changed files with 601 additions and 7 deletions

View File

@@ -116,6 +116,16 @@ func convertInternalGroupIdToGroupId(internalId string) string {
return groupPrefix + base64.StdEncoding.EncodeToString([]byte(internalId))
}
func convertGroupIdToInternalGroupId(id string) (string, error) {
groupIdWithoutPrefix := strings.TrimPrefix(id, groupPrefix)
internalGroupId, err := base64.StdEncoding.DecodeString(groupIdWithoutPrefix)
if err != nil {
return "", errors.New("Invalid group id")
}
return string(internalGroupId), err
}
func getStringInBetween(str string, start string, end string) (result string) {
i := strings.Index(str, start)
if i == -1 {
@@ -667,6 +677,16 @@ func (a *Api) GetGroups(c *gin.Context) {
c.JSON(200, groups)
}
// @Summary List a Signal Group.
// @Tags Groups
// @Description List a specific Signal Group.
// @Accept json
// @Produce json
// @Success 200 {object} GroupEntry
// @Failure 400 {object} Error
// @Param number path string true "Registered Phone Number"
// @Param groupid path string true "Group ID"
// @Router /v1/groups/{number}/{groupid} [get]
func (a *Api) GetGroup(c *gin.Context) {
number := c.Param("number")
groupId := c.Param("groupid")
@@ -689,7 +709,7 @@ func (a *Api) GetGroup(c *gin.Context) {
// @Summary Delete a Signal Group.
// @Tags Groups
// @Description Delete a Signal Group.
// @Description Delete the specified Signal Group.
// @Accept json
// @Produce json
// @Success 200 {string} string "OK"
@@ -1094,3 +1114,99 @@ func (a *Api) GetConfiguration(c *gin.Context) {
configuration := Configuration{Logging: LoggingConfiguration{Level: logLevel}}
c.JSON(200, configuration)
}
// @Summary Block a Signal Group.
// @Tags Groups
// @Description Block the specified Signal Group.
// @Accept json
// @Produce json
// @Success 200 {string} OK
// @Failure 400 {object} Error
// @Param number path string true "Registered Phone Number"
// @Param groupid path string true "Group ID"
// @Router /v1/groups/{number}/{groupid}/block [post]
func (a *Api) BlockGroup(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")
internalGroupId, err := convertGroupIdToInternalGroupId(groupId)
if err != nil {
c.JSON(400, Error{Msg: err.Error()})
return
}
_, err = runSignalCli(true, []string{"--config", a.signalCliConfig, "-u", number, "block", "-g", internalGroupId}, "")
if err != nil {
c.JSON(400, Error{Msg: err.Error()})
return
}
c.Status(http.StatusNoContent)
}
// @Summary Join a Signal Group.
// @Tags Groups
// @Description Join the specified Signal Group.
// @Accept json
// @Produce json
// @Success 200 {string} OK
// @Failure 400 {object} Error
// @Param number path string true "Registered Phone Number"
// @Param groupid path string true "Group ID"
// @Router /v1/groups/{number}/{groupid}/join [post]
func (a *Api) JoinGroup(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")
internalGroupId, err := convertGroupIdToInternalGroupId(groupId)
if err != nil {
c.JSON(400, Error{Msg: err.Error()})
return
}
_, err = runSignalCli(true, []string{"--config", a.signalCliConfig, "-u", number, "updateGroup", "-g", internalGroupId}, "")
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.
// @Accept json
// @Produce json
// @Success 200 {string} OK
// @Failure 400 {object} Error
// @Param number path string true "Registered Phone Number"
// @Param groupid path string true "Group ID"
// @Router /v1/groups/{number}/{groupid}/quit [post]
func (a *Api) QuitGroup(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")
internalGroupId, err := convertGroupIdToInternalGroupId(groupId)
if err != nil {
c.JSON(400, Error{Msg: err.Error()})
return
}
_, err = runSignalCli(true, []string{"--config", a.signalCliConfig, "-u", number, "quitGroup", "-g", internalGroupId}, "")
if err != nil {
c.JSON(400, Error{Msg: err.Error()})
return
}
c.Status(http.StatusNoContent)
}

View File

@@ -287,8 +287,51 @@ var doc = `{
}
},
"/v1/groups/{number}/{groupid}": {
"get": {
"description": "List a specific Signal Group.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Groups"
],
"summary": "List a Signal Group.",
"parameters": [
{
"type": "string",
"description": "Registered Phone Number",
"name": "number",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group ID",
"name": "groupid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/api.GroupEntry"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
}
},
"delete": {
"description": "Delete a Signal Group.",
"description": "Delete the specified Signal Group.",
"consumes": [
"application/json"
],
@@ -331,6 +374,141 @@ var doc = `{
}
}
},
"/v1/groups/{number}/{groupid}/block": {
"post": {
"description": "Block the specified Signal Group.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Groups"
],
"summary": "Block a Signal Group.",
"parameters": [
{
"type": "string",
"description": "Registered Phone Number",
"name": "number",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group ID",
"name": "groupid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "string"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
}
}
},
"/v1/groups/{number}/{groupid}/join": {
"post": {
"description": "Join the specified Signal Group.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Groups"
],
"summary": "Join a Signal Group.",
"parameters": [
{
"type": "string",
"description": "Registered Phone Number",
"name": "number",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group ID",
"name": "groupid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "string"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
}
}
},
"/v1/groups/{number}/{groupid}/quit": {
"post": {
"description": "Quit the specified Signal Group.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Groups"
],
"summary": "Quit a Signal Group.",
"parameters": [
{
"type": "string",
"description": "Registered Phone Number",
"name": "number",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group ID",
"name": "groupid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "string"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
}
}
},
"/v1/health": {
"get": {
"description": "Internally used by the docker container to perform the health check.",
@@ -896,7 +1074,7 @@ var doc = `{
},
"tags": [
{
"description": "List general information.",
"description": "Some general endpoints.",
"name": "General"
},
{

View File

@@ -272,8 +272,51 @@
}
},
"/v1/groups/{number}/{groupid}": {
"get": {
"description": "List a specific Signal Group.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Groups"
],
"summary": "List a Signal Group.",
"parameters": [
{
"type": "string",
"description": "Registered Phone Number",
"name": "number",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group ID",
"name": "groupid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/api.GroupEntry"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
}
},
"delete": {
"description": "Delete a Signal Group.",
"description": "Delete the specified Signal Group.",
"consumes": [
"application/json"
],
@@ -316,6 +359,141 @@
}
}
},
"/v1/groups/{number}/{groupid}/block": {
"post": {
"description": "Block the specified Signal Group.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Groups"
],
"summary": "Block a Signal Group.",
"parameters": [
{
"type": "string",
"description": "Registered Phone Number",
"name": "number",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group ID",
"name": "groupid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "string"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
}
}
},
"/v1/groups/{number}/{groupid}/join": {
"post": {
"description": "Join the specified Signal Group.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Groups"
],
"summary": "Join a Signal Group.",
"parameters": [
{
"type": "string",
"description": "Registered Phone Number",
"name": "number",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group ID",
"name": "groupid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "string"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
}
}
},
"/v1/groups/{number}/{groupid}/quit": {
"post": {
"description": "Quit the specified Signal Group.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Groups"
],
"summary": "Quit a Signal Group.",
"parameters": [
{
"type": "string",
"description": "Registered Phone Number",
"name": "number",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group ID",
"name": "groupid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "string"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/api.Error"
}
}
}
}
},
"/v1/health": {
"get": {
"description": "Internally used by the docker container to perform the health check.",
@@ -881,7 +1059,7 @@
},
"tags": [
{
"description": "List general information.",
"description": "Some general endpoints.",
"name": "General"
},
{

View File

@@ -299,7 +299,7 @@ paths:
delete:
consumes:
- application/json
description: Delete a Signal Group.
description: Delete the specified Signal Group.
parameters:
- description: Registered Phone Number
in: path
@@ -325,6 +325,125 @@ paths:
summary: Delete a Signal Group.
tags:
- Groups
get:
consumes:
- application/json
description: List a specific Signal Group.
parameters:
- description: Registered Phone Number
in: path
name: number
required: true
type: string
- description: Group ID
in: path
name: groupid
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/api.GroupEntry'
"400":
description: Bad Request
schema:
$ref: '#/definitions/api.Error'
summary: List a Signal Group.
tags:
- Groups
/v1/groups/{number}/{groupid}/block:
post:
consumes:
- application/json
description: Block the specified Signal Group.
parameters:
- description: Registered Phone Number
in: path
name: number
required: true
type: string
- description: Group ID
in: path
name: groupid
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
type: string
"400":
description: Bad Request
schema:
$ref: '#/definitions/api.Error'
summary: Block a Signal Group.
tags:
- Groups
/v1/groups/{number}/{groupid}/join:
post:
consumes:
- application/json
description: Join the specified Signal Group.
parameters:
- description: Registered Phone Number
in: path
name: number
required: true
type: string
- description: Group ID
in: path
name: groupid
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
type: string
"400":
description: Bad Request
schema:
$ref: '#/definitions/api.Error'
summary: Join a Signal Group.
tags:
- Groups
/v1/groups/{number}/{groupid}/quit:
post:
consumes:
- application/json
description: Quit the specified Signal Group.
parameters:
- description: Registered Phone Number
in: path
name: number
required: true
type: string
- description: Group ID
in: path
name: groupid
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
type: string
"400":
description: Bad Request
schema:
$ref: '#/definitions/api.Error'
summary: Quit a Signal Group.
tags:
- Groups
/v1/health:
get:
description: Internally used by the docker container to perform the health check.
@@ -579,7 +698,7 @@ paths:
- Messages
swagger: "2.0"
tags:
- description: List general information.
- description: Some general endpoints.
name: General
- description: Register and link Devices.
name: Devices

View File

@@ -98,6 +98,9 @@ func main() {
groups.GET(":number", api.GetGroups)
groups.GET(":number/:groupid", api.GetGroup)
groups.DELETE(":number/:groupid", api.DeleteGroup)
groups.POST(":number/:groupid/block", api.BlockGroup)
groups.POST(":number/:groupid/join", api.JoinGroup)
groups.POST(":number/:groupid/quit", api.QuitGroup)
}
link := v1.Group("qrcodelink")