package admin import ( "net/http" "codeberg.org/pronounscc/pronouns.cc/backend/common" "codeberg.org/pronounscc/pronouns.cc/backend/db" "codeberg.org/pronounscc/pronouns.cc/backend/log" "codeberg.org/pronounscc/pronouns.cc/backend/server" "emperror.dev/errors" "github.com/go-chi/render" ) type AuditLogEntryResponse struct { ID common.AuditLogID `json:"id"` TargetUserID common.UserID `json:"target_user_id"` TargetMemberID *common.MemberID `json:"target_member_id"` ModeratorID common.UserID `json:"moderator_id"` ReportID *int64 `json:"report_id"` Reason string `json:"reason"` ActionTaken string `json:"action_taken"` ClearedData *db.AuditLogClearedData `json:"cleared_data"` } func dbAuditLogToResponse(e db.AuditLogEntry) AuditLogEntryResponse { return AuditLogEntryResponse{ ID: e.ID, TargetUserID: e.TargetUserID, TargetMemberID: e.TargetMemberID, ModeratorID: e.ModeratorID, ReportID: e.ReportID, Reason: e.Reason, ActionTaken: e.ActionTaken, ClearedData: e.ClearedData, } } func dbAuditLogsToResponse(es []db.AuditLogEntry) []AuditLogEntryResponse { resps := make([]AuditLogEntryResponse, len(es)) for i := range es { resps[i] = dbAuditLogToResponse(es[i]) } return resps } func (s *Server) AuditLog(w http.ResponseWriter, r *http.Request) (err error) { beforeID := common.AuditLogID(0) if s := r.FormValue("before"); s != "" { sf, err := common.ParseSnowflake(s) if err != nil { return server.NewV2Error(server.ErrBadRequest, "", server.NewModelParseError("query", "Invalid snowflake")) } beforeID = common.AuditLogID(sf) } es, err := s.DB.AuditLog(r.Context(), beforeID) if err != nil { log.Errorf("getting audit logs before %v: %v", beforeID, err) return errors.Wrap(err, "getting audit logs") } render.JSON(w, r, dbAuditLogsToResponse(es)) return nil }