package api import ( "net/http" "os" "path" "reichard.io/imagini/graph/model" ) /** * Responsible for serving up static images / videos **/ func (api *API) mediaHandler(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { w.WriteHeader(http.StatusMethodNotAllowed) return } if path.Dir(r.URL.Path) != "/media" { w.WriteHeader(http.StatusMethodNotAllowed) return } // Acquire Width & Height Parameters query := r.URL.Query() width := query["width"] height := query["height"] _ = width _ = height // TODO: Caching & Resizing // - If both, force resize with new scale // - If one, scale resize proportionally // Pull out userID authContext := r.Context().Value("auth").(*model.AuthContext) rawUserID, _ := (*authContext.AccessToken).Get("sub") userID := rawUserID.(string) // Derive Path fileName := path.Base(r.URL.Path) folderPath := path.Join("/" + api.Config.DataPath + "/media/" + userID) mediaPath := path.Join(folderPath + "/" + fileName) // Check if File Exists _, err := os.Stat(mediaPath) if os.IsNotExist(err) { // TODO: Different HTTP Response Code? w.WriteHeader(http.StatusMethodNotAllowed) return } http.ServeFile(w, r, mediaPath) }