Story #02: Manage Fruits — full CRUD with synonyms and images #2

Merged
julia merged 6 commits from feature/02-manage-fruits into main 2026-06-17 12:46:15 +00:00
3 changed files with 14 additions and 5 deletions
Showing only changes of commit 841f53fac8 - Show all commits
+10 -4
View File
@@ -3,8 +3,10 @@ package handler
import ( import (
"context" "context"
"errors" "errors"
"io"
"net/http" "net/http"
"strconv" "strconv"
"strings"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
@@ -60,10 +62,10 @@ func NewFruitHandler(repo FruitRepository) *FruitHandler {
func validateFruit(dto domain.FruitWriteDTO) []string { func validateFruit(dto domain.FruitWriteDTO) []string {
var errs []string var errs []string
if dto.Name == "" { if strings.TrimSpace(dto.Name) == "" {
errs = append(errs, "name is required") errs = append(errs, "name is required")
} }
if dto.OSDBNumber == "" { if strings.TrimSpace(dto.OSDBNumber) == "" {
errs = append(errs, "osdb_number is required") errs = append(errs, "osdb_number is required")
} }
if _, ok := validFruitTypes[dto.FruitType]; !ok { if _, ok := validFruitTypes[dto.FruitType]; !ok {
@@ -220,8 +222,12 @@ func (h *FruitHandler) UploadImage(c echo.Context) error {
} }
defer src.Close() defer src.Close()
data := make([]byte, file.Size) if file.Size == 0 {
if _, err := src.Read(data); err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "image file is empty"})
}
data, err := io.ReadAll(src)
if err != nil {
return c.JSON(http.StatusInternalServerError, map[string]string{"error": "internal server error"}) return c.JSON(http.StatusInternalServerError, map[string]string{"error": "internal server error"})
} }
@@ -41,7 +41,9 @@ func TestFruitRepoIntegration(t *testing.T) {
// cleanup after test // cleanup after test
t.Cleanup(func() { t.Cleanup(func() {
pool.Exec(ctx, `DELETE FROM fruits WHERE osdb_number LIKE 'TEST-%'`) if _, err := pool.Exec(ctx, `DELETE FROM fruits WHERE osdb_number LIKE 'TEST-%'`); err != nil {
t.Logf("cleanup: %v", err)
}
}) })
// Create // Create
+1
View File
@@ -52,6 +52,7 @@ export const useFruitStore = defineStore('fruit', () => {
const fruit = await createFruit(dto) const fruit = await createFruit(dto)
fruits.value = [fruit, ...fruits.value] fruits.value = [fruit, ...fruits.value]
total.value += 1 total.value += 1
offset.value = 0
return fruit return fruit
} }