MCPcopy Create free account
hub / github.com/Permify/permify / Write

Method Write

internal/servers/data_server.go:159–252  ·  view source on GitHub ↗

Write - Write relationships and attributes to writeDB

(ctx context.Context, request *v1.DataWriteRequest)

Source from the content-addressed store, hash-verified

157
158// Write - Write relationships and attributes to writeDB
159func (r *DataServer) Write(ctx context.Context, request *v1.DataWriteRequest) (*v1.DataWriteResponse, error) {
160 ctx, span := internal.Tracer.Start(ctx, "data.write")
161 defer span.End()
162
163 v := request.Validate()
164 if v != nil {
165 return nil, status.Error(GetStatus(v), v.Error()) // Return validation error
166 }
167
168 version := request.GetMetadata().GetSchemaVersion()
169 if version == "" {
170 v, err := r.sr.HeadVersion(ctx, request.GetTenantId())
171 if err != nil {
172 span.RecordError(err)
173 span.SetStatus(otelCodes.Error, err.Error())
174 return nil, status.Error(GetStatus(err), err.Error()) // Return version error
175 }
176 version = v
177 }
178
179 relationships := make([]*v1.Tuple, 0, len(request.GetTuples()))
180
181 relationshipsMap := map[string]struct{}{}
182
183 for _, tup := range request.GetTuples() {
184 key := tuple.ToString(tup)
185
186 if _, ok := relationshipsMap[key]; ok {
187 continue
188 }
189
190 relationshipsMap[key] = struct{}{}
191
192 definition, _, err := r.sr.ReadEntityDefinition(ctx, request.GetTenantId(), tup.GetEntity().GetType(), version)
193 if err != nil {
194 span.RecordError(err)
195 span.SetStatus(otelCodes.Error, err.Error())
196 return nil, status.Error(GetStatus(err), err.Error()) // Return entity definition error
197 }
198
199 err = validation.ValidateTuple(definition, tup)
200 if err != nil {
201 span.RecordError(err)
202 span.SetStatus(otelCodes.Error, err.Error())
203 return nil, status.Error(GetStatus(err), err.Error()) // Return tuple validation error
204 }
205
206 relationships = append(relationships, tup)
207 }
208
209 attrs := make([]*v1.Attribute, 0, len(request.GetAttributes()))
210
211 attributesMap := map[string]struct{}{}
212
213 for _, attr := range request.GetAttributes() {
214 key := attribute.EntityAndAttributeToString(attr.GetEntity(), attr.GetAttribute())
215
216 if _, ok := attributesMap[key]; ok {

Callers

nothing calls this directly

Implementers 1

UnimplementedDataServerpkg/pb/base/v1/service_grpc.pb.go

Calls 15

ToStringFunction · 0.92
ValidateTupleFunction · 0.92
ValidateAttributeFunction · 0.92
NewTupleCollectionFunction · 0.92
NewAttributeCollectionFunction · 0.92
GetStatusFunction · 0.85
StartMethod · 0.80
HeadVersionMethod · 0.65
ReadEntityDefinitionMethod · 0.65
GetTypeMethod · 0.65
WriteMethod · 0.65

Tested by

no test coverage detected