From 5435b12e810cf16e51a2b3123f32a9906a54cd9d Mon Sep 17 00:00:00 2001 From: Bernhard B Date: Thu, 19 Mar 2026 17:24:30 +0100 Subject: [PATCH 1/4] Revert "added query parameter 'use_only_uuid_as_identifier' to group(s) GET endpoint" This reverts commit 44ce4fe83d964f39d6677fa46186bc1126fd069c. --- src/api/api.go | 18 ++---------------- src/client/client.go | 42 +++++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 37 deletions(-) diff --git a/src/api/api.go b/src/api/api.go index a169480..b36a5d9 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -1024,7 +1024,6 @@ func (a *Api) RemoveAdminsFromGroup(c *gin.Context) { // @Success 200 {object} []client.GroupEntry // @Failure 400 {object} Error // @Param number path string true "Registered Phone Number" -// @Param use_only_uuid_as_identifier query bool false "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members" // @Router /v1/groups/{number} [get] func (a *Api) GetGroups(c *gin.Context) { number, err := url.PathUnescape(c.Param("number")) @@ -1033,13 +1032,7 @@ func (a *Api) GetGroups(c *gin.Context) { return } - useOnlyUuidAsIdentifier := c.DefaultQuery("use_only_uuid_as_identifier", "false") - if useOnlyUuidAsIdentifier != "true" && useOnlyUuidAsIdentifier != "false" { - c.JSON(400, Error{Msg: "Couldn't process request - use_only_uuid_as_identifier parameter needs to be either 'true' or 'false'"}) - return - } - - groups, err := a.signalClient.GetGroups(number, StringToBool(useOnlyUuidAsIdentifier)) + groups, err := a.signalClient.GetGroups(number) if err != nil { c.JSON(400, Error{Msg: err.Error()}) return @@ -1057,7 +1050,6 @@ func (a *Api) GetGroups(c *gin.Context) { // @Failure 400 {object} Error // @Param number path string true "Registered Phone Number" // @Param groupid path string true "Group ID" -// @Param use_only_uuid_as_identifier query bool false "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members" // @Router /v1/groups/{number}/{groupid} [get] func (a *Api) GetGroup(c *gin.Context) { number, err := url.PathUnescape(c.Param("number")) @@ -1067,13 +1059,7 @@ func (a *Api) GetGroup(c *gin.Context) { } groupId := c.Param("groupid") - useOnlyUuidAsIdentifier := c.DefaultQuery("use_only_uuid_as_identifier", "false") - if useOnlyUuidAsIdentifier != "true" && useOnlyUuidAsIdentifier != "false" { - c.JSON(400, Error{Msg: "Couldn't process request - use_only_uuid_as_identifier parameter needs to be either 'true' or 'false'"}) - return - } - - groupEntry, err := a.signalClient.GetGroup(number, groupId, StringToBool(useOnlyUuidAsIdentifier)) + groupEntry, err := a.signalClient.GetGroup(number, groupId) if err != nil { c.JSON(400, Error{Msg: err.Error()}) return diff --git a/src/client/client.go b/src/client/client.go index b2db5dd..fa3f937 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -341,18 +341,6 @@ func getSignalCliModeString(signalCliMode SignalCliMode) string { return "unknown" } -func pickGroupMemberIdentifier(number string, uuid string, useOnlyUuidAsIdentifier bool) string { - if useOnlyUuidAsIdentifier { - return uuid - } - - if number != "" { - return number - } - - return uuid -} - func getRecipientType(s string) (ds.RecpType, error) { // check if the provided recipient is of type 'group' if strings.HasPrefix(s, groupPrefix) { // if the recipient starts with 'group.' it is either a group or a username that starts with 'group.' @@ -1193,7 +1181,7 @@ func (s *SignalClient) updateGroupMembers(number string, groupId string, members return nil } - group, err := s.GetGroup(number, groupId, false) + group, err := s.GetGroup(number, groupId) if err != nil { return err } @@ -1255,7 +1243,7 @@ func (s *SignalClient) updateGroupAdmins(number string, groupId string, admins [ return nil } - group, err := s.GetGroup(number, groupId, false) + group, err := s.GetGroup(number, groupId) if err != nil { return err } @@ -1312,7 +1300,7 @@ func (s *SignalClient) RemoveAdminsFromGroup(number string, groupId string, admi return s.updateGroupAdmins(number, groupId, admins, false) } -func (s *SignalClient) GetGroups(number string, useOnlyUuidAsIdentifier bool) ([]GroupEntry, error) { +func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { groupEntries := []GroupEntry{} var signalCliGroupEntries []SignalCliGroupEntry @@ -1353,28 +1341,40 @@ func (s *SignalClient) GetGroups(number string, useOnlyUuidAsIdentifier bool) ([ members := []string{} for _, val := range signalCliGroupEntry.Members { - identifier := pickGroupMemberIdentifier(val.Number, val.Uuid, useOnlyUuidAsIdentifier) + identifier := val.Number + if identifier == "" { + identifier = val.Uuid + } members = append(members, identifier) } groupEntry.Members = members pendingMembers := []string{} for _, val := range signalCliGroupEntry.PendingMembers { - identifier := pickGroupMemberIdentifier(val.Number, val.Uuid, useOnlyUuidAsIdentifier) + identifier := val.Number + if identifier == "" { + identifier = val.Uuid + } pendingMembers = append(pendingMembers, identifier) } groupEntry.PendingInvites = pendingMembers requestingMembers := []string{} for _, val := range signalCliGroupEntry.RequestingMembers { - identifier := pickGroupMemberIdentifier(val.Number, val.Uuid, useOnlyUuidAsIdentifier) + identifier := val.Number + if identifier == "" { + identifier = val.Uuid + } requestingMembers = append(requestingMembers, identifier) } groupEntry.PendingRequests = requestingMembers admins := []string{} for _, val := range signalCliGroupEntry.Admins { - identifier := pickGroupMemberIdentifier(val.Number, val.Uuid, useOnlyUuidAsIdentifier) + identifier := val.Number + if identifier == "" { + identifier = val.Uuid + } admins = append(admins, identifier) } groupEntry.Admins = admins @@ -1387,9 +1387,9 @@ func (s *SignalClient) GetGroups(number string, useOnlyUuidAsIdentifier bool) ([ return groupEntries, nil } -func (s *SignalClient) GetGroup(number string, groupId string, useOnlyUuidAsIdentifier bool) (*GroupEntry, error) { +func (s *SignalClient) GetGroup(number string, groupId string) (*GroupEntry, error) { groupEntry := GroupEntry{} - groups, err := s.GetGroups(number, useOnlyUuidAsIdentifier) + groups, err := s.GetGroups(number) if err != nil { return nil, err } From d45b906aa9d10d6d7fb50ebb76daf023f66b80bf Mon Sep 17 00:00:00 2001 From: Bernhard B Date: Sat, 21 Mar 2026 19:48:10 +0100 Subject: [PATCH 2/4] regenerated swagger documentation --- src/docs/docs.go | 12 ------------ src/docs/swagger.json | 12 ------------ src/docs/swagger.yaml | 10 ---------- 3 files changed, 34 deletions(-) diff --git a/src/docs/docs.go b/src/docs/docs.go index 23dbbb6..8137eb7 100644 --- a/src/docs/docs.go +++ b/src/docs/docs.go @@ -917,12 +917,6 @@ const docTemplate = `{ "name": "number", "in": "path", "required": true - }, - { - "type": "boolean", - "description": "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members", - "name": "use_only_uuid_as_identifier", - "in": "query" } ], "responses": { @@ -1016,12 +1010,6 @@ const docTemplate = `{ "name": "groupid", "in": "path", "required": true - }, - { - "type": "boolean", - "description": "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members", - "name": "use_only_uuid_as_identifier", - "in": "query" } ], "responses": { diff --git a/src/docs/swagger.json b/src/docs/swagger.json index 241a2e4..5337561 100644 --- a/src/docs/swagger.json +++ b/src/docs/swagger.json @@ -914,12 +914,6 @@ "name": "number", "in": "path", "required": true - }, - { - "type": "boolean", - "description": "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members", - "name": "use_only_uuid_as_identifier", - "in": "query" } ], "responses": { @@ -1013,12 +1007,6 @@ "name": "groupid", "in": "path", "required": true - }, - { - "type": "boolean", - "description": "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members", - "name": "use_only_uuid_as_identifier", - "in": "query" } ], "responses": { diff --git a/src/docs/swagger.yaml b/src/docs/swagger.yaml index b2e2394..f1638c7 100644 --- a/src/docs/swagger.yaml +++ b/src/docs/swagger.yaml @@ -1163,11 +1163,6 @@ paths: name: number required: true type: string - - description: Use UUIDs instead of phone numbers as identifier for (pending|requesting) - members - in: query - name: use_only_uuid_as_identifier - type: boolean produces: - application/json responses: @@ -1259,11 +1254,6 @@ paths: name: groupid required: true type: string - - description: Use UUIDs instead of phone numbers as identifier for (pending|requesting) - members - in: query - name: use_only_uuid_as_identifier - type: boolean produces: - application/json responses: From f142e8089c1d2386070f97e2bbe462c3e0e2e0b9 Mon Sep 17 00:00:00 2001 From: Bernhard B Date: Sat, 21 Mar 2026 19:49:26 +0100 Subject: [PATCH 3/4] added new json-rpc-native mode --- README.md | 3 ++- entrypoint.sh | 2 +- src/main.go | 2 +- src/scripts/jsonrpc2-helper.go | 10 ++++++++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9ef2b7a..6b7d940 100644 --- a/README.md +++ b/README.md @@ -58,13 +58,14 @@ The `signal-cli-rest-api` supports three different modes of execution, which can * **`normal` Mode: (Default)** The `signal-cli` executable is invoked for every REST API request. Being a Java application, each REST call requires a new startup of the JVM (Java Virtual Machine), increasing the latency and hence leading to the slowest mode of operation. * **`native` Mode:** A precompiled binary `signal-cli-native` (using GraalVM) is used for every REST API request. This results in a much lower latency & memory usage on each call. On the `armv7` platform this mode is not available and falls back to `normal`. The native mode may also be less stable, due to the experimental state of GraalVM compiler. * `json-rpc` Mode: A single, JVM-based `signal-cli` instance is spawned as daemon process. This mode is usually the fastest, but requires more memory as the JVM keeps running. - +* `json-rpc-native` Mode: Uses the `signal-cli-native` binary and starts it in daemon mode (this mode basically combines the advantages of the `native` mode and the `json-rpc` mode). | mode | speed | resident memory usage | | ---------: | :------------------------------------------------------- | :-------------------- | | `normal` | :heavy_check_mark: | normal | | `native` | :heavy_check_mark: :heavy_check_mark: | normal | | `json-rpc` | :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: | increased | +| `json-rpc-native` | :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: | normal | **Example of running `signal-cli-rest` in `native` mode** diff --git a/entrypoint.sh b/entrypoint.sh index 05363d3..027254a 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -27,7 +27,7 @@ cap_prefix="-cap_" caps="$cap_prefix$(seq -s ",$cap_prefix" 0 $(cat /proc/sys/kernel/cap_last_cap))" # TODO: check mode -if [ "$MODE" = "json-rpc" ] +if [ "$MODE" = "json-rpc" ] || [ "$MODE" = "json-rpc-native" ] then /usr/bin/jsonrpc2-helper if [ -n "$JAVA_OPTS" ] ; then diff --git a/src/main.go b/src/main.go index 6c271ce..b71ab2d 100644 --- a/src/main.go +++ b/src/main.go @@ -123,7 +123,7 @@ func main() { mode := utils.GetEnv("MODE", "normal") if mode == "normal" { signalCliMode = client.Normal - } else if mode == "json-rpc" { + } else if mode == "json-rpc" || mode == "json-rpc-native" { signalCliMode = client.JsonRpc } else if mode == "native" { signalCliMode = client.Native diff --git a/src/scripts/jsonrpc2-helper.go b/src/scripts/jsonrpc2-helper.go index 36e3f0b..cc34071 100644 --- a/src/scripts/jsonrpc2-helper.go +++ b/src/scripts/jsonrpc2-helper.go @@ -13,7 +13,7 @@ import ( const supervisorctlConfigTemplate = ` [program:%s] process_name=%s -command=signal-cli --output=json --config %s%s daemon %s%s%s%s --tcp 127.0.0.1:%d +command=%s --output=json --config %s%s daemon %s%s%s%s --tcp 127.0.0.1:%d autostart=true autorestart=true startretries=10 @@ -43,6 +43,12 @@ func main() { jsonRpc2ClientConfig.AddEntry(utils.MULTI_ACCOUNT_NUMBER, utils.JsonRpc2ClientConfigEntry{TcpPort: tcpPort}) + signalCliBinary := "signal-cli" + signalMode := utils.GetEnv("MODE", "json-rpc") + if signalMode == "json-rpc-native" { + signalCliBinary = "signal-cli-native" + } + signalCliIgnoreAttachments := "" ignoreAttachments := utils.GetEnv("JSON_RPC_IGNORE_ATTACHMENTS", "") if ignoreAttachments == "true" { @@ -91,7 +97,7 @@ func main() { //write supervisorctl config supervisorctlConfigFilename := "/etc/supervisor/conf.d/" + "signal-cli-json-rpc-1.conf" - supervisorctlConfig := fmt.Sprintf(supervisorctlConfigTemplate, supervisorctlProgramName, supervisorctlProgramName, + supervisorctlConfig := fmt.Sprintf(supervisorctlConfigTemplate, supervisorctlProgramName, supervisorctlProgramName, signalCliBinary, signalCliConfigDir, trustNewIdentities, signalCliIgnoreAttachments, signalCliIgnoreStories, signalCliIgnoreAvatars, signalCliIgnoreStickers, tcpPort, supervisorctlProgramName, supervisorctlProgramName) From 6ca5ff1aeeb12fb6a1be98977e8ea7fff435b669 Mon Sep 17 00:00:00 2001 From: Bernhard B Date: Sat, 21 Mar 2026 21:38:49 +0100 Subject: [PATCH 4/4] added expand query parameter to /groups endpoints see #790 --- src/api/api.go | 43 ++++++++++++-- src/client/client.go | 130 +++++++++++++++++++++++++++++------------- src/docs/docs.go | 12 ++++ src/docs/swagger.json | 12 ++++ src/docs/swagger.yaml | 8 +++ 5 files changed, 160 insertions(+), 45 deletions(-) diff --git a/src/api/api.go b/src/api/api.go index b36a5d9..d12efdd 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -1024,6 +1024,7 @@ func (a *Api) RemoveAdminsFromGroup(c *gin.Context) { // @Success 200 {object} []client.GroupEntry // @Failure 400 {object} Error // @Param number path string true "Registered Phone Number" +// @Param expand query bool false "Expand the response to show more details (default: false)" // @Router /v1/groups/{number} [get] func (a *Api) GetGroups(c *gin.Context) { number, err := url.PathUnescape(c.Param("number")) @@ -1032,12 +1033,26 @@ func (a *Api) GetGroups(c *gin.Context) { return } - groups, err := a.signalClient.GetGroups(number) - if err != nil { - c.JSON(400, Error{Msg: err.Error()}) + expand := c.DefaultQuery("expand", "false") + if expand != "true" && expand != "false" { + c.JSON(400, Error{Msg: "Couldn't process request - expand parameter needs to be either 'true' or 'false'"}) return } + var groups any + if StringToBool(expand) { + groups, err = a.signalClient.GetGroupsExpanded(number) + if err != nil { + c.JSON(400, Error{Msg: err.Error()}) + return + } + } else { + groups, err = a.signalClient.GetGroups(number) + if err != nil { + c.JSON(400, Error{Msg: err.Error()}) + return + } + } c.JSON(200, groups) } @@ -1050,6 +1065,7 @@ func (a *Api) GetGroups(c *gin.Context) { // @Failure 400 {object} Error // @Param number path string true "Registered Phone Number" // @Param groupid path string true "Group ID" +// @Param expand query bool false "Expand the response to show more details (default: false)" // @Router /v1/groups/{number}/{groupid} [get] func (a *Api) GetGroup(c *gin.Context) { number, err := url.PathUnescape(c.Param("number")) @@ -1059,12 +1075,27 @@ func (a *Api) GetGroup(c *gin.Context) { } groupId := c.Param("groupid") - groupEntry, err := a.signalClient.GetGroup(number, groupId) - if err != nil { - c.JSON(400, Error{Msg: err.Error()}) + expand := c.DefaultQuery("expand", "false") + if expand != "true" && expand != "false" { + c.JSON(400, Error{Msg: "Couldn't process request - expand parameter needs to be either 'true' or 'false'"}) return } + var groupEntry any + if StringToBool(expand) { + groupEntry, err = a.signalClient.GetGroupExpanded(number, groupId) + if err != nil { + c.JSON(400, Error{Msg: err.Error()}) + return + } + } else { + groupEntry, err = a.signalClient.GetGroup(number, groupId) + if err != nil { + c.JSON(400, Error{Msg: err.Error()}) + return + } + } + if groupEntry != nil { c.JSON(200, groupEntry) } else { diff --git a/src/client/client.go b/src/client/client.go index fa3f937..5bf2fea 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -126,6 +126,30 @@ type GroupEntry struct { Permissions ds.GroupPermissions `json:"permissions"` } +type GroupMember struct { + Number string `json:"number"` + Uuid string `json:"uuid"` +} + +type GroupAdmin struct { + Number string `json:"number"` + Uuid string `json:"uuid"` +} + +type ExpandedGroupEntry struct { + Name string `json:"name"` + Description string `json:"description"` + Id string `json:"id"` + InternalId string `json:"internal_id"` + Members []GroupMember `json:"members"` + Blocked bool `json:"blocked"` + PendingInvites []GroupMember `json:"pending_invites"` + PendingRequests []GroupMember `json:"pending_requests"` + InviteLink string `json:"invite_link"` + Admins []GroupAdmin `json:"admins"` + Permissions ds.GroupPermissions `json:"permissions"` +} + type IdentityEntry struct { Number string `json:"number"` Status string `json:"status"` @@ -135,31 +159,21 @@ type IdentityEntry struct { Uuid string `json:"uuid"` } -type SignalCliGroupMember struct { - Number string `json:"number"` - Uuid string `json:"uuid"` -} - -type SignalCliGroupAdmin struct { - Number string `json:"number"` - Uuid string `json:"uuid"` -} - type SignalCliGroupEntry struct { - Name string `json:"name"` - Description string `json:"description"` - Id string `json:"id"` - IsMember bool `json:"isMember"` - IsBlocked bool `json:"isBlocked"` - Members []SignalCliGroupMember `json:"members"` - PendingMembers []SignalCliGroupMember `json:"pendingMembers"` - RequestingMembers []SignalCliGroupMember `json:"requestingMembers"` - GroupInviteLink string `json:"groupInviteLink"` - Admins []SignalCliGroupAdmin `json:"admins"` - Uuid string `json:"uuid"` - PermissionEditDetails string `json:"permissionEditDetails"` - PermissionAddMember string `json:"permissionAddMember"` - PermissionSendMessage string `json:"permissionSendMessage"` + Name string `json:"name"` + Description string `json:"description"` + Id string `json:"id"` + IsMember bool `json:"isMember"` + IsBlocked bool `json:"isBlocked"` + Members []GroupMember `json:"members"` + PendingMembers []GroupMember `json:"pendingMembers"` + RequestingMembers []GroupMember `json:"requestingMembers"` + GroupInviteLink string `json:"groupInviteLink"` + Admins []GroupAdmin `json:"admins"` + Uuid string `json:"uuid"` + PermissionEditDetails string `json:"permissionEditDetails"` + PermissionAddMember string `json:"permissionAddMember"` + PermissionSendMessage string `json:"permissionSendMessage"` } type SignalCliIdentityEntry struct { @@ -1300,8 +1314,8 @@ func (s *SignalClient) RemoveAdminsFromGroup(number string, groupId string, admi return s.updateGroupAdmins(number, groupId, admins, false) } -func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { - groupEntries := []GroupEntry{} +func (s *SignalClient) GetGroupsExpanded(number string) ([]ExpandedGroupEntry, error) { + groupEntries := []ExpandedGroupEntry{} var signalCliGroupEntries []SignalCliGroupEntry var err error @@ -1329,7 +1343,7 @@ func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { } for _, signalCliGroupEntry := range signalCliGroupEntries { - var groupEntry GroupEntry + var groupEntry ExpandedGroupEntry groupEntry.InternalId = signalCliGroupEntry.Id groupEntry.Name = signalCliGroupEntry.Name groupEntry.Id = convertInternalGroupIdToGroupId(signalCliGroupEntry.Id) @@ -1338,9 +1352,32 @@ func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { groupEntry.Permissions.SendMessages = signalCliGroupPermissionToRestApiGroupPermission(signalCliGroupEntry.PermissionSendMessage) groupEntry.Permissions.EditGroup = signalCliGroupPermissionToRestApiGroupPermission(signalCliGroupEntry.PermissionSendMessage) groupEntry.Permissions.AddMembers = signalCliGroupPermissionToRestApiGroupPermission(signalCliGroupEntry.PermissionAddMember) + groupEntry.Members = signalCliGroupEntry.Members + groupEntry.PendingInvites = signalCliGroupEntry.PendingMembers + groupEntry.PendingRequests = signalCliGroupEntry.RequestingMembers + groupEntry.Admins = signalCliGroupEntry.Admins + groupEntry.InviteLink = signalCliGroupEntry.GroupInviteLink + + groupEntries = append(groupEntries, groupEntry) + } + + return groupEntries, nil +} + +func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { + expandedGroupEntries, err := s.GetGroupsExpanded(number) + if err != nil { + return []GroupEntry{}, err + } + + groupEntries := []GroupEntry{} + for _, expandedGroupEntry := range expandedGroupEntries { + groupEntry := GroupEntry{InternalId: expandedGroupEntry.InternalId, Name: expandedGroupEntry.Name, + Id: expandedGroupEntry.Id, Blocked: expandedGroupEntry.Blocked, Description: expandedGroupEntry.Description, + Permissions: expandedGroupEntry.Permissions, InviteLink: expandedGroupEntry.InviteLink} members := []string{} - for _, val := range signalCliGroupEntry.Members { + for _, val := range expandedGroupEntry.Members { identifier := val.Number if identifier == "" { identifier = val.Uuid @@ -1349,28 +1386,28 @@ func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { } groupEntry.Members = members - pendingMembers := []string{} - for _, val := range signalCliGroupEntry.PendingMembers { + pendingInvites := []string{} + for _, val := range expandedGroupEntry.PendingInvites { identifier := val.Number if identifier == "" { identifier = val.Uuid } - pendingMembers = append(pendingMembers, identifier) + pendingInvites = append(pendingInvites, identifier) } - groupEntry.PendingInvites = pendingMembers + groupEntry.PendingInvites = pendingInvites - requestingMembers := []string{} - for _, val := range signalCliGroupEntry.RequestingMembers { + pendingRequests := []string{} + for _, val := range expandedGroupEntry.PendingRequests { identifier := val.Number if identifier == "" { identifier = val.Uuid } - requestingMembers = append(requestingMembers, identifier) + pendingRequests = append(pendingRequests, identifier) } - groupEntry.PendingRequests = requestingMembers + groupEntry.PendingRequests = pendingRequests admins := []string{} - for _, val := range signalCliGroupEntry.Admins { + for _, val := range expandedGroupEntry.Admins { identifier := val.Number if identifier == "" { identifier = val.Uuid @@ -1379,8 +1416,6 @@ func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { } groupEntry.Admins = admins - groupEntry.InviteLink = signalCliGroupEntry.GroupInviteLink - groupEntries = append(groupEntries, groupEntry) } @@ -1404,6 +1439,23 @@ func (s *SignalClient) GetGroup(number string, groupId string) (*GroupEntry, err return nil, nil } +func (s *SignalClient) GetGroupExpanded(number string, groupId string) (*ExpandedGroupEntry, error) { + groupEntry := ExpandedGroupEntry{} + groups, err := s.GetGroupsExpanded(number) + if err != nil { + return nil, err + } + + for _, group := range groups { + if group.Id == groupId { + groupEntry = group + return &groupEntry, nil + } + } + + return nil, nil +} + func (s *SignalClient) GetAvatar(number string, id string, avatarType AvatarType) ([]byte, error) { var err error var rawData string diff --git a/src/docs/docs.go b/src/docs/docs.go index 8137eb7..e46b0dd 100644 --- a/src/docs/docs.go +++ b/src/docs/docs.go @@ -917,6 +917,12 @@ const docTemplate = `{ "name": "number", "in": "path", "required": true + }, + { + "type": "boolean", + "description": "Expand the response to show more details (default: false)", + "name": "expand", + "in": "query" } ], "responses": { @@ -1010,6 +1016,12 @@ const docTemplate = `{ "name": "groupid", "in": "path", "required": true + }, + { + "type": "boolean", + "description": "Expand the response to show more details (default: false)", + "name": "expand", + "in": "query" } ], "responses": { diff --git a/src/docs/swagger.json b/src/docs/swagger.json index 5337561..8ab740d 100644 --- a/src/docs/swagger.json +++ b/src/docs/swagger.json @@ -914,6 +914,12 @@ "name": "number", "in": "path", "required": true + }, + { + "type": "boolean", + "description": "Expand the response to show more details (default: false)", + "name": "expand", + "in": "query" } ], "responses": { @@ -1007,6 +1013,12 @@ "name": "groupid", "in": "path", "required": true + }, + { + "type": "boolean", + "description": "Expand the response to show more details (default: false)", + "name": "expand", + "in": "query" } ], "responses": { diff --git a/src/docs/swagger.yaml b/src/docs/swagger.yaml index f1638c7..b189493 100644 --- a/src/docs/swagger.yaml +++ b/src/docs/swagger.yaml @@ -1163,6 +1163,10 @@ paths: name: number required: true type: string + - description: 'Expand the response to show more details (default: false)' + in: query + name: expand + type: boolean produces: - application/json responses: @@ -1254,6 +1258,10 @@ paths: name: groupid required: true type: string + - description: 'Expand the response to show more details (default: false)' + in: query + name: expand + type: boolean produces: - application/json responses: