allow to upload images

but also files, hmmmm
This commit is contained in:
2026-03-16 21:45:39 +03:00
parent 3a8bc6df2d
commit d8fc6e481f
18 changed files with 437 additions and 1 deletions

104
main.go
View File

@@ -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)
}