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 s.refreshKeywordCache(db)
84
85 s.log(db, data.Account, nil, fmt.Sprintf("Deleted keyword #%d", k.ID), "")
86
87 data.Redirect(w, r, "/sriracha/keyword/")
88 return
89 }
90
91 keywordID, err = strconv.Atoi(strings.TrimPrefix(r.URL.Path, "/sriracha/keyword/"))
92 if err == nil && keywordID > 0 {
93 if s.forbidden(w, data, "keyword.update") {
94 return
95 }
96 data.Manage.Keyword = db.KeywordByID(keywordID)
97
98 if data.Manage.Keyword != nil && r.Method == http.MethodPost {
99 oldKeyword := *data.Manage.Keyword
100 oldText := data.Manage.Keyword.Text
101 s.loadKeywordForm(db, r, data.Manage.Keyword)
102
103 err := data.Manage.Keyword.Validate()
104 if err != nil {
105 data.ManageError(err.Error())
106 return
107 }
108
109 if data.Manage.Keyword.Text != oldText {
110 match := db.KeywordByText(data.Manage.Keyword.Text)
111 if match != nil {
112 data.ManageError("Keyword text already exists")
113 return
114 }
115 }
116
117 db.UpdateKeyword(data.Manage.Keyword)
118 s.refreshKeywordCache(db)
119
120 changes := printChanges(oldKeyword, *data.Manage.Keyword)
121 s.log(db, data.Account, nil, fmt.Sprintf("Updated >>/keyword/%d", data.Manage.Keyword.ID), changes)
122
123 data.Redirect(w, r, "/sriracha/keyword/")
124 return
125 }
126 return
127 }
128
129 if r.Method == http.MethodPost {
130 if s.forbidden(w, data, "keyword.add") {
131 return
132 }
133 k := &Keyword{}
134 s.loadKeywordForm(db, r, k)
135
136 err := k.Validate()
137 if err != nil {
138 data.ManageError(err.Error())
139 return
140 }
141
142 match := db.KeywordByText(k.Text)
143 if match != nil {
144 data.ManageError("Keyword text already exists")
145 return
146 }
147
148 db.AddKeyword(k)
149 s.refreshKeywordCache(db)
150
151 s.log(db, data.Account, nil, fmt.Sprintf("Added >>/keyword/%d", k.ID), "")
152
153 data.Redirect(w, r, "/sriracha/keyword/")
154 return
155 }
156
157 data.Manage.Keywords = db.AllKeywords()
158 data.Page = PathInt(r, "/sriracha/keyword/p")
159 data.Pages = pageCount(len(data.Manage.Keywords), entriesPerPage)
160 data.Manage.Keywords = pageSlice(data.Manage.Keywords, data.Page, entriesPerPage)
161 }
162
View as plain text