endpoint_funcs.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. w.WriteHeader(http.StatusInternalServerError)
  24. w.Write([]byte(WEB_ERR))
  25. template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
  26. return
  27. }
  28. if err := goldmark.Convert([]byte(notita.Continut), &buf); err != nil {
  29. w.WriteHeader(http.StatusInternalServerError)
  30. w.Write([]byte(WEB_ERR))
  31. template.Must(template.ParseFiles("templates/error.tmpl")).Execute(w, err)
  32. return
  33. }
  34. notita.HTML = buf.String()
  35. resp, code := inout.ParseTemplate("templates/notita.tmpl", notita)
  36. w.WriteHeader(code)
  37. w.Write(resp)
  38. }
  39. func ListNotes(w http.ResponseWriter, r *http.Request, s *Server) {
  40. if r.Method == "GET" {
  41. f := inout.Folder{}
  42. err := inout.GetFolderStructure(s.NotesDir, &f)
  43. if err != nil {
  44. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  45. w.Header().Set("Content-Type", "text/html")
  46. w.WriteHeader(code)
  47. w.Write(resp)
  48. return
  49. }
  50. resp, code := inout.ParseTemplate("templates/list_notes.tmpl", f)
  51. w.Header().Set("Content-Type", "text/html")
  52. w.WriteHeader(code)
  53. w.Write(resp)
  54. return
  55. }
  56. w.WriteHeader(http.StatusMethodNotAllowed)
  57. w.Write([]byte("methoda nepermisa"))
  58. }
  59. func EditNotes(w http.ResponseWriter, r *http.Request, filename string) {
  60. if r.Method == "GET" {
  61. f := types.Notita{}
  62. err := inout.FileToObj(filename, &f)
  63. if err != nil {
  64. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  65. w.WriteHeader(code)
  66. w.Write(resp)
  67. }
  68. resp, code := inout.ParseTemplate("templates/edit_notes.tmpl", f)
  69. w.WriteHeader(code)
  70. w.Write(resp)
  71. return
  72. }
  73. resp, code := inout.ParseTemplate("templates/error.tmpl", fmt.Errorf("method %s not allowed", r.Method))
  74. w.WriteHeader(code)
  75. w.Write(resp)
  76. }
  77. func MDToHTML(w http.ResponseWriter, r *http.Request) {
  78. body, err := io.ReadAll(r.Body)
  79. if err != nil {
  80. fmt.Fprintf(w, "%+v", err)
  81. }
  82. mp := make(map[string]any)
  83. err = json.Unmarshal(body, &mp)
  84. if err != nil {
  85. fmt.Fprintf(w, "%+v", err)
  86. }
  87. var buff bytes.Buffer
  88. md := goldmark.New(
  89. goldmark.WithExtensions(extension.Table,
  90. extension.DefinitionList,
  91. extension.Footnote,
  92. extension.Typographer))
  93. err = md.Convert([]byte(mp["markdown"].(string)), &buff)
  94. if err != nil {
  95. fmt.Fprintf(w, "%+v", err)
  96. }
  97. w.Write(buff.Bytes())
  98. }
  99. func API(w http.ResponseWriter, r *http.Request, s *Server) {
  100. action := strings.TrimPrefix(r.URL.Path, "/api/")
  101. if r.Method == "POST" {
  102. //w.WriteHeader(http.StatusNotImplemented)
  103. //w.Write(fmt.Appendf(nil, "action not implemented: %s", action))
  104. switch action {
  105. case "save_note":
  106. r.ParseForm()
  107. n := types.Notita{}
  108. n.Titlu = r.Form.Get("titlu")
  109. n.Continut = r.Form.Get("notita")
  110. n.Folder = r.Form.Get("director")
  111. if n.Folder == "" {
  112. n.Folder = "default"
  113. }
  114. err := inout.SafeDir(n.Folder)
  115. if err != nil {
  116. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  117. w.Header().Set("Content-Type", "text/html")
  118. w.WriteHeader(code)
  119. w.Write(resp)
  120. return
  121. }
  122. path := filepath.Join(s.NotesDir, n.Folder)
  123. err = os.MkdirAll(path, 0755)
  124. fmt.Println(n.Folder)
  125. if err != nil {
  126. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  127. w.Header().Set("Content-Type", "text/html")
  128. w.WriteHeader(code)
  129. w.Write(resp)
  130. return
  131. }
  132. fisier := fmt.Sprintf("notita-%s.json", time.Now().Format("2006-01-02-150405.999999"))
  133. n.Path = filepath.Join("notes_folder", n.Folder, fisier)
  134. //fmt.Println(fisier, r.Form)
  135. //return
  136. err = inout.ObjToFile(filepath.Join(s.NotesDir, n.Folder, fisier), n, true)
  137. if err != nil {
  138. resp, code := inout.ParseTemplate("templates/error.tmpl", err)
  139. w.Header().Set("Content-Type", "text/html")
  140. w.WriteHeader(code)
  141. w.Write(resp)
  142. return
  143. }
  144. referinta := r.Referer()
  145. fmt.Println(referinta)
  146. if referinta != "" {
  147. http.Redirect(w, r, referinta, http.StatusSeeOther)
  148. } else {
  149. http.Redirect(w, r, "/index.html", http.StatusSeeOther)
  150. }
  151. case "update_note":
  152. r.ParseForm()
  153. n := types.Notita{}
  154. n.Titlu = r.Form.Get("titlu")
  155. n.Path = r.Form.Get("path")
  156. n.Folder = r.Form.Get("director")
  157. n.Continut = r.Form.Get("notita")
  158. fmt.Println(n.Path)
  159. err := inout.ObjToFile(n.Path, n, true)
  160. if err != nil {
  161. w.WriteHeader(http.StatusInternalServerError)
  162. fmt.Fprintf(w, "%+v", err)
  163. return
  164. }
  165. referinta := r.Referer()
  166. if referinta != "" {
  167. http.Redirect(w, r, referinta, http.StatusSeeOther)
  168. } else {
  169. http.Redirect(w, r, "/index.html", http.StatusSeeOther)
  170. }
  171. }
  172. }
  173. resp, code := inout.ParseTemplate("templates/error.tmpl", fmt.Errorf("method %s not allowed", r.Method))
  174. w.Header().Set("Content-Type", "text/html")
  175. w.WriteHeader(code)
  176. w.Write(resp)
  177. }