...

Source file src/codeberg.org/tslocum/sriracha/internal/server/server_keyword.go

Documentation: codeberg.org/tslocum/sriracha/internal/server

     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