package audit import ( "bytes" "context" "fmt" "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" "management/internal/erpserver/repository" "management/internal/pkg/sqldb" "github.com/drhin/logger" ) type store struct { db *repository.Store log *logger.Logger } func NewStore(db *repository.Store, log *logger.Logger) system.AuditLogRepository { return &store{ db: db, log: log, } } func (s *store) Create(ctx context.Context, obj *system.AuditLog) error { //goland:noinspection ALL const q = ` INSERT INTO sys_audit_log( email, start_at, end_at, duration, url, method, parameters, referer_url, os, ip, browser, remark) VALUES ( :email, :start_at, :end_at, :duration, :url, :method, :parameters, :referer_url, :os, :ip, :browser, :remark)` return sqldb.NamedExecContext(ctx, s.log, s.db.DB(ctx), q, obj) } func (s *store) BatchCreate(ctx context.Context, objs []*system.AuditLog) error { if len(objs) == 0 { return nil } //goland:noinspection ALL const q = ` INSERT INTO sys_audit_log( email, start_at, end_at, duration, url, method, parameters, referer_url, os, ip, browser, remark) VALUES ( :email, :start_at, :end_at, :duration, :url, :method, :parameters, :referer_url, :os, :ip, :browser, :remark)` return sqldb.NamedExecContext(ctx, s.log, s.db.DB(ctx), q, objs) } func (s *store) Count(ctx context.Context, filter dto.SearchDto) (int64, error) { //goland:noinspection ALL const q = ` SELECT COUNT(1) FROM sys_audit_log` data := map[string]any{} buf := bytes.NewBufferString(q) applyFilter(filter, data, buf) var count struct { Count int64 `db:"count"` } err := sqldb.NamedQueryStruct(ctx, s.log, s.db.DB(ctx), buf.String(), data, &count) if err != nil { return 0, fmt.Errorf("select count audit: %w", err) } return count.Count, nil } func (s *store) List(ctx context.Context, filter dto.SearchDto) ([]*system.AuditLog, error) { //goland:noinspection ALL const q = ` SELECT id, created_at, email, start_at, end_at, duration, url, method, parameters, referer_url, os, ip, browser, remark FROM sys_audit_log` data := map[string]any{ "offset": (filter.Page - 1) * filter.Rows, "rows_per_page": filter.Rows, } buf := bytes.NewBufferString(q) applyFilter(filter, data, buf) buf.WriteString(" ORDER BY id DESC") buf.WriteString(" LIMIT :rows_per_page OFFSET :offset") var audits []system.AuditLog err := sqldb.NamedQuerySlice(ctx, s.log, s.db.DB(ctx), buf.String(), data, &audits) if err != nil { return nil, err } return toPointer(audits), nil } func toPointer(data []system.AuditLog) []*system.AuditLog { var res []*system.AuditLog for _, v := range data { res = append(res, &v) } return res }