endpoint_funcs.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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 Notes(w http.ResponseWriter, r *http.Request, fisier string) {
  19. var buf bytes.Buffer
  20. notita := types.Notita{}
  21. err := inout.FileToObj(fisier, &notita)
  22. if err != nil {
  23. WriteError(w, err)
  24. return
  25. }
  26. if err := goldmark.Convert([]byte(notita.Continut), &buf); err != nil {
  27. WriteError(w, err)
  28. return
  29. }
  30. notita.HTML = buf.String()
  31. resp, code := inout.ParseTemplate("templates/notita.tmpl", notita)
  32. w.WriteHeader(code)
  33. w.Write(resp)
  34. }
  35. /*func ListNotes(w http.ResponseWriter, r *http.Request, s *Server) {
  36. if r.Method == "GET" {
  37. f := inout.Folder{}
  38. err := inout.GetFolderStructure(s.NotesDir, &f)
  39. if err != nil {
  40. WriteError(w, err)
  41. return
  42. }
  43. resp, code := inout.ParseTemplate("templates/list_notes.tmpl", f)
  44. w.Header().Set("Content-Type", "text/html")
  45. w.WriteHeader(code)
  46. w.Write(resp)
  47. return
  48. }
  49. w.WriteHeader(http.StatusMethodNotAllowed)
  50. w.Write([]byte("methoda nepermisa"))
  51. }*/
  52. /*func EditNotes(w http.ResponseWriter, r *http.Request, filename string) {
  53. if r.Method == "GET" {
  54. f := types.Notita{}
  55. err := inout.FileToObj(filename, &f)
  56. if err != nil {
  57. WriteError(w, err)
  58. return
  59. }
  60. resp, code := inout.ParseTemplate("templates/edit_notes.tmpl", f)
  61. w.WriteHeader(code)
  62. w.Write(resp)
  63. return
  64. }
  65. WriteError(w, fmt.Errorf("method %s not allowed", r.Method))
  66. }*/
  67. func MDToHTML(w http.ResponseWriter, r *http.Request) {
  68. body, err := io.ReadAll(r.Body)
  69. if err != nil {
  70. fmt.Fprintf(w, "%+v", err)
  71. }
  72. mp := make(map[string]any)
  73. err = json.Unmarshal(body, &mp)
  74. if err != nil {
  75. fmt.Fprintf(w, "%+v", err)
  76. }
  77. var buff bytes.Buffer
  78. md := goldmark.New(
  79. goldmark.WithExtensions(extension.Table,
  80. extension.DefinitionList,
  81. extension.Footnote,
  82. extension.Typographer))
  83. err = md.Convert([]byte(mp["markdown"].(string)), &buff)
  84. if err != nil {
  85. fmt.Fprintf(w, "%+v", err)
  86. }
  87. w.Write(buff.Bytes())
  88. }
  89. func API(w http.ResponseWriter, r *http.Request, s *Server) {
  90. action := strings.Trim(strings.TrimPrefix(r.URL.Path, "/api/"), "/")
  91. fmt.Println(action)
  92. if r.Method == "POST" {
  93. //w.WriteHeader(http.StatusNotImplemented)
  94. //w.Write(fmt.Appendf(nil, "action not implemented: %s", action))
  95. switch action {
  96. case "save_note":
  97. r.ParseForm()
  98. n := types.Notita{}
  99. n.Titlu = r.Form.Get("titlu")
  100. n.Continut = r.Form.Get("notita")
  101. n.Folder = r.Form.Get("director")
  102. if n.Folder == "" {
  103. n.Folder = "default"
  104. }
  105. err := inout.SafeDir(n.Folder)
  106. if err != nil {
  107. WriteError(w, err)
  108. return
  109. }
  110. path := filepath.Join(s.NotesDir, n.Folder)
  111. err = os.MkdirAll(path, 0755)
  112. fmt.Println(n.Folder)
  113. if err != nil {
  114. WriteError(w, err)
  115. return
  116. }
  117. fisier := fmt.Sprintf("notita-%s.json", time.Now().Format("2006-01-02-150405.999999"))
  118. n.Path = filepath.Join("notes_folder", n.Folder, fisier)
  119. //fmt.Println(fisier, r.Form)
  120. //return
  121. err = inout.ObjToFile(filepath.Join(s.NotesDir, n.Folder, fisier), n, true)
  122. if err != nil {
  123. WriteError(w, err)
  124. return
  125. }
  126. referinta := r.Referer()
  127. fmt.Println(referinta)
  128. if referinta != "" {
  129. http.Redirect(w, r, referinta, http.StatusSeeOther)
  130. } else {
  131. http.Redirect(w, r, "/index.html", http.StatusSeeOther)
  132. }
  133. case "update_note":
  134. r.ParseForm()
  135. n := types.Notita{}
  136. n.Titlu = r.Form.Get("titlu")
  137. n.Path = r.Form.Get("path")
  138. n.Folder = r.Form.Get("director")
  139. n.Continut = r.Form.Get("notita")
  140. fmt.Println(n.Path)
  141. err := inout.ObjToFile(n.Path, n, true)
  142. if err != nil {
  143. WriteError(w, err)
  144. return
  145. }
  146. referinta := r.Referer()
  147. if referinta != "" {
  148. http.Redirect(w, r, referinta, http.StatusSeeOther)
  149. } else {
  150. http.Redirect(w, r, "/index.html", http.StatusSeeOther)
  151. }
  152. case "create_dir":
  153. r.ParseForm()
  154. path := filepath.Join("notes_folder", r.Form.Get("director"), r.Form.Get("subdirector"))
  155. fmt.Println(path)
  156. err := os.Mkdir(path, 0755)
  157. if err != nil {
  158. WriteError(w, err)
  159. return
  160. }
  161. referinta := r.Referer()
  162. if referinta != "" {
  163. http.Redirect(w, r, referinta, http.StatusSeeOther)
  164. } else {
  165. http.Redirect(w, r, "/index.html", http.StatusSeeOther)
  166. }
  167. }
  168. }
  169. resp, code := inout.ParseTemplate("templates/error.tmpl", fmt.Errorf("method %s not allowed", r.Method))
  170. w.Header().Set("Content-Type", "text/html")
  171. w.WriteHeader(code)
  172. w.Write(resp)
  173. }
  174. func Design_viewer(w http.ResponseWriter, r *http.Request, s *Server, filename string) {
  175. var continut string
  176. if filename == "" {
  177. continut = ""
  178. } else {
  179. var note types.Notita
  180. err := inout.FileToObj(filename, &note)
  181. if err != nil {
  182. WriteError(w, err)
  183. return
  184. }
  185. continut = note.Continut
  186. }
  187. f := inout.Folder{}
  188. err := inout.GetFolderStructure(s.NotesDir, &f)
  189. if err != nil {
  190. WriteError(w, err)
  191. return
  192. }
  193. data := struct {
  194. Folders inout.Folder
  195. Continut string
  196. Notepath string
  197. Titlu string
  198. }{
  199. Folders: f,
  200. Continut: continut,
  201. Notepath: filename,
  202. Titlu: "lapte",
  203. }
  204. renderPage(w, []string{
  205. "templates/design.tmpl",
  206. "templates/design/sections/nav_big.tmpl",
  207. }, data)
  208. }
  209. func WriteError(w http.ResponseWriter, err error) {
  210. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  211. w.Header().Set("Content-Type", "text/html")
  212. w.WriteHeader(code)
  213. w.Write(resp)
  214. }
  215. func renderPage(w http.ResponseWriter, templates []string, data any) {
  216. tmpl, err := template.New(filepath.Base(templates[0])).Funcs(inout.GetFuncMap()).ParseFiles(templates...)
  217. if err != nil {
  218. WriteError(w, err)
  219. return
  220. }
  221. err = tmpl.ExecuteTemplate(w, filepath.Base(templates[0]), data)
  222. if err != nil {
  223. WriteError(w, err)
  224. return
  225. }
  226. }