459d745cb1
add tasks to debug page ignore .git on debug page for speed add perfchunks table Renamed phrases (changed statistics to stats): panel_menu_stats panel_menu_stats_posts panel_menu_stats_topics panel_menu_stats_forums panel_menu_stats_routes panel_menu_stats_agents panel_menu_stats_systems panel_menu_stats_languages panel_menu_stats_referrers panel_menu_stats_memory panel_menu_stats_active_memory panel_menu_stats_perf panel_stats_views_head_suffix panel_stats_user_agents_head panel_stats_forums_head panel_stats_languages_head panel_stats_post_counts_head panel_stats_referrers_head panel_stats_routes_head panel_stats_operating_systems_head panel_stats_topic_counts_head panel_stats_requests_head panel_stats_memory_head panel_stats_active_memory_head panel_stats_spam_hide panel_stats_spam_show panel_stats_memory_type_total panel_stats_memory_type_stack panel_stats_memory_type_heap panel_stats_time_range_one_year panel_stats_time_range_three_months panel_stats_time_range_one_month panel_stats_time_range_one_week panel_stats_time_range_two_days panel_stats_time_range_one_day panel_stats_time_range_twelve_hours panel_stats_time_range_six_hours panel_stats_post_counts_chart_aria panel_stats_topic_counts_chart_aria panel_stats_requests_chart_aria panel_stats_memory_chart_aria panel_stats_details_head panel_stats_post_counts_table_aria panel_stats_topic_counts_table_aria panel_stats_route_views_table_aria panel_stats_requests_table_aria panel_stats_memory_table_aria panel_stats_views_suffix panel_stats_posts_suffix panel_stats_topics_suffix panel_stats_user_agents_no_user_agents panel_stats_forums_no_forums panel_stats_languages_no_languages panel_stats_post_counts_no_post_counts panel_stats_referrers_no_referrers panel_stats_routes_no_routes panel_stats_operating_systems_no_operating_systems panel_stats_memory_no_memory Added phrases: panel_debug_tasks panel_debug_tasks_half_second panel_debug_tasks_second panel_debug_tasks_fifteen_minute panel_debug_tasks_hour panel_debug_tasks_shutdown panel_stats_perf_head panel_stats_perf_low panel_stats_perf_high panel_stats_perf_avg You will need to run the updater / patcher for this commit.
130 lines
3.6 KiB
Go
130 lines
3.6 KiB
Go
package common
|
|
|
|
import (
|
|
"database/sql"
|
|
"time"
|
|
|
|
qgen "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
|
|
Extra string
|
|
}
|
|
|
|
type LogStore interface {
|
|
Create(action string, elementID int, elementType, ip string, actorID int) (err error)
|
|
CreateExtra(action string, elementID int, elementType, ip string, actorID int, extra string) (err error)
|
|
Count() int
|
|
GetOffset(offset, 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"
|
|
// TODO: Shorten name of ipaddress column to ip
|
|
cols := "action, elementID, elementType, ipaddress, actorID, doneAt, extra"
|
|
return &SQLModLogStore{
|
|
create: acc.Insert(ml).Columns(cols).Fields("?,?,?,?,?,UTC_TIMESTAMP(),?").Prepare(),
|
|
count: acc.Count(ml).Prepare(),
|
|
getOffset: acc.Select(ml).Columns(cols).Orderby("doneAt DESC").Limit("?,?").Prepare(),
|
|
}, acc.FirstError()
|
|
}
|
|
|
|
// TODO: Make a store for this?
|
|
func (s *SQLModLogStore) Create(action string, elementID int, elementType, ip string, actorID int) (err error) {
|
|
return s.CreateExtra(action, elementID, elementType, ip, actorID, "")
|
|
}
|
|
|
|
func (s *SQLModLogStore) CreateExtra(action string, elementID int, elementType, ip string, actorID int, extra string) (err error) {
|
|
_, err = s.create.Exec(action, elementID, elementType, ip, actorID, extra)
|
|
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, &l.Extra)
|
|
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, 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"
|
|
cols := "action, elementID, elementType, ipaddress, actorID, doneAt, extra"
|
|
return &SQLAdminLogStore{
|
|
create: acc.Insert(al).Columns(cols).Fields("?,?,?,?,?,UTC_TIMESTAMP(),?").Prepare(),
|
|
count: acc.Count(al).Prepare(),
|
|
getOffset: acc.Select(al).Columns(cols).Orderby("doneAt DESC").Limit("?,?").Prepare(),
|
|
}, acc.FirstError()
|
|
}
|
|
|
|
// TODO: Make a store for this?
|
|
func (s *SQLAdminLogStore) Create(action string, elementID int, elementType, ip string, actorID int) (err error) {
|
|
return s.CreateExtra(action, elementID, elementType, ip, actorID, "")
|
|
}
|
|
|
|
func (s *SQLAdminLogStore) CreateExtra(action string, elementID int, elementType, ip string, actorID int, extra string) (err error) {
|
|
_, err = s.create.Exec(action, elementID, elementType, ip, actorID, extra)
|
|
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, 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)
|
|
}
|