diff --git a/backend/cmd/api/main.go b/backend/cmd/api/main.go index 1bcc76d..944ff61 100644 --- a/backend/cmd/api/main.go +++ b/backend/cmd/api/main.go @@ -38,6 +38,7 @@ func main() { r.GET("/api/deliveries/count", h.GetDeliveryCount) r.POST("/api/deliveries", h.CreateDelivery) r.PATCH("/api/deliveries/:id", h.UpdateDelivery) + r.PATCH("/api/deliveries/:id/status", h.UpdateDeliveryStatus) r.DELETE("/api/deliveries/:id", h.DeleteDelivery) r.Run(":8080") diff --git a/backend/internal/db/queries/query.sql b/backend/internal/db/queries/query.sql index 184c9e6..eff60bf 100644 --- a/backend/internal/db/queries/query.sql +++ b/backend/internal/db/queries/query.sql @@ -16,4 +16,7 @@ DELETE FROM deliveries WHERE id = $1; UPDATE deliveries SET date = $1, pickup_location = $2, product_name = $3, address = $4, phone = $5, additional_phone = $6, has_elevator = $7, comment = $8, updated_at = NOW() WHERE id = $9; -- name: GetDeliveryCount :many -SELECT COUNT(*) as count, date FROM deliveries WHERE date >= DATE_TRUNC('month', CURRENT_DATE) GROUP BY date; \ No newline at end of file +SELECT COUNT(*) as count, date FROM deliveries WHERE date >= DATE_TRUNC('month', CURRENT_DATE) GROUP BY date; + +-- name: UpdateDeliveryStatus :exec +UPDATE deliveries SET status = $1, updated_at = NOW() WHERE id = $2; diff --git a/backend/internal/db/sqlc/querier.go b/backend/internal/db/sqlc/querier.go index 953320e..1db82eb 100644 --- a/backend/internal/db/sqlc/querier.go +++ b/backend/internal/db/sqlc/querier.go @@ -17,6 +17,7 @@ type Querier interface { GetDeliveryByID(ctx context.Context, id pgtype.UUID) (Delivery, error) GetDeliveryCount(ctx context.Context) ([]GetDeliveryCountRow, error) UpdateDelivery(ctx context.Context, arg UpdateDeliveryParams) error + UpdateDeliveryStatus(ctx context.Context, arg UpdateDeliveryStatusParams) error } var _ Querier = (*Queries)(nil) diff --git a/backend/internal/db/sqlc/query.sql.go b/backend/internal/db/sqlc/query.sql.go index 17e6135..da975a5 100644 --- a/backend/internal/db/sqlc/query.sql.go +++ b/backend/internal/db/sqlc/query.sql.go @@ -186,3 +186,17 @@ func (q *Queries) UpdateDelivery(ctx context.Context, arg UpdateDeliveryParams) ) return err } + +const updateDeliveryStatus = `-- name: UpdateDeliveryStatus :exec +UPDATE deliveries SET status = $1, updated_at = NOW() WHERE id = $2 +` + +type UpdateDeliveryStatusParams struct { + Status string `db:"status" json:"status"` + ID pgtype.UUID `db:"id" json:"id"` +} + +func (q *Queries) UpdateDeliveryStatus(ctx context.Context, arg UpdateDeliveryStatusParams) error { + _, err := q.db.Exec(ctx, updateDeliveryStatus, arg.Status, arg.ID) + return err +} diff --git a/backend/internal/delivery/handler.go b/backend/internal/delivery/handler.go index 7eb6a1d..9377d62 100644 --- a/backend/internal/delivery/handler.go +++ b/backend/internal/delivery/handler.go @@ -160,6 +160,47 @@ func (h *Handler) UpdateDelivery(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "Delivery updated"}) } +// PATCH /api/deliveries/:id/status +func (h *Handler) UpdateDeliveryStatus(c *gin.Context) { + var req struct { + Status string `json:"status"` + } + + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request body", "details": err.Error()}) + return + } + + id := c.Param("id") + + if id == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "ID is required"}) + return + } + + parsedID, err := uuid.Parse(id) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid UUID format", "details": err.Error()}) + return + } + + status := req.Status + if status == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "Status is required"}) + return + } + + if err := h.queries.UpdateDeliveryStatus(c.Request.Context(), sqlc.UpdateDeliveryStatusParams{ + ID: pgtype.UUID{Bytes: parsedID, Valid: true}, + Status: status, + }); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update delivery status", "details": err.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{"message": "Delivery status updated"}) +} + // DELETE /api/deliveries/:id func (h *Handler) DeleteDelivery(c *gin.Context) { id := c.Param("id")