...

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

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

     1  package server
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"os"
     7  	"path/filepath"
     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) loadPageForm(db *database.DB, r *http.Request, p *Page) error {
    17  	p.Path = FormString(r, "path")
    18  	p.Content = FormString(r, "content")
    19  
    20  	p.Path = strings.TrimSuffix(p.Path, ".html")
    21  
    22  	return s.writePages(db, []*Page{p}, true)
    23  }
    24  
    25  func (s *Server) servePage(data *templateData, db *database.DB, w http.ResponseWriter, r *http.Request) {
    26  	data.Template = "manage_page"
    27  	data.Boards = db.AllBoards()
    28  	data.Manage.Page = &Page{}
    29  
    30  	if PathString(r, "/sriracha/page/rebuild/") != "" {
    31  		if s.forbidden(w, data, "page.update") {
    32  			return
    33  		}
    34  		var pages []*Page
    35  		rebuildPageID := PathInt(r, "/sriracha/page/rebuild/")
    36  		if rebuildPageID > 0 {
    37  			p := db.PageByID(rebuildPageID)
    38  			if p == nil {
    39  				data.ManageError("Invalid page.")
    40  				return
    41  			}
    42  			pages = append(pages, p)
    43  			data.Info = Get(nil, data.Account, "Rebuilt %s.", p.Path)
    44  		} else {
    45  			pages = db.AllPages()
    46  			data.Info = Get(nil, data.Account, "Rebuilt all pages.")
    47  		}
    48  		s.writePages(db, pages, false)
    49  	}
    50  
    51  	deletePageID := PathInt(r, "/sriracha/page/delete/")
    52  	if deletePageID > 0 {
    53  		if s.forbidden(w, data, "page.delete") {
    54  			return
    55  		}
    56  		p := db.PageByID(deletePageID)
    57  		if p == nil {
    58  			data.ManageError("Invalid page.")
    59  			return
    60  		}
    61  		db.DeletePage(p.ID)
    62  
    63  		os.Remove(filepath.Join(s.config.Root, p.Path+".html"))
    64  
    65  		s.log(db, data.Account, nil, fmt.Sprintf("Deleted page #%d", p.ID), "")
    66  
    67  		http.Redirect(w, r, "/sriracha/page/", http.StatusFound)
    68  		return
    69  	}
    70  
    71  	pageID, err := strconv.Atoi(strings.TrimPrefix(r.URL.Path, "/sriracha/page/"))
    72  	if err == nil && pageID > 0 {
    73  		if s.forbidden(w, data, "page.update") {
    74  			return
    75  		}
    76  		p := db.PageByID(pageID)
    77  		if p == nil {
    78  			data.ManageError("Invalid page.")
    79  			return
    80  		}
    81  		data.Manage.Page = p
    82  
    83  		if r.Method != http.MethodPost {
    84  			return
    85  		}
    86  		oldPath := data.Manage.Page.Path
    87  		err = s.loadPageForm(db, r, data.Manage.Page)
    88  		if err != nil {
    89  			data.ManageError(err.Error())
    90  			return
    91  		}
    92  
    93  		err := data.Manage.Page.Validate()
    94  		if err != nil {
    95  			data.ManageError(err.Error())
    96  			return
    97  		}
    98  
    99  		if data.Manage.Page.Path != oldPath {
   100  			match := db.PageByPath(data.Manage.Page.Path)
   101  			if match != nil {
   102  				data.ManageError("Page with that path already exists")
   103  				return
   104  			}
   105  			os.Remove(filepath.Join(s.config.Root, oldPath+".html"))
   106  		}
   107  
   108  		db.UpdatePage(data.Manage.Page)
   109  		s.writePages(db, []*Page{data.Manage.Page}, false)
   110  
   111  		s.log(db, data.Account, nil, fmt.Sprintf("Updated >>/page/%d", data.Manage.Page.ID), "")
   112  
   113  		http.Redirect(w, r, "/sriracha/page/", http.StatusFound)
   114  		return
   115  	}
   116  
   117  	if r.Method == http.MethodPost {
   118  		if s.forbidden(w, data, "page.add") {
   119  			return
   120  		}
   121  		p := &Page{}
   122  		err = s.loadPageForm(db, r, p)
   123  		if err != nil {
   124  			data.ManageError(err.Error())
   125  			return
   126  		}
   127  
   128  		err := p.Validate()
   129  		if err != nil {
   130  			data.ManageError(err.Error())
   131  			return
   132  		}
   133  
   134  		match := db.PageByPath(p.Path)
   135  		if match != nil {
   136  			data.ManageError("Page with that path already exists")
   137  			return
   138  		}
   139  
   140  		_, err = os.Stat(filepath.Join(s.config.Root, p.Path+".html"))
   141  		if !os.IsNotExist(err) {
   142  			data.ManageError("File already exists at that path")
   143  			return
   144  		}
   145  
   146  		db.AddPage(p)
   147  		s.writePages(db, []*Page{p}, false)
   148  
   149  		s.log(db, data.Account, nil, fmt.Sprintf("Added >>/page/%d", p.ID), "")
   150  
   151  		http.Redirect(w, r, "/sriracha/page/", http.StatusFound)
   152  		return
   153  	}
   154  
   155  	data.Manage.Pages = db.AllPages()
   156  }
   157  

View as plain text