handlers.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package server
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "strings"
  11. "text/template"
  12. "time"
  13. "git.linuxit.ro/turos.robert/mynotes/cmds/webservice/types"
  14. "git.linuxit.ro/turos.robert/mynotes/lib/inout"
  15. "github.com/yuin/goldmark"
  16. "github.com/yuin/goldmark/extension"
  17. )
  18. func Wildcard(w http.ResponseWriter, r *http.Request) {
  19. if r.Method == "GET" {
  20. base_dir := "./templates/"
  21. endpoint := strings.TrimPrefix(r.URL.Path, "/")
  22. //fmt.Println(endpoint)
  23. //fmt.Println(r.URL.Path)
  24. if endpoint == "" {
  25. //in cazul in care apelam root
  26. endpoint = "index.html"
  27. }
  28. path := filepath.Join(base_dir, endpoint)
  29. _, err := os.Stat(path)
  30. if err != nil {
  31. w.Header().Add("Content-Type", "text/html")
  32. resp, code := inout.ParseTemplate("templates/design.tmpl", err)
  33. w.WriteHeader(code)
  34. w.Write(resp)
  35. return
  36. }
  37. w.Write(inout.FileToBytes(path))
  38. return
  39. }
  40. }
  41. func API(w http.ResponseWriter, r *http.Request, s *Server) {
  42. action := strings.TrimPrefix(r.URL.Path, "/api/")
  43. if r.Method == "POST" {
  44. //w.WriteHeader(http.StatusNotImplemented)
  45. //w.Write(fmt.Appendf(nil, "action not implemented: %s", action))
  46. switch action {
  47. case "save_note":
  48. r.ParseForm()
  49. n := types.Notita{}
  50. n.Titlu = r.Form.Get("titlu")
  51. n.Continut = r.Form.Get("notita")
  52. n.Folder = r.Form.Get("director")
  53. if n.Folder == "" {
  54. n.Folder = "default"
  55. }
  56. err := inout.SafeDir(n.Folder)
  57. if err != nil {
  58. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  59. w.Header().Set("Content-Type", "text/html")
  60. w.WriteHeader(code)
  61. w.Write(resp)
  62. return
  63. }
  64. path := filepath.Join(s.NotesDir, n.Folder)
  65. err = os.MkdirAll(path, 0755)
  66. fmt.Println(n.Folder)
  67. if err != nil {
  68. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  69. w.Header().Set("Content-Type", "text/html")
  70. w.WriteHeader(code)
  71. w.Write(resp)
  72. return
  73. }
  74. fisier := fmt.Sprintf("notita-%s.json", time.Now().Format("2006-01-02-150405.999999"))
  75. n.Path = filepath.Join("notes_folder", n.Folder, fisier)
  76. //fmt.Println(fisier, r.Form)
  77. //return
  78. err = inout.ObjToFile(filepath.Join(s.NotesDir, n.Folder, fisier), n, true)
  79. if err != nil {
  80. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  81. w.Header().Set("Content-Type", "text/html")
  82. w.WriteHeader(code)
  83. w.Write(resp)
  84. return
  85. }
  86. referinta := r.Referer()
  87. fmt.Println(referinta)
  88. if referinta != "" {
  89. http.Redirect(w, r, referinta, http.StatusSeeOther)
  90. } else {
  91. http.Redirect(w, r, "/index.html", http.StatusSeeOther)
  92. }
  93. case "update_note":
  94. r.ParseForm()
  95. n := types.Notita{}
  96. n.Titlu = r.Form.Get("titlu")
  97. n.Path = r.Form.Get("path")
  98. n.Folder = r.Form.Get("director")
  99. n.Continut = r.Form.Get("notita")
  100. fmt.Println(n.Path)
  101. err := inout.ObjToFile(n.Path, n, true)
  102. if err != nil {
  103. w.WriteHeader(http.StatusInternalServerError)
  104. fmt.Fprintf(w, "%+v", err)
  105. return
  106. }
  107. referinta := r.Referer()
  108. if referinta != "" {
  109. http.Redirect(w, r, referinta, http.StatusSeeOther)
  110. } else {
  111. http.Redirect(w, r, "/index.html", http.StatusSeeOther)
  112. }
  113. }
  114. }
  115. resp, code := inout.ParseTemplate("templates/error.tmpl", fmt.Errorf("method %s not allowed", r.Method))
  116. w.Header().Set("Content-Type", "text/html")
  117. w.WriteHeader(code)
  118. w.Write(resp)
  119. }
  120. func Notes(w http.ResponseWriter, r *http.Request, fisier string) {
  121. var buf bytes.Buffer
  122. notita := types.Notita{}
  123. err := inout.FileToObj(fisier, &notita)
  124. if err != nil {
  125. w.WriteHeader(http.StatusInternalServerError)
  126. w.Write([]byte(WEB_ERR))
  127. template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
  128. return
  129. }
  130. if err := goldmark.Convert([]byte(notita.Continut), &buf); err != nil {
  131. w.WriteHeader(http.StatusInternalServerError)
  132. w.Write([]byte(WEB_ERR))
  133. template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
  134. return
  135. }
  136. notita.HTML = buf.String()
  137. resp, code := inout.ParseTemplate("templates/notita.tmpl", notita)
  138. w.WriteHeader(code)
  139. w.Write(resp)
  140. }
  141. func ListNotes(w http.ResponseWriter, r *http.Request, s *Server) {
  142. if r.Method == "GET" {
  143. f := inout.Folder{}
  144. err := inout.GetFolderStructure(s.NotesDir, &f)
  145. if err != nil {
  146. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  147. w.Header().Set("Content-Type", "text/html")
  148. w.WriteHeader(code)
  149. w.Write(resp)
  150. return
  151. }
  152. resp, code := inout.ParseTemplate("templates/list_notes.tmpl", f)
  153. w.Header().Set("Content-Type", "text/html")
  154. w.WriteHeader(code)
  155. w.Write(resp)
  156. return
  157. }
  158. w.WriteHeader(http.StatusMethodNotAllowed)
  159. w.Write([]byte("methoda nepermisa"))
  160. }
  161. func EditNotes(w http.ResponseWriter, r *http.Request, filename string) {
  162. if r.Method == "GET" {
  163. f := types.Notita{}
  164. err := inout.FileToObj(filename, &f)
  165. if err != nil {
  166. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  167. w.WriteHeader(code)
  168. w.Write(resp)
  169. }
  170. resp, code := inout.ParseTemplate("templates/edit_notes.tmpl", f)
  171. w.WriteHeader(code)
  172. w.Write(resp)
  173. return
  174. }
  175. resp, code := inout.ParseTemplate("templates/error.tmpl", fmt.Errorf("method %s not allowed", r.Method))
  176. w.WriteHeader(code)
  177. w.Write(resp)
  178. }
  179. func MDToHTML(w http.ResponseWriter, r *http.Request) {
  180. body, err := io.ReadAll(r.Body)
  181. if err != nil {
  182. fmt.Fprintf(w, "%+v", err)
  183. }
  184. mp := make(map[string]any)
  185. err = json.Unmarshal(body, &mp)
  186. if err != nil {
  187. fmt.Fprintf(w, "%+v", err)
  188. }
  189. var buff bytes.Buffer
  190. md := goldmark.New(
  191. goldmark.WithExtensions(extension.Table,
  192. extension.DefinitionList,
  193. extension.Footnote,
  194. extension.Typographer))
  195. err = md.Convert([]byte(mp["markdown"].(string)), &buff)
  196. if err != nil {
  197. fmt.Fprintf(w, "%+v", err)
  198. }
  199. w.Write(buff.Bytes())
  200. }