118 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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
 | |
| }
 |