Write - Write relationships and attributes to writeDB
(ctx context.Context, request *v1.DataWriteRequest)
| 157 | |
| 158 | // Write - Write relationships and attributes to writeDB |
| 159 | func (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 { |
nothing calls this directly
no test coverage detected