diff options
| author | Julian Hurst <ark@mansus.space> | 2023-01-15 02:16:35 +0100 |
|---|---|---|
| committer | Julian Hurst <ark@mansus.space> | 2023-01-15 02:16:35 +0100 |
| commit | 09a34dda989df0f74bbfcd11ac63254d61b92a18 (patch) | |
| tree | a62769481ceea1cd235b60c930a50e7a7c5a49e0 /imgs.go | |
| parent | 7d502441a6bd210aff8a8625ee87ea5a1fbbd7ee (diff) | |
| download | docspace-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.go | 186 |
1 files changed, 186 insertions, 0 deletions
@@ -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 +//} |
