package log import ( "fmt" "os" "time" "github.com/jmoiron/sqlx" ) type ( Logger struct { DB *sqlx.DB } Log struct { ID string `json:"id" db:"id"` Type string `json:"type" db:"type"` Content string `json:"content" db:"content"` CreatedAt time.Time `json:"created_at" db:"created_at"` } ) const ( TYPE_ACCOUNT string = "account" TYPE_MUSIC string = "music" TYPE_BLOG string = "blog" TYPE_ARTWORK string = "artwork" TYPE_MISC string = "misc" ) type LogLevel int const ( LEVEL_INFO LogLevel = 0 LEVEL_WARN LogLevel = 1 ) func (self *Logger) Info(logType string, format string, args ...any) { logString := fmt.Sprintf(format, args...) fmt.Printf("[%s] INFO: %s", logType, logString) err := createLog(self.DB, LEVEL_INFO, logType, logString) if err != nil { fmt.Fprintf(os.Stderr, "WARN: Failed to push log to database: %v\n", err) } } func (self *Logger) Warn(logType string, format string, args ...any) { logString := fmt.Sprintf(format, args...) fmt.Fprintf(os.Stderr, "[%s] WARN: %s", logType, logString) err := createLog(self.DB, LEVEL_WARN, logType, logString) if err != nil { fmt.Fprintf(os.Stderr, "WARN: Failed to push log to database: %v\n", err) } } func (self *Logger) Fatal(logType string, format string, args ...any) { fmt.Fprintf(os.Stderr, fmt.Sprintf("[%s] FATAL: %s", logType, format), args...) // we won't need to push fatal logs to DB, as these usually precede a panic or crash } func (self *Logger) Fetch(id string) *Log { // TODO: log fetch return nil } func (self *Logger) Search(typeFilters []string, content string, offset int, limit int) []Log { // TODO: log search return []Log{} } func (self *Logger) Delete(id string) error { // TODO: log deletion // consider: logging the deletion of logs? // or just not deleting logs at all return nil } func createLog(db *sqlx.DB, logLevel LogLevel, logType string, content string) error { _, err := db.Exec( "INSERT INTO auditlog (level, type, content) VALUES ($1,$2,$3)", logLevel, logType, content, ) return err }