aboutsummaryrefslogtreecommitdiff
path: root/imgs.go
diff options
context:
space:
mode:
authorJulian Hurst <ark@mansus.space>2023-01-15 02:16:35 +0100
committerJulian Hurst <ark@mansus.space>2023-01-15 02:16:35 +0100
commit09a34dda989df0f74bbfcd11ac63254d61b92a18 (patch)
treea62769481ceea1cd235b60c930a50e7a7c5a49e0 /imgs.go
parent7d502441a6bd210aff8a8625ee87ea5a1fbbd7ee (diff)
downloaddocspace-09a34dda989df0f74bbfcd11ac63254d61b92a18.tar.gz
Add images support (inf scroll via htmx of images taken from user docs)
This commit also includes a migration from css to scss, some improvements to the redirection workflow when no session is found and refactors concerning flash cookies.
Diffstat (limited to 'imgs.go')
-rw-r--r--imgs.go186
1 files changed, 186 insertions, 0 deletions
diff --git a/imgs.go b/imgs.go
new file mode 100644
index 0000000..ee67083
--- /dev/null
+++ b/imgs.go
@@ -0,0 +1,186 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "mime"
+ "net/http"
+ "strconv"
+ "path"
+ "path/filepath"
+ "sort"
+)
+
+const pageSize = 5
+
+func imgs(w http.ResponseWriter, r *http.Request) {
+ u, err := checkSession(w, r)
+ if u != nil && err == nil {
+ fragment := r.URL.Query().Has("fragment")
+ pageQuery := r.URL.Query().Get("page")
+ if pageQuery == "" {
+ pageQuery = "0"
+ }
+ page, err := strconv.Atoi(pageQuery)
+ if err != nil {
+ sendError(w, r, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ userDocPath := filepath.Join(baseDocDir, u.User)
+ err = os.Mkdir(userDocPath, 0750)
+ if err != nil && !os.IsExist(err) {
+ sendError(w, r, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ //files, err := os.ReadDir(userDocPath)
+ //if err != nil {
+ // sendError(w, r, err.Error(), http.StatusInternalServerError)
+ // return
+ //}
+ //sort.Slice(files, func(i, j int) bool {
+ // info1, err := files[i].Info()
+ // if err != nil {
+ // return false
+ // }
+ // info2, err := files[j].Info()
+ // if err != nil {
+ // return false
+ // }
+ // return info1.ModTime().After(info2.ModTime())
+ //})
+ start := page * pageSize
+ //imgs := extractImgs(files, start)
+ imgs, err := extractImgsGlob(userDocPath)
+ if err != nil {
+ sendError(w, r, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ sort.Slice(imgs, func(i, j int) bool {
+ return imgs[i].ModTime.After(imgs[j].ModTime)
+ })
+ end := start + pageSize
+ if end > len(imgs) {
+ end = len(imgs)
+ }
+ flasherr := consumeFlash(w, r, "error")
+ data := struct {
+ Imgs []Doc
+ Start int
+ End int
+ NbFiles int
+ Page int
+ Error string
+ }{
+ imgs[start:end],
+ start + 1,
+ end,
+ len(imgs),
+ page,
+ flasherr,
+ }
+ if fragment {
+ //serveSimple(w, r, data, "templates/imgs_stub.html")
+ serveSimple(w, r, data, "templates/imgs_page.html", "templates/imgs_stub.html")
+ } else {
+ serveTemplate(w, r, data, "templates/imgs_page.html", "templates/imgs.html")
+ }
+ return
+ } else if err != nil {
+ sendError(w, r, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ sendFlash(w, r, "redirect", "/imgs")
+ http.Redirect(w, r, "/login", http.StatusSeeOther)
+}
+
+func extractImgsGlob(userDocPath string) ([]Doc, error) {
+ var typs []string = []string {
+ "image/jpeg",
+ "image/png",
+ "image/gif",
+ "image/avif",
+ "image/bmp",
+ "image/vnd.microsoft.icon",
+ "image/svg+xml",
+ "image/tiff",
+ "image/webp",
+ }
+ var exts []string
+ for _, typ := range typs {
+ e, err := mime.ExtensionsByType(typ)
+ if err != nil {
+ return nil, err
+ }
+ exts = append(exts, e...)
+ }
+ var imgs []Doc
+ for _, ext := range exts {
+ glob := fmt.Sprintf("*%s", ext)
+ p := filepath.Join(userDocPath, glob)
+ matches, err := filepath.Glob(p)
+ if err != nil {
+ return nil, err
+ }
+ for _, match := range matches {
+ info, err := os.Stat(match)
+ if err != nil {
+ return nil, err
+ }
+ imgs = append(imgs, Doc {
+ info.Name(),
+ humanize(info.Size()),
+ info.ModTime(),
+ path.Join(userDocPath, info.Name()),
+ })
+ }
+ }
+ return imgs, nil
+}
+
+//func extractImgsPaged(files []fs.DirEntry, start int) []Doc {
+// var typs []string = []string {
+// "image/jpeg",
+// "image/png",
+// "image/gif",
+// "image/avif",
+// "image/bmp",
+// "image/vnd.microsoft.icon",
+// "image/svg+xml",
+// "image/tiff",
+// "image/webp",
+// }
+// var exts []string
+// for _, typ := range typs {
+// e, err := mime.ExtensionsByType(typ)
+// if err != nil {
+// sendError(w, r, err.Error(), http.StatusInternalServerError)
+// return
+// }
+// exts = append(exts, e...)
+// }
+// var imgs []Doc
+// var i int = 0
+// for _, file := range files {
+// if i >= start + pageSize {
+// break
+// }
+// for _, ext := range exts {
+// if strings.HasSuffix(file.Name(), ext) && i >= start {
+// info, err := file.Info()
+// if err != nil {
+// sendError(w, r, err.Error(), http.StatusInternalServerError)
+// return
+// }
+// imgs = append(imgs, Doc {
+// file.Name(),
+// humanize(info.Size()),
+// info.ModTime(),
+// path.Join(baseDocDir, u.User, file.Name()),
+// })
+// i++
+// break
+// }
+// }
+// }
+// return imgs
+//}