This commit is contained in:
2025-06-18 17:44:49 +08:00
parent b171122a32
commit 0878a4e6de
66 changed files with 2841 additions and 1423 deletions

View File

@@ -0,0 +1,117 @@
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
}

View File

@@ -0,0 +1,28 @@
package audit
import (
"bytes"
"strings"
"management/internal/erpserver/model/dto"
)
func applyFilter(filter dto.SearchDto, data map[string]any, buf *bytes.Buffer) {
var wc []string
if filter.SearchTimeBegin != "" && filter.SearchTimeEnd == "" {
data["start_at"] = filter.SearchTimeBegin
data["end_at"] = filter.SearchTimeEnd
wc = append(wc, "created_at BETWEEN :start_at AND :end_at")
}
if filter.SearchEmail != "" {
data["email"] = filter.SearchEmail
wc = append(wc, "email LIKE :email")
}
if len(wc) > 0 {
buf.WriteString(" WHERE ")
buf.WriteString(strings.Join(wc, " AND "))
}
}