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