lens @ 5168a9476f0e83264ecafc85bc9145e8bdcbb8dc

  1package view
  2
  3import (
  4	"net/http"
  5	"strconv"
  6
  7	"git.sr.ht/~gabrielgio/img/pkg/database/repository"
  8	"git.sr.ht/~gabrielgio/img/pkg/ext"
  9	"git.sr.ht/~gabrielgio/img/templates"
 10)
 11
 12type (
 13	MediaView struct {
 14		mediaRepository    repository.MediaRepository
 15		userRepository     repository.UserRepository
 16		settingsRepository repository.SettingsRepository
 17	}
 18)
 19
 20func getPagination(w http.ResponseWriter, r *http.Request) *repository.Pagination {
 21	var (
 22		size    int
 23		page    int
 24		sizeStr = r.FormValue("size")
 25		pageStr = r.FormValue("page")
 26	)
 27
 28	if sizeStr == "" {
 29		size = 100
 30	} else if s, err := strconv.Atoi(sizeStr); err != nil {
 31		size = 100
 32	} else {
 33		size = s
 34	}
 35
 36	if pageStr == "" {
 37		page = 0
 38	} else if p, err := strconv.Atoi(pageStr); err != nil {
 39		page = 0
 40	} else {
 41		page = p
 42	}
 43
 44	return &repository.Pagination{
 45		Page: page,
 46		Size: size,
 47	}
 48}
 49
 50func NewMediaView(
 51	mediaRepository repository.MediaRepository,
 52	userRepository repository.UserRepository,
 53	settingsRepository repository.SettingsRepository,
 54) *MediaView {
 55	return &MediaView{
 56		mediaRepository:    mediaRepository,
 57		userRepository:     userRepository,
 58		settingsRepository: settingsRepository,
 59	}
 60}
 61
 62func (self *MediaView) Index(w http.ResponseWriter, r *http.Request) error {
 63	p := getPagination(w, r)
 64	token := ext.GetTokenFromCtx(w, r)
 65
 66	userPath, err := self.userRepository.GetPathFromUserID(r.Context(), token.UserID)
 67	if err != nil {
 68		return err
 69	}
 70
 71	p.Path = userPath
 72	medias, err := self.mediaRepository.List(r.Context(), p)
 73	if err != nil {
 74		return err
 75	}
 76
 77	settings, err := self.settingsRepository.Load(r.Context())
 78	if err != nil {
 79		return err
 80	}
 81
 82	page := &templates.MediaPage{
 83		Medias: medias,
 84		Next: &repository.Pagination{
 85			Size: p.Size,
 86			Page: p.Page + 1,
 87		},
 88		Settings: settings,
 89	}
 90
 91	templates.WritePageTemplate(w, page)
 92
 93	return nil
 94}
 95
 96func (self *MediaView) GetImage(w http.ResponseWriter, r *http.Request) error {
 97	pathHash := r.FormValue("path_hash")
 98
 99	media, err := self.mediaRepository.Get(r.Context(), pathHash)
100	if err != nil {
101		return err
102	}
103
104	w.Header().Set("Content-Type", media.MIMEType)
105	http.ServeFile(w, r, media.Path)
106	return nil
107}
108
109func (self *MediaView) GetThumbnail(w http.ResponseWriter, r *http.Request) error {
110	pathHash := r.FormValue("path_hash")
111
112	path, err := self.mediaRepository.GetThumbnailPath(r.Context(), pathHash)
113	if err != nil {
114		http.Redirect(w, r, "/media/image?path_hash="+pathHash, http.StatusTemporaryRedirect)
115		// nolint: nilerr
116		return nil
117	}
118
119	w.Header().Set("Content-Type", "image/jpeg")
120	http.ServeFile(w, r, path)
121	return nil
122}
123
124func (self *MediaView) SetMyselfIn(r *ext.Router) {
125	r.GET("/media/", self.Index)
126	r.POST("/media/", self.Index)
127
128	r.GET("/media/image/", self.GetImage)
129	r.GET("/media/thumbnail/", self.GetThumbnail)
130}