eb49dde076
Encode png images as pngs rather than turning them into jpgs. Shorten things to eliminate bytes and boilerplate. Remove some old code.
117 lines
3.1 KiB
Go
117 lines
3.1 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) {
|
|
ml := "moderation_logs"
|
|
return &SQLModLogStore{
|
|
create: acc.Insert(ml).Columns("action, elementID, elementType, ipaddress, actorID, doneAt").Fields("?,?,?,?,?,UTC_TIMESTAMP()").Prepare(),
|
|
count: acc.Count(ml).Prepare(),
|
|
getOffset: acc.Select(ml).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) {
|
|
al := "administration_logs"
|
|
return &SQLAdminLogStore{
|
|
create: acc.Insert(al).Columns("action, elementID, elementType, ipaddress, actorID, doneAt").Fields("?,?,?,?,?,UTC_TIMESTAMP()").Prepare(),
|
|
count: acc.Count(al).Prepare(),
|
|
getOffset: acc.Select(al).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)
|
|
}
|