-
-
Notifications
You must be signed in to change notification settings - Fork 17
/
deleteDevices.go
60 lines (52 loc) · 2.1 KB
/
deleteDevices.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package service
import (
"context"
"github.com/plgd-dev/hub/v2/pkg/log"
kitNetGrpc "github.com/plgd-dev/hub/v2/pkg/net/grpc"
"github.com/plgd-dev/hub/v2/resource-aggregate/commands"
"github.com/plgd-dev/hub/v2/resource-aggregate/cqrs/eventstore"
"github.com/plgd-dev/kit/v2/strings"
"google.golang.org/grpc/codes"
)
func getUniqueDeviceIdsFromDeleteRequest(request *commands.DeleteDevicesRequest) []string {
deviceIDs := make(strings.Set)
for _, deviceID := range request.DeviceIds {
if deviceID != "" {
deviceIDs.Add(deviceID)
}
}
return deviceIDs.ToSlice()
}
// Delete documents from events database for devices selected by query
//
// Using empty deviceIdFilter in DeleteDevicesRequest is interpreting as requesting
// to delete all documents for devices owned by the user.
//
// Function returns error or a non-empty DeleteDevicesResponse message, where the DeviceIds
// field is filled with list of device ids. The list is an intersection of the list provided
// by DeleteDevicesRequest and device ids owned by the user (ie. from the original list of device
// ids it filters out devices that are not owned by the user).
func (r RequestHandler) DeleteDevices(ctx context.Context, request *commands.DeleteDevicesRequest) (*commands.DeleteDevicesResponse, error) {
deviceIds := getUniqueDeviceIdsFromDeleteRequest(request)
owner, ownedDevices, err := r.getOwnedDevices(ctx, deviceIds)
if err != nil {
return nil, log.LogAndReturnError(kitNetGrpc.ForwardErrorf(codes.Internal, "cannot validate user access: %v", err))
}
if len(ownedDevices) == 0 {
return &commands.DeleteDevicesResponse{
DeviceIds: nil,
AuditContext: commands.NewAuditContext(owner, ""),
}, nil
}
queries := make([]eventstore.DeleteQuery, len(ownedDevices))
for i, dev := range ownedDevices {
queries[i].GroupID = dev
}
if err := r.eventstore.Delete(ctx, queries); err != nil {
return nil, log.LogAndReturnError(kitNetGrpc.ForwardErrorf(codes.Internal, "cannot delete devices: %v", err))
}
return &commands.DeleteDevicesResponse{
DeviceIds: ownedDevices,
AuditContext: commands.NewAuditContext(owner, ""),
}, nil
}