...

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  
    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