gosora/common/audit_logs.go

115 lines
3.2 KiB
Go

package common
import (
"database/sql"
"time"
"github.com/Azareal/Gosora/query_gen"
)
var ModLogs LogStore
var AdminLogs LogStore
type LogItem struct {
Action string
ElementID int
ElementType string
IP string
ActorID int
DoneAt string
}
type LogStore interface {
Create(action string, elementID int, elementType string, ip string, actorID int) (err error)
Count() int
GetOffset(offset int, perPage int) (logs []LogItem, err error)
}
type SQLModLogStore struct {
create *sql.Stmt
count *sql.Stmt
getOffset *sql.Stmt
}
func NewModLogStore(acc *qgen.Accumulator) (*SQLModLogStore, error) {
return &SQLModLogStore{
create: acc.Insert("moderation_logs").Columns("action, elementID, elementType, ipaddress, actorID, doneAt").Fields("?,?,?,?,?,UTC_TIMESTAMP()").Prepare(),
count: acc.Count("moderation_logs").Prepare(),
getOffset: acc.Select("moderation_logs").Columns("action, elementID, elementType, ipaddress, actorID, doneAt").Orderby("doneAt DESC").Limit("?,?").Prepare(),
}, acc.FirstError()
}
// TODO: Make a store for this?
func (s *SQLModLogStore) Create(action string, elementID int, elementType string, ip string, actorID int) (err error) {
_, err = s.create.Exec(action, elementID, elementType, ip, actorID)
return err
}
func (s *SQLModLogStore) Count() (count int) {
err := s.count.QueryRow().Scan(&count)
if err != nil {
LogError(err)
}
return count
}
func buildLogList(rows *sql.Rows) (logs []LogItem, err error) {
for rows.Next() {
var l LogItem
var doneAt time.Time
err := rows.Scan(&l.Action, &l.ElementID, &l.ElementType, &l.IP, &l.ActorID, &doneAt)
if err != nil {
return logs, err
}
l.DoneAt = doneAt.Format("2006-01-02 15:04:05")
logs = append(logs, l)
}
return logs, rows.Err()
}
func (s *SQLModLogStore) GetOffset(offset int, perPage int) (logs []LogItem, err error) {
rows, err := s.getOffset.Query(offset, perPage)
if err != nil {
return logs, err
}
defer rows.Close()
return buildLogList(rows)
}
type SQLAdminLogStore struct {
create *sql.Stmt
count *sql.Stmt
getOffset *sql.Stmt
}
func NewAdminLogStore(acc *qgen.Accumulator) (*SQLAdminLogStore, error) {
return &SQLAdminLogStore{
create: acc.Insert("administration_logs").Columns("action, elementID, elementType, ipaddress, actorID, doneAt").Fields("?,?,?,?,?,UTC_TIMESTAMP()").Prepare(),
count: acc.Count("administration_logs").Prepare(),
getOffset: acc.Select("administration_logs").Columns("action, elementID, elementType, ipaddress, actorID, doneAt").Orderby("doneAt DESC").Limit("?,?").Prepare(),
}, acc.FirstError()
}
// TODO: Make a store for this?
func (s *SQLAdminLogStore) Create(action string, elementID int, elementType string, ip string, actorID int) (err error) {
_, err = s.create.Exec(action, elementID, elementType, ip, actorID)
return err
}
func (s *SQLAdminLogStore) Count() (count int) {
err := s.count.QueryRow().Scan(&count)
if err != nil {
LogError(err)
}
return count
}
func (s *SQLAdminLogStore) GetOffset(offset int, perPage int) (logs []LogItem, err error) {
rows, err := s.getOffset.Query(offset, perPage)
if err != nil {
return logs, err
}
defer rows.Close()
return buildLogList(rows)
}