1 package server
2
3 import (
4 "fmt"
5 "html/template"
6 "net/http"
7 "regexp"
8 "strconv"
9 "strings"
10
11 "codeberg.org/tslocum/sriracha/internal/database"
12 . "codeberg.org/tslocum/sriracha/model"
13 . "codeberg.org/tslocum/sriracha/util"
14 )
15
16 func (s *Server) loadKeywordForm(db *database.DB, r *http.Request, k *Keyword) {
17 k.Text = FormString(r, "text")
18 k.Action = FormString(r, "action")
19 k.Boards = nil
20 boards := r.Form["boards"]
21 for _, board := range boards {
22 boardID, err := strconv.Atoi(board)
23 if err != nil || boardID <= 0 {
24 continue
25 }
26 b := db.BoardByID(boardID)
27 if b == nil {
28 continue
29 }
30 k.Boards = append(k.Boards, b)
31 }
32 }
33
34 func (s *Server) serveKeyword(data *templateData, db *database.DB, w http.ResponseWriter, r *http.Request) {
35 var err error
36 data.Template = "manage_keyword"
37 data.Boards = db.AllBoards()
38 data.Manage.Keyword = &Keyword{}
39
40 keywordID := PathInt(r, "/sriracha/keyword/test/")
41 if keywordID > 0 {
42 if s.forbidden(w, data, "keyword.update") {
43 return
44 }
45 data.Template = "manage_keyword_test"
46 k := db.KeywordByID(keywordID)
47 if k == nil {
48 data.ManageError("Invalid keyword.")
49 return
50 }
51 data.Manage.Keyword = k
52 if r.Method != http.MethodPost {
53 return
54 }
55 rgxp, err := regexp.Compile(data.Manage.Keyword.Text)
56 if err != nil {
57 data.ManageError(fmt.Sprintf("Failed to compile regular expression: %s", err))
58 }
59
60 message := r.FormValue("message")
61 data.Extra = message
62
63 match := rgxp.MatchString(message)
64 matchLabel := "NO MATCH"
65 if match {
66 matchLabel = "MATCH FOUND"
67 }
68 data.Message = template.HTML(fmt.Sprintf(`Result: <b>%s</b>`, matchLabel))
69 return
70 }
71
72 deleteKeywordID := PathInt(r, "/sriracha/keyword/delete/")
73 if deleteKeywordID > 0 {
74 if s.forbidden(w, data, "keyword.delete") {
75 return
76 }
77 k := db.KeywordByID(deleteKeywordID)
78 if k == nil {
79 data.ManageError("Invalid keyword.")
80 return
81 }
82 db.DeleteKeyword(k.ID)
83
84 s.log(db, data.Account, nil, fmt.Sprintf("Deleted keyword #%d", k.ID), "")
85
86 http.Redirect(w, r, "/sriracha/keyword/", http.StatusFound)
87 return
88 }
89
90 keywordID, err = strconv.Atoi(strings.TrimPrefix(r.URL.Path, "/sriracha/keyword/"))
91 if err == nil && keywordID > 0 {
92 if s.forbidden(w, data, "keyword.update") {
93 return
94 }
95 data.Manage.Keyword = db.KeywordByID(keywordID)
96
97 if data.Manage.Keyword != nil && r.Method == http.MethodPost {
98 oldKeyword := *data.Manage.Keyword
99 oldText := data.Manage.Keyword.Text
100 s.loadKeywordForm(db, r, data.Manage.Keyword)
101
102 err := data.Manage.Keyword.Validate()
103 if err != nil {
104 data.ManageError(err.Error())
105 return
106 }
107
108 if data.Manage.Keyword.Text != oldText {
109 match := db.KeywordByText(data.Manage.Keyword.Text)
110 if match != nil {
111 data.ManageError("Keyword text already exists")
112 return
113 }
114 }
115
116 db.UpdateKeyword(data.Manage.Keyword)
117
118 changes := printChanges(oldKeyword, *data.Manage.Keyword)
119 s.log(db, data.Account, nil, fmt.Sprintf("Updated >>/keyword/%d", data.Manage.Keyword.ID), changes)
120
121 http.Redirect(w, r, "/sriracha/keyword/", http.StatusFound)
122 return
123 }
124 return
125 }
126
127 if r.Method == http.MethodPost {
128 if s.forbidden(w, data, "keyword.add") {
129 return
130 }
131 k := &Keyword{}
132 s.loadKeywordForm(db, r, k)
133
134 err := k.Validate()
135 if err != nil {
136 data.ManageError(err.Error())
137 return
138 }
139
140 match := db.KeywordByText(k.Text)
141 if match != nil {
142 data.ManageError("Keyword text already exists")
143 return
144 }
145
146 db.AddKeyword(k)
147
148 s.log(db, data.Account, nil, fmt.Sprintf("Added >>/keyword/%d", k.ID), "")
149
150 http.Redirect(w, r, "/sriracha/keyword/", http.StatusFound)
151 return
152 }
153
154 data.Manage.Keywords = db.AllKeywords()
155 }
156
View as plain text