Write - Configure new Permify Schema to Permify
(ctx context.Context, request *v1.SchemaWriteRequest)
| 44 | |
| 45 | // Write - Configure new Permify Schema to Permify |
| 46 | func (r *SchemaServer) Write(ctx context.Context, request *v1.SchemaWriteRequest) (*v1.SchemaWriteResponse, error) { |
| 47 | ctx, span := internal.Tracer.Start(ctx, "schemas.write") |
| 48 | defer span.End() |
| 49 | |
| 50 | sch, err := parser.NewParser(request.GetSchema()).Parse() |
| 51 | if err != nil { |
| 52 | span.RecordError(err) |
| 53 | span.SetStatus(otelCodes.Error, err.Error()) |
| 54 | return nil, status.Error(GetStatus(err), err.Error()) // Return parse error |
| 55 | } |
| 56 | |
| 57 | _, _, err = compiler.NewCompiler(true, sch).Compile() |
| 58 | if err != nil { |
| 59 | span.RecordError(err) |
| 60 | span.SetStatus(otelCodes.Error, err.Error()) |
| 61 | return nil, status.Error(GetStatus(err), err.Error()) // Return compile error |
| 62 | } |
| 63 | |
| 64 | version := xid.New().String() |
| 65 | |
| 66 | cnf := make([]storage.SchemaDefinition, 0, len(sch.Statements)) |
| 67 | for _, st := range sch.Statements { |
| 68 | cnf = append(cnf, storage.SchemaDefinition{ |
| 69 | TenantID: request.GetTenantId(), |
| 70 | Version: version, |
| 71 | Name: st.GetName(), |
| 72 | SerializedDefinition: []byte(st.String()), |
| 73 | }) |
| 74 | } |
| 75 | |
| 76 | err = r.sw.WriteSchema(ctx, cnf) |
| 77 | if err != nil { |
| 78 | span.RecordError(err) |
| 79 | span.SetStatus(otelCodes.Error, err.Error()) |
| 80 | slog.ErrorContext(ctx, err.Error()) |
| 81 | return nil, status.Error(GetStatus(err), err.Error()) |
| 82 | } |
| 83 | |
| 84 | r.writeSchemaHistogram.Record(ctx, 1) |
| 85 | |
| 86 | return &v1.SchemaWriteResponse{ |
| 87 | SchemaVersion: version, |
| 88 | }, nil |
| 89 | } |
| 90 | |
| 91 | // PartialWrite applies incremental updates to the schema of a specific tenant based on the provided request. |
| 92 | func (r *SchemaServer) PartialWrite(ctx context.Context, request *v1.SchemaPartialWriteRequest) (*v1.SchemaPartialWriteResponse, error) { |
nothing calls this directly
no test coverage detected