generated from tsivinsky/go-template
allow to upload images
but also files, hmmmm
This commit is contained in:
104
main.go
104
main.go
@@ -3,9 +3,12 @@ package main
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"image-storage/auth"
|
||||
"image-storage/model"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
@@ -55,6 +58,13 @@ func main() {
|
||||
return fmt.Errorf("failed to populate user object after creating it: %v", err)
|
||||
}
|
||||
|
||||
expiryTime := time.Now().Add(time.Hour * 24 * 30)
|
||||
token, err := auth.GenerateUserToken(user.ID, expiryTime)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to generate access token: %v", err)
|
||||
}
|
||||
auth.SetUserCookie(w, token, expiryTime)
|
||||
|
||||
return srv.JSON(w, user, 201)
|
||||
})
|
||||
|
||||
@@ -84,9 +94,103 @@ func main() {
|
||||
return nil
|
||||
}
|
||||
|
||||
expiryTime := time.Now().Add(time.Hour * 24 * 30)
|
||||
token, err := auth.GenerateUserToken(user.ID, expiryTime)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to generate access token: %v", err)
|
||||
}
|
||||
auth.SetUserCookie(w, token, expiryTime)
|
||||
|
||||
return srv.JSON(w, user, 200)
|
||||
})
|
||||
|
||||
srv.Handle("POST /api/images", func(w http.ResponseWriter, r *http.Request) error {
|
||||
userId, err := auth.GetUserIdFromRequest(r)
|
||||
if err != nil {
|
||||
srv.Error(w, "unauthorized", err, 401)
|
||||
return nil
|
||||
}
|
||||
|
||||
user := &model.User{Model: model.Model{ID: userId}}
|
||||
if err := user.FindByID(db); err != nil {
|
||||
srv.Error(w, "user not found", nil, 401)
|
||||
return nil
|
||||
}
|
||||
|
||||
data, err := io.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read request body: %v", err)
|
||||
}
|
||||
|
||||
img := &model.Image{
|
||||
UserID: user.ID,
|
||||
Data: data,
|
||||
ContentType: r.Header.Get("Content-Type"),
|
||||
}
|
||||
if err := img.Create(db); err != nil {
|
||||
srv.Error(w, "failed to save image to database: %v", err, 400)
|
||||
return nil
|
||||
}
|
||||
|
||||
return srv.JSON(w, img, 201)
|
||||
})
|
||||
|
||||
srv.Handle("GET /api/images", func(w http.ResponseWriter, r *http.Request) error {
|
||||
userId, err := auth.GetUserIdFromRequest(r)
|
||||
if err != nil {
|
||||
srv.Error(w, "unauthorized", err, 401)
|
||||
return nil
|
||||
}
|
||||
|
||||
rows, err := db.Queryx("SELECT * FROM images WHERE user_id = ?", userId)
|
||||
if err != nil {
|
||||
srv.Error(w, "images not found", err, 400)
|
||||
return nil
|
||||
}
|
||||
|
||||
images := []model.Image{}
|
||||
for rows.Next() {
|
||||
img := model.Image{}
|
||||
if err := rows.StructScan(&img); err != nil {
|
||||
log.Printf("failed to save image to struct: %v", err)
|
||||
continue
|
||||
}
|
||||
images = append(images, img)
|
||||
}
|
||||
|
||||
return srv.JSON(w, images, 200)
|
||||
})
|
||||
|
||||
srv.Handle("GET /images/{id}", func(w http.ResponseWriter, r *http.Request) error {
|
||||
img := &model.Image{ID: r.PathValue("id")}
|
||||
if err := img.FindByID(db); err != nil {
|
||||
srv.Error(w, "image not found", nil, 404)
|
||||
return nil
|
||||
}
|
||||
|
||||
w.Header().Set("Content-Type", img.ContentType)
|
||||
w.Write(img.Data)
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
srv.Handle("DELETE /api/images/{id}", func(w http.ResponseWriter, r *http.Request) error {
|
||||
img := &model.Image{ID: r.PathValue("id")}
|
||||
if err := img.FindByID(db); err != nil {
|
||||
srv.Error(w, "image not found", nil, 404)
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := img.DeleteByID(db); err != nil {
|
||||
srv.Error(w, "failed to delete image: %v", err, 500)
|
||||
return nil
|
||||
}
|
||||
|
||||
return srv.JSON(w, struct {
|
||||
Ok bool `json:"ok"`
|
||||
}{true}, 200)
|
||||
})
|
||||
|
||||
if err := srv.ListenAndServe(); err != nil {
|
||||
log.Fatalf("failed to start http server: %v", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user