auth, api/auth:
use `http.StatusFound`(302) to redirect request
utils/error:
add `Redirect()` to redirect request
add `notFoundErr` empty struct
add `NotFoundClose`, `NotFoundCloseIf` and `NotFoundCloseHandler` functions
adjust `Recoverer()` middleware to implement `NotFoundClose*` functions
api/artworks:
restrict private artworks visibility
assets:
remove `WebAssetHandler` handler
move `FilesAssetsHandler` and `ThumbnailAssetsHandler` to `src/web`
router:
endpoint `/api/auth/refresh` can handle all http method
select `/{name}.{ext}` handler by `configs.Config.Debug` config (load from disk or embed FS)
src/web:
remove `EventWatcher` and `EventReload` functions
restrict private artworks visibility in `ArtworksIDHandler` and `ArtworksNoScriptIDHandler`
move `FilesAssetsHandler` and `ThumbnailAssetsHandler` from `assets`
web/scripts/submit_url:
clearn input box after success request
web > webfs:
rename package name to `webfs`
rename `FS` variable to `Root`
add `Sub(dir string)` function to access sub FS
52 lines
783 B
Go
52 lines
783 B
Go
package webfs
|
|
|
|
import (
|
|
"embed"
|
|
"fmt"
|
|
"io/fs"
|
|
"path"
|
|
)
|
|
|
|
//go:embed assets scripts styles templates
|
|
var webFS embed.FS
|
|
|
|
var Root fs.FS
|
|
|
|
func init() {
|
|
Root = prefixFS{root: "web", fs: webFS}
|
|
}
|
|
|
|
type prefixFS struct {
|
|
root string
|
|
fs fs.FS
|
|
}
|
|
|
|
func (p prefixFS) Open(name string) (fs.File, error) {
|
|
clean := path.Clean(name)
|
|
|
|
if clean == p.root {
|
|
return p.fs.Open(".")
|
|
}
|
|
|
|
return p.fs.Open(clean[len(p.root + "/"):])
|
|
}
|
|
|
|
func (p prefixFS) ReadDir(name string) ([]fs.DirEntry, error) {
|
|
clean := path.Clean(name)
|
|
|
|
if clean == p.root {
|
|
return fs.ReadDir(p.fs, ".")
|
|
}
|
|
|
|
return fs.ReadDir(p.fs, clean[len(p.root + "/"):])
|
|
}
|
|
|
|
func Sub(dir string) fs.FS {
|
|
sub, err := fs.Sub(Root, dir)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to create subfs: %w", err))
|
|
}
|
|
|
|
return sub
|
|
}
|