summaryrefslogtreecommitdiff
path: root/system/admin/server.go
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2016-10-07 00:24:53 -0700
committerSteve Manuel <nilslice@gmail.com>2016-10-07 00:24:53 -0700
commitb2e4fd9372f27d3202f07a329a5077b93a4b7390 (patch)
tree7a00e7753fdf3b4b8f8976e35fb4dd4c564c45a9 /system/admin/server.go
parentb5f028f0a720f1d23d2ce79d3e885fcb524bb79a (diff)
adding cache control and etags to responses for static assets + moved handlers/helper upload func
Diffstat (limited to 'system/admin/server.go')
-rw-r--r--system/admin/server.go141
1 files changed, 2 insertions, 139 deletions
diff --git a/system/admin/server.go b/system/admin/server.go
index 9461759..2c84479 100644
--- a/system/admin/server.go
+++ b/system/admin/server.go
@@ -1,15 +1,7 @@
package admin
import (
- "fmt"
- "io"
- "log"
"net/http"
- "os"
- "path/filepath"
- "strconv"
- "strings"
- "time"
"github.com/nilslice/cms/system/admin/user"
)
@@ -32,139 +24,10 @@ func Run() {
http.HandleFunc("/admin/edit", user.Auth(editHandler))
http.HandleFunc("/admin/edit/upload", user.Auth(editUploadHandler))
- http.HandleFunc("/admin/static/", func(res http.ResponseWriter, req *http.Request) {
- path := req.URL.Path
- pathParts := strings.Split(path, "/")[1:]
- pwd, err := os.Getwd()
- if err != nil {
- log.Fatal("Coudln't get current directory to set static asset source.")
- }
-
- filePathParts := make([]string, len(pathParts)+2, len(pathParts)+2)
- filePathParts = append(filePathParts, pwd)
- filePathParts = append(filePathParts, "system")
- filePathParts = append(filePathParts, pathParts...)
-
- http.ServeFile(res, req, filepath.Join(filePathParts...))
- })
+ http.HandleFunc("/admin/static/", CacheControl(staticAssetHandler))
// API path needs to be registered within server package so that it is handled
// even if the API server is not running. Otherwise, images/files uploaded
// through the editor will not load within the admin system.
- http.HandleFunc("/api/uploads/", func(res http.ResponseWriter, req *http.Request) {
- path := req.URL.Path
- pathParts := strings.Split(path, "/")[2:]
-
- pwd, err := os.Getwd()
- if err != nil {
- log.Fatal("Coudln't get current directory to set static asset source.")
- }
-
- filePathParts := make([]string, len(pathParts)+1, len(pathParts)+1)
- filePathParts = append(filePathParts, pwd)
- filePathParts = append(filePathParts, pathParts...)
-
- http.ServeFile(res, req, filepath.Join(filePathParts...))
- })
-}
-
-func storeFileUploads(req *http.Request) (map[string]string, error) {
- err := req.ParseMultipartForm(1024 * 1024 * 4) // maxMemory 4MB
- if err != nil {
- return nil, fmt.Errorf("%s", err)
- }
-
- ts := req.FormValue("timestamp")
-
- // To use for FormValue name:urlPath
- urlPaths := make(map[string]string)
-
- // get ts values individually to use as directory names when storing
- // uploaded images
- date := make(map[string]int)
- if ts == "" {
- now := time.Now()
- date["year"] = now.Year()
- date["month"] = int(now.Month())
- date["day"] = now.Day()
-
- // create timestamp format 'yyyy-mm-dd' and set in PostForm for
- // db insertion
- ts = fmt.Sprintf("%d-%02d-%02d", date["year"], date["month"], date["day"])
- req.PostForm.Set("timestamp", ts)
- } else {
- tsParts := strings.Split(ts, "-")
- year, err := strconv.Atoi(tsParts[0])
- if err != nil {
- return nil, fmt.Errorf("%s", err)
- }
-
- month, err := strconv.Atoi(tsParts[1])
- if err != nil {
- return nil, fmt.Errorf("%s", err)
- }
-
- day, err := strconv.Atoi(tsParts[2])
- if err != nil {
- return nil, fmt.Errorf("%s", err)
- }
-
- date["year"] = year
- date["month"] = month
- date["day"] = day
- }
-
- // get or create upload directory to save files from request
- pwd, err := os.Getwd()
- if err != nil {
- err := fmt.Errorf("Failed to locate current directory: %s", err)
- return nil, err
- }
-
- tsParts := strings.Split(ts, "-")
- urlPathPrefix := "api"
- uploadDirName := "uploads"
-
- uploadDir := filepath.Join(pwd, uploadDirName, tsParts[0], tsParts[1])
- err = os.MkdirAll(uploadDir, os.ModeDir|os.ModePerm)
-
- // loop over all files and save them to disk
- for name, fds := range req.MultipartForm.File {
- filename := fds[0].Filename
- src, err := fds[0].Open()
- if err != nil {
- err := fmt.Errorf("Couldn't open uploaded file: %s", err)
- return nil, err
-
- }
- defer src.Close()
-
- // check if file at path exists, if so, add timestamp to file
- absPath := filepath.Join(uploadDir, filename)
-
- if _, err := os.Stat(absPath); !os.IsNotExist(err) {
- filename = fmt.Sprintf("%d-%s", time.Now().Unix(), filename)
- absPath = filepath.Join(uploadDir, filename)
- }
-
- // save to disk (TODO: or check if S3 credentials exist, & save to cloud)
- dst, err := os.Create(absPath)
- if err != nil {
- err := fmt.Errorf("Failed to create destination file for upload: %s", err)
- return nil, err
- }
-
- // copy file from src to dst on disk
- if _, err = io.Copy(dst, src); err != nil {
- err := fmt.Errorf("Failed to copy uploaded file to destination: %s", err)
- return nil, err
- }
-
- // add name:urlPath to req.PostForm to be inserted into db
- urlPath := fmt.Sprintf("/%s/%s/%s/%s/%s", urlPathPrefix, uploadDirName, tsParts[0], tsParts[1], filename)
-
- urlPaths[name] = urlPath
- }
-
- return urlPaths, nil
+ http.HandleFunc("/api/uploads/", CacheControl(staticUploadHandler))
}