home to your local SPACEGIRL 馃挮
arimelody.space
1package admin
2
3import (
4 "arimelody-web/admin/templates"
5 "arimelody-web/log"
6 "arimelody-web/model"
7 "fmt"
8 "net/http"
9 "os"
10 "strings"
11)
12
13func logsHandler(app *model.AppState) http.Handler {
14 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
15 if r.Method != http.MethodGet {
16 http.NotFound(w, r)
17 return
18 }
19
20 session := r.Context().Value("session").(*model.Session)
21
22 levelFilter := []log.LogLevel{}
23 typeFilter := []string{}
24
25 query := r.URL.Query().Get("q")
26
27 for key, value := range r.URL.Query() {
28 if strings.HasPrefix(key, "level-") && value[0] == "on" {
29 m := map[string]log.LogLevel{
30 "info": log.LEVEL_INFO,
31 "warn": log.LEVEL_WARN,
32 }
33 level, ok := m[strings.TrimPrefix(key, "level-")]
34 if ok {
35 levelFilter = append(levelFilter, level)
36 }
37 continue
38 }
39
40 if strings.HasPrefix(key, "type-") && value[0] == "on" {
41 typeFilter = append(typeFilter, string(strings.TrimPrefix(key, "type-")))
42 continue
43 }
44 }
45
46 logs, err := app.Log.Search(levelFilter, typeFilter, query, 100, 0)
47 if err != nil {
48 fmt.Fprintf(os.Stderr, "WARN: Failed to fetch audit logs: %v\n", err)
49 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
50 return
51 }
52
53 type LogsResponse struct {
54 adminPageData
55 Logs []*log.Log
56 }
57
58 err = templates.LogsTemplate.Execute(w, LogsResponse{
59 adminPageData: adminPageData{ Path: r.URL.Path, Session: session },
60 Logs: logs,
61 })
62 if err != nil {
63 fmt.Fprintf(os.Stderr, "WARN: Failed to render audit logs page: %v\n", err)
64 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
65 return
66 }
67 })
68}