75 lines
2.2 KiB
Go
75 lines
2.2 KiB
Go
|
|
package services
|
||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
"fmt"
|
||
|
|
"regexp"
|
||
|
|
|
||
|
|
"github.com/CubeCraft-Creations/Extrudex/backend/internal/dtos"
|
||
|
|
"github.com/CubeCraft-Creations/Extrudex/backend/internal/models"
|
||
|
|
)
|
||
|
|
|
||
|
|
// colorHexPattern validates hex color strings like #FF0000 or #ff0000.
|
||
|
|
var colorHexPattern = regexp.MustCompile(`^#[0-9A-Fa-f]{6}$`)
|
||
|
|
|
||
|
|
// validateFilamentSpool performs validation on a FilamentSpool entity.
|
||
|
|
// Returns a descriptive error on failure.
|
||
|
|
func validateFilamentSpool(s *models.FilamentSpool) error {
|
||
|
|
if s.Name == "" {
|
||
|
|
return errors.New("name is required")
|
||
|
|
}
|
||
|
|
if s.MaterialBaseID <= 0 {
|
||
|
|
return errors.New("material_base_id is required")
|
||
|
|
}
|
||
|
|
if s.MaterialFinishID <= 0 {
|
||
|
|
return errors.New("material_finish_id is required")
|
||
|
|
}
|
||
|
|
if !colorHexPattern.MatchString(s.ColorHex) {
|
||
|
|
return fmt.Errorf("color_hex must be a valid hex color (e.g., #FF0000)")
|
||
|
|
}
|
||
|
|
if s.InitialGrams <= 0 {
|
||
|
|
return errors.New("initial_grams must be greater than 0")
|
||
|
|
}
|
||
|
|
if s.RemainingGrams < 0 {
|
||
|
|
return errors.New("remaining_grams must be >= 0")
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// ValidateCreateFilamentRequest validates a creation DTO.
|
||
|
|
func ValidateCreateFilamentRequest(req dtos.CreateFilamentRequest) error {
|
||
|
|
if req.Name == "" {
|
||
|
|
return errors.New("name is required")
|
||
|
|
}
|
||
|
|
if req.MaterialBaseID <= 0 {
|
||
|
|
return errors.New("material_base_id is required")
|
||
|
|
}
|
||
|
|
if req.MaterialFinishID <= 0 {
|
||
|
|
return errors.New("material_finish_id is required")
|
||
|
|
}
|
||
|
|
if !colorHexPattern.MatchString(req.ColorHex) {
|
||
|
|
return fmt.Errorf("color_hex must be a valid hex color (e.g., #FF0000)")
|
||
|
|
}
|
||
|
|
if req.InitialGrams <= 0 {
|
||
|
|
return errors.New("initial_grams must be greater than 0")
|
||
|
|
}
|
||
|
|
if req.RemainingGrams < 0 {
|
||
|
|
return errors.New("remaining_grams must be >= 0")
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// ValidateUpdateFilamentRequest validates partial update fields.
|
||
|
|
func ValidateUpdateFilamentRequest(req dtos.UpdateFilamentRequest) error {
|
||
|
|
if req.ColorHex != nil && !colorHexPattern.MatchString(*req.ColorHex) {
|
||
|
|
return fmt.Errorf("color_hex must be a valid hex color (e.g., #FF0000)")
|
||
|
|
}
|
||
|
|
if req.InitialGrams != nil && *req.InitialGrams <= 0 {
|
||
|
|
return errors.New("initial_grams must be greater than 0")
|
||
|
|
}
|
||
|
|
if req.RemainingGrams != nil && *req.RemainingGrams < 0 {
|
||
|
|
return errors.New("remaining_grams must be >= 0")
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|