Encrypt field in query

This commit is contained in:
2025-03-01 22:26:50 +01:00
parent 3ce92322f4
commit 204dacd15e

View File

@@ -13,9 +13,10 @@ type DBField struct {
Value any Value any
Type reflect.Type Type reflect.Type
useDefault bool useDefault bool
encrypted bool
} }
func StructTagsToFields(s any, secretsService secrets.Service) ([]DBField, error) { func StructTagsToFields(s any) ([]DBField, error) {
v := reflect.ValueOf(s) v := reflect.ValueOf(s)
if v.Kind() == reflect.Ptr { if v.Kind() == reflect.Ptr {
@@ -50,7 +51,7 @@ func StructTagsToFields(s any, secretsService secrets.Service) ([]DBField, error
} }
useDefault := false useDefault := false
value := v.Field(i).Interface() encrypted := false
if strings.Contains(tag, ",") { if strings.Contains(tag, ",") {
parts := strings.Split(tag, ",") parts := strings.Split(tag, ",")
@@ -65,20 +66,17 @@ func StructTagsToFields(s any, secretsService secrets.Service) ([]DBField, error
case "default": case "default":
useDefault = true useDefault = true
case "encrypted": case "encrypted":
val, err := secretsService.Encrypt(value.(string)) encrypted = true
if err != nil {
return nil, fmt.Errorf("failed to encrypt field %s: %w", f.Name, err)
}
value = val
} }
} }
} }
fields = append(fields, DBField{ fields = append(fields, DBField{
Name: tag, Name: tag,
Value: value, Value: v.Field(i).Interface(),
Type: f.Type, Type: f.Type,
useDefault: useDefault, useDefault: useDefault,
encrypted: encrypted,
}) })
} }
return fields, nil return fields, nil
@@ -101,7 +99,7 @@ func toSnakeCase(s string) string {
} }
func (q *Query) InsertStruct(s any, table string, secretsService secrets.Service) (*Query, error) { func (q *Query) InsertStruct(s any, table string, secretsService secrets.Service) (*Query, error) {
fields, err := StructTagsToFields(s, secretsService) fields, err := StructTagsToFields(s)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -110,12 +108,22 @@ func (q *Query) InsertStruct(s any, table string, secretsService secrets.Service
values := make([]any, 0, len(fields)) values := make([]any, 0, len(fields))
for _, f := range fields { for _, f := range fields {
value := f.Value
if f.useDefault { if f.useDefault {
continue continue
} }
if f.encrypted {
encValue, err := secretsService.Encrypt(value.(string))
if err != nil {
return nil, err
}
value = encValue
}
columns = append(columns, f.Name) columns = append(columns, f.Name)
values = append(values, f.Value) values = append(values, value)
} }
if len(columns) == 0 { if len(columns) == 0 {