Passed
Push — master ( 529ae6...944870 )
by Tolga
06:00 queued 02:43
created

servers.*BundleServer.Read   A

Complexity

Conditions 3

Size

Total Lines 20
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 15
nop 2
dl 0
loc 20
rs 9.65
c 0
b 0
f 0
1
package servers
2
3
import (
4
	"context"
5
	"log/slog"
6
7
	otelCodes "go.opentelemetry.io/otel/codes"
8
	"google.golang.org/grpc/status"
9
10
	"github.com/Permify/permify/internal"
11
	"github.com/Permify/permify/internal/storage"
12
	"github.com/Permify/permify/internal/validation"
13
	v1 "github.com/Permify/permify/pkg/pb/base/v1"
14
)
15
16
// BundleServer handles bundle operations.
17
type BundleServer struct {
18
	v1.UnimplementedBundleServer
19
20
	br storage.BundleReader
21
	bw storage.BundleWriter
22
}
23
24
func NewBundleServer(
25
	br storage.BundleReader,
26
	bw storage.BundleWriter,
27
) *BundleServer {
28
	return &BundleServer{
29
		br: br,
30
		bw: bw,
31
	}
32
}
33
34
// Write handles the writing of bundles.
35
func (r *BundleServer) Write(ctx context.Context, request *v1.BundleWriteRequest) (*v1.BundleWriteResponse, error) {
36
	ctx, span := internal.Tracer.Start(ctx, "bundle.write")
37
	defer span.End()
38
39
	v := request.Validate()
40
	if v != nil {
41
		return nil, status.Error(GetStatus(v), v.Error())
42
	}
43
44
	for _, bundle := range request.GetBundles() {
45
		for _, operation := range bundle.GetOperations() {
46
			err := validation.ValidateBundleOperation(operation)
47
			if err != nil {
48
				return nil, status.Error(GetStatus(err), err.Error())
49
			}
50
		}
51
	}
52
53
	var bundles []storage.Bundle
54
	for _, b := range request.GetBundles() {
55
		bundles = append(bundles, storage.Bundle{
56
			Name:       b.GetName(),
57
			DataBundle: b,
58
			TenantID:   request.GetTenantId(),
59
		})
60
	}
61
62
	names, err := r.bw.Write(ctx, bundles)
63
	if err != nil {
64
		span.RecordError(err)
65
		span.SetStatus(otelCodes.Error, err.Error())
66
		slog.ErrorContext(ctx, err.Error())
67
		return nil, status.Error(GetStatus(err), err.Error())
68
	}
69
70
	return &v1.BundleWriteResponse{
71
		Names: names,
72
	}, nil
73
}
74
75
// Read handles the reading of bundles.
76
func (r *BundleServer) Read(ctx context.Context, request *v1.BundleReadRequest) (*v1.BundleReadResponse, error) {
77
	ctx, span := internal.Tracer.Start(ctx, "bundle.read")
78
	defer span.End()
79
80
	v := request.Validate()
81
	if v != nil {
82
		return nil, status.Error(GetStatus(v), v.Error())
83
	}
84
85
	bundle, err := r.br.Read(ctx, request.GetTenantId(), request.GetName())
86
	if err != nil {
87
		span.RecordError(err)
88
		span.SetStatus(otelCodes.Error, err.Error())
89
		slog.ErrorContext(ctx, err.Error())
90
		return nil, status.Error(GetStatus(err), err.Error())
91
	}
92
93
	return &v1.BundleReadResponse{
94
		Bundle: bundle,
95
	}, nil
96
}
97
98
// Delete handles the deletion of bundles.
99
func (r *BundleServer) Delete(ctx context.Context, request *v1.BundleDeleteRequest) (*v1.BundleDeleteResponse, error) {
100
	ctx, span := internal.Tracer.Start(ctx, "bundle.delete")
101
	defer span.End()
102
103
	v := request.Validate()
104
	if v != nil {
105
		return nil, status.Error(GetStatus(v), v.Error())
106
	}
107
108
	err := r.bw.Delete(ctx, request.GetTenantId(), request.GetName())
109
	if err != nil {
110
		span.RecordError(err)
111
		span.SetStatus(otelCodes.Error, err.Error())
112
		slog.ErrorContext(ctx, err.Error())
113
		return nil, status.Error(GetStatus(err), err.Error())
114
	}
115
116
	return &v1.BundleDeleteResponse{
117
		Name: request.GetName(),
118
	}, nil
119
}
120