// Package dtos defines request/response data transfer objects for the Extrudex API. // DTOs keep HTTP serialization concerns separate from domain models. package dtos // ============================================================================ // Common Response Wrappers // ============================================================================ // ListResponse wraps a paginated collection response. type ListResponse struct { Data any `json:"data"` Total int `json:"total"` Limit int `json:"limit"` Offset int `json:"offset"` } // SingleResponse wraps a single-item response. type SingleResponse struct { Data any `json:"data"` } // ErrorResponse is the standard error payload for all API errors. type ErrorResponse struct { Error string `json:"error"` Code int `json:"code"` } // ============================================================================ // Filament DTOs // ============================================================================ // CreateFilamentRequest is the POST body for creating a new filament spool. type CreateFilamentRequest struct { Name string `json:"name"` MaterialBaseID int `json:"material_base_id"` MaterialFinishID int `json:"material_finish_id"` MaterialModifierID *int `json:"material_modifier_id,omitempty"` ColorHex string `json:"color_hex"` Brand *string `json:"brand,omitempty"` DiameterMM *float64 `json:"diameter_mm,omitempty"` // defaults to 1.75 InitialGrams int `json:"initial_grams"` RemainingGrams int `json:"remaining_grams"` SpoolWeightGrams *int `json:"spool_weight_grams,omitempty"` CostUSD *float64 `json:"cost_usd,omitempty"` LowStockThresholdGrams *int `json:"low_stock_threshold_grams,omitempty"` // defaults to 50 Notes *string `json:"notes,omitempty"` Barcode *string `json:"barcode,omitempty"` } // UpdateFilamentRequest is the PUT body for partially updating a filament spool. // All fields are optional — only non-nil fields are applied. type UpdateFilamentRequest struct { Name *string `json:"name,omitempty"` MaterialBaseID *int `json:"material_base_id,omitempty"` MaterialFinishID *int `json:"material_finish_id,omitempty"` MaterialModifierID *int `json:"material_modifier_id,omitempty"` ColorHex *string `json:"color_hex,omitempty"` Brand *string `json:"brand,omitempty"` DiameterMM *float64 `json:"diameter_mm,omitempty"` InitialGrams *int `json:"initial_grams,omitempty"` RemainingGrams *int `json:"remaining_grams,omitempty"` SpoolWeightGrams *int `json:"spool_weight_grams,omitempty"` CostUSD *float64 `json:"cost_usd,omitempty"` LowStockThresholdGrams *int `json:"low_stock_threshold_grams,omitempty"` Notes *string `json:"notes,omitempty"` Barcode *string `json:"barcode,omitempty"` }