mirror of
https://github.com/lordmathis/lemma.git
synced 2025-11-05 23:44:22 +00:00
Encrypt field in query
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user