Select Git revision
audit.go 17.48 KiB
package audit
import (
"encoding/json"
"fmt"
"github.com/r3labs/diff/v2"
"github.com/samber/lo"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/logs"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/number_utils"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/reflection"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/string_utils"
"reflect"
"regexp"
"strconv"
"strings"
)
type FieldChange struct {
From any `json:"change_from"`
To any `json:"change_to"`
}
type IAuditFormatter interface {
FormatForAuditEvent() string
}
func VerifyAuditEvents(original any, new any) error {
if original != nil {
structValue := reflect.ValueOf(original)
if structValue.Kind() != reflect.Struct {
return errors.Error("original object is not of type struct")
}
}
if new != nil {
structValue := reflect.ValueOf(new)
if structValue.Kind() != reflect.Struct {
return errors.Error("new object is not of type struct")
}
}
return nil
}
func GetChanges(original any, new any) (map[string]any, error) {
// Clean audit events
original = cleanStruct(original)
new = cleanStruct(new)
changes := map[string]any{}
changelog, err := diff.Diff(original, new)
if err != nil {
return changes, err
}
for _, change := range changelog {
if len(change.Path) == 1 {
// Root object change
field := ToSnakeCase(change.Path[0])
changes[field] = FieldChange{
From: change.From,
To: change.To,
}
} else if len(change.Path) == 2 {
// Child object changed
// ["Account", "ID"]
// 0 = Object
// 1 = field