share.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package ui // import "miniflux.app/v2/internal/ui"
  4. import (
  5. "net/http"
  6. "time"
  7. "miniflux.app/v2/internal/http/request"
  8. "miniflux.app/v2/internal/http/response"
  9. "miniflux.app/v2/internal/storage"
  10. "miniflux.app/v2/internal/ui/view"
  11. )
  12. func (h *handler) createSharedEntry(w http.ResponseWriter, r *http.Request) {
  13. entryID := request.RouteInt64Param(r, "entryID")
  14. shareCode, err := h.store.EntryShareCode(request.UserID(r), entryID)
  15. if err != nil {
  16. response.HTMLServerError(w, r, err)
  17. return
  18. }
  19. response.HTMLRedirect(w, r, h.routePath("/share/%s", shareCode))
  20. }
  21. func (h *handler) unshareEntry(w http.ResponseWriter, r *http.Request) {
  22. entryID := request.RouteInt64Param(r, "entryID")
  23. if err := h.store.UnshareEntry(request.UserID(r), entryID); err != nil {
  24. response.HTMLServerError(w, r, err)
  25. return
  26. }
  27. response.HTMLRedirect(w, r, h.routePath("/shares"))
  28. }
  29. func (h *handler) sharedEntry(w http.ResponseWriter, r *http.Request) {
  30. shareCode := request.RouteStringParam(r, "shareCode")
  31. if shareCode == "" {
  32. response.HTMLNotFound(w, r)
  33. return
  34. }
  35. etag := shareCode
  36. response.NewBuilder(w, r).WithCaching(etag, 72*time.Hour, func(b *response.Builder) {
  37. builder := storage.NewAnonymousQueryBuilder(h.store)
  38. builder.WithShareCode(shareCode)
  39. entry, err := builder.GetEntry()
  40. if err != nil || entry == nil {
  41. response.HTMLNotFound(w, r)
  42. return
  43. }
  44. view := view.New(h.tpl, r)
  45. view.Set("entry", entry)
  46. b.WithHeader("Content-Type", "text/html; charset=utf-8")
  47. b.WithBodyAsBytes(view.Render("entry"))
  48. b.Write()
  49. })
  50. }