2025-04-16 00:58:44 -04:00

71 lines
1.5 KiB
Go

package file
import (
"database/sql"
"errors"
"net/http"
"strconv"
"strings"
"github.com/spotdemo4/trevstack/server/internal/interceptors"
"github.com/spotdemo4/trevstack/server/internal/sqlc"
)
type FileHandler struct {
db *sqlc.Queries
key []byte
}
func (h *FileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
userid, ok := interceptors.GetUserContext(r.Context())
if !ok {
http.Redirect(w, r, "/auth", http.StatusFound)
return
}
// Make sure this is a GET request
if r.Method != http.MethodGet {
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
return
}
// Get the file id from the path
pathItems := strings.Split(r.URL.Path, "/")
if len(pathItems) < 3 {
http.Redirect(w, r, "/auth", http.StatusFound)
return
}
id, err := strconv.Atoi(pathItems[2])
if err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
// Get the file from the database
file, err := h.db.GetFile(r.Context(), sqlc.GetFileParams{
ID: int64(id),
UserID: userid,
})
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
http.Error(w, "Not Found", http.StatusNotFound)
}
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", http.DetectContentType(file.Data))
w.Write(file.Data)
}
func NewFileHandler(db *sqlc.Queries, key string) http.Handler {
return interceptors.WithAuthRedirect(
&FileHandler{
db: db,
key: []byte(key),
},
key,
)
}