mirror of
https://github.com/pomerium/pomerium.git
synced 2025-07-05 19:08:03 +02:00
36 lines
1 KiB
Go
36 lines
1 KiB
Go
package storage
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"google.golang.org/protobuf/types/known/anypb"
|
|
"google.golang.org/protobuf/types/known/fieldmaskpb"
|
|
|
|
"github.com/pomerium/pomerium/pkg/grpc/databroker"
|
|
"github.com/pomerium/pomerium/pkg/protoutil"
|
|
)
|
|
|
|
// PatchRecord extracts the data from existing and record, updates the existing
|
|
// data subject to the provided field mask, and stores the result back into
|
|
// record. The existing record is not modified.
|
|
func PatchRecord(existing, record *databroker.Record, fields *fieldmaskpb.FieldMask) error {
|
|
dst, err := existing.GetData().UnmarshalNew()
|
|
if err != nil {
|
|
return fmt.Errorf("could not unmarshal existing record data: %w", err)
|
|
}
|
|
|
|
src, err := record.GetData().UnmarshalNew()
|
|
if err != nil {
|
|
return fmt.Errorf("could not unmarshal new record data: %w", err)
|
|
}
|
|
|
|
if err := protoutil.OverwriteMasked(dst, src, fields); err != nil {
|
|
return fmt.Errorf("cannot patch record: %w", err)
|
|
}
|
|
|
|
record.Data, err = anypb.New(dst)
|
|
if err != nil {
|
|
return fmt.Errorf("could not marshal new record data: %w", err)
|
|
}
|
|
return nil
|
|
}
|