Files

112 lines
2.7 KiB
Go

package repository
import (
"zeromesh/internal/database"
"zeromesh/internal/model"
)
type LogRepo struct {
db *database.DB
}
func NewLogRepo(db *database.DB) *LogRepo {
return &LogRepo{db: db}
}
func (r *LogRepo) InsertApiLog(log *model.ApiLog) error {
return r.db.Create(log).Error
}
func (r *LogRepo) InsertErrorLog(log *model.ErrorLog) error {
return r.db.Create(log).Error
}
func (r *LogRepo) ListApiLogs(page, pageSize int, ip, path, method string, statusCode int) ([]model.ApiLog, int64, error) {
q := r.db.Model(&model.ApiLog{})
if ip != "" {
q = q.Where("ip LIKE ?", "%"+ip+"%")
}
if path != "" {
q = q.Where("path LIKE ?", "%"+path+"%")
}
if method != "" {
q = q.Where("method = ?", method)
}
if statusCode > 0 {
q = q.Where("status_code = ?", statusCode)
}
var total int64
if err := q.Count(&total).Error; err != nil {
return nil, 0, err
}
var logs []model.ApiLog
offset := (page - 1) * pageSize
if err := q.Order("id DESC").Offset(offset).Limit(pageSize).Find(&logs).Error; err != nil {
return nil, 0, err
}
return logs, total, nil
}
func (r *LogRepo) ListErrorLogs(page, pageSize int, ip, path, method string, statusCode int) ([]model.ErrorLog, int64, error) {
q := r.db.Model(&model.ErrorLog{})
if ip != "" {
q = q.Where("ip LIKE ?", "%"+ip+"%")
}
if path != "" {
q = q.Where("path LIKE ?", "%"+path+"%")
}
if method != "" {
q = q.Where("method = ?", method)
}
if statusCode > 0 {
q = q.Where("status_code = ?", statusCode)
}
var total int64
if err := q.Count(&total).Error; err != nil {
return nil, 0, err
}
var logs []model.ErrorLog
offset := (page - 1) * pageSize
if err := q.Order("id DESC").Offset(offset).Limit(pageSize).Find(&logs).Error; err != nil {
return nil, 0, err
}
return logs, total, nil
}
func (r *LogRepo) ListApiLogGrouped() ([]map[string]interface{}, error) {
rows, err := r.db.Model(&model.ApiLog{}).
Select("ip, method, path, COUNT(*) as count, SUM(latency_ms) as total_latency").
Group("ip, method, path").
Order("count DESC").
Rows()
if err != nil {
return nil, err
}
defer rows.Close()
var result []map[string]interface{}
for rows.Next() {
var ip, method, path string
var count int64
var totalLatency int64
if err := rows.Scan(&ip, &method, &path, &count, &totalLatency); err != nil {
return nil, err
}
result = append(result, map[string]interface{}{
"ip": ip,
"method": method,
"path": path,
"count": count,
"total_latency": totalLatency,
})
}
return result, nil
}
func (r *LogRepo) ClearApiLogs() error {
return r.db.Where("1 = 1").Delete(&model.ApiLog{}).Error
}
func (r *LogRepo) ClearErrorLogs() error {
return r.db.Where("1 = 1").Delete(&model.ErrorLog{}).Error
}