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.

84 lines
1.7 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 := q.CheckValid()
  49. if err != nil {
  50. pg.Message = err.Error()
  51. } else {
  52. err := ctx.Storage.AddQURL(q)
  53. if err != nil {
  54. http.Error(w, fmt.Sprintf("Database error: %s", err.Error()),
  55. http.StatusInternalServerError)
  56. return
  57. }
  58. pg.Message = "URL Added."
  59. pg.URL = fmt.Sprintf("https://qurl.org/%s", qurl.ToString(q.ID))
  60. }
  61. }
  62. }
  63. var buf bytes.Buffer
  64. err := ctx.template.Execute(&buf, pg)
  65. if err != nil {
  66. http.Error(w, fmt.Sprintf("Template execute error: %s", err.Error()),
  67. http.StatusInternalServerError)
  68. return
  69. }
  70. w.Header().Set("Content-Length", fmt.Sprintf("%d", buf.Len()))
  71. w.Header().Set("Content-Type", "text/html")
  72. w.Write(buf.Bytes())
  73. }