a simple url shortener in Go (check it out at qurl.org)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
1.6 KiB

  1. package pages
  2. import (
  3. "bytes"
  4. "fmt"
  5. "html/template"
  6. "net/http"
  7. "qurl/qurl"
  8. "qurl/static"
  9. "qurl/storage"
  10. "time"
  11. )
  12. type SubmitHandler struct {
  13. Storage storage.Storage
  14. template *template.Template
  15. }
  16. type submitPage struct {
  17. Message string
  18. URL string
  19. }
  20. func (ctx *SubmitHandler) Init() error {
  21. ctx.template = template.New("submit.html")
  22. _, err := ctx.template.Parse(string(static.Assets["submit.html"]))
  23. if err != nil {
  24. return err
  25. }
  26. return nil
  27. }
  28. func (ctx *SubmitHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  29. var pg submitPage
  30. u := r.FormValue("url")
  31. if u == "" {
  32. pg.Message = "Not a valid URL."
  33. } else {
  34. q, err := ctx.Storage.GetQURLByURL(u)
  35. if err != nil {
  36. http.Error(w, fmt.Sprintf("Database error: %s", err.Error()),
  37. http.StatusInternalServerError)
  38. return
  39. }
  40. if q != nil {
  41. pg.Message = "URL already exists."
  42. pg.URL = fmt.Sprintf("https://qurl.org/%s", qurl.ToString(q.ID))
  43. } else {
  44. q = &qurl.QURL{
  45. URL: u,
  46. Created: time.Now(),
  47. }
  48. err := ctx.Storage.AddQURL(q)
  49. if err != nil {
  50. http.Error(w, fmt.Sprintf("Database error: %s", err.Error()),
  51. http.StatusInternalServerError)
  52. return
  53. }
  54. pg.Message = "URL Added."
  55. pg.URL = fmt.Sprintf("https://qurl.org/%s", qurl.ToString(q.ID))
  56. }
  57. }
  58. var buf bytes.Buffer
  59. err := ctx.template.Execute(&buf, pg)
  60. if err != nil {
  61. http.Error(w, fmt.Sprintf("Template execute error: %s", err.Error()),
  62. http.StatusInternalServerError)
  63. return
  64. }
  65. w.Header().Set("Content-Length", fmt.Sprintf("%d", buf.Len()))
  66. w.Header().Set("Content-Type", "text/html")
  67. w.Write(buf.Bytes())
  68. }