package entities import ( "encoding/json" "fmt" "time" "autostore/internal/domain/value_objects" ) type itemEntityJSON struct { ID string `json:"id"` Name string `json:"name"` ExpirationDate time.Time `json:"expirationDate"` OrderURL string `json:"orderUrl"` UserID string `json:"userId"` CreatedAt time.Time `json:"createdAt"` } type ItemEntity struct { id value_objects.ItemID name string expirationDate value_objects.ExpirationDate orderURL string userID value_objects.UserID createdAt time.Time } func NewItem(id value_objects.ItemID, name string, expirationDate value_objects.ExpirationDate, orderURL string, userID value_objects.UserID) (*ItemEntity, error) { if name == "" { return nil, ErrInvalidItemName } if orderURL == "" { return nil, ErrInvalidOrderURL } return &ItemEntity{ id: id, name: name, expirationDate: expirationDate, orderURL: orderURL, userID: userID, createdAt: time.Now(), }, nil } func (i *ItemEntity) GetID() value_objects.ItemID { return i.id } func (i *ItemEntity) GetName() string { return i.name } func (i *ItemEntity) GetExpirationDate() value_objects.ExpirationDate { return i.expirationDate } func (i *ItemEntity) ExpirationDate() time.Time { return i.expirationDate.Time() } func (i *ItemEntity) GetOrderURL() string { return i.orderURL } func (i *ItemEntity) GetUserID() value_objects.UserID { return i.userID } func (i *ItemEntity) GetCreatedAt() time.Time { return i.createdAt } // MarshalJSON implements json.Marshaler interface func (i *ItemEntity) MarshalJSON() ([]byte, error) { return json.Marshal(&itemEntityJSON{ ID: i.id.String(), Name: i.name, ExpirationDate: i.expirationDate.Time(), OrderURL: i.orderURL, UserID: i.userID.String(), CreatedAt: i.createdAt, }) } // UnmarshalJSON implements json.Unmarshaler interface func (i *ItemEntity) UnmarshalJSON(data []byte) error { var aux itemEntityJSON if err := json.Unmarshal(data, &aux); err != nil { return err } id, err := value_objects.NewItemIDFromString(aux.ID) if err != nil { return fmt.Errorf("invalid item ID: %w", err) } userID, err := value_objects.NewUserIDFromString(aux.UserID) if err != nil { return fmt.Errorf("invalid user ID: %w", err) } expirationDate, err := value_objects.NewExpirationDate(aux.ExpirationDate) if err != nil { return fmt.Errorf("invalid expiration date: %w", err) } i.id = id i.name = aux.Name i.expirationDate = expirationDate i.orderURL = aux.OrderURL i.userID = userID i.createdAt = aux.CreatedAt return nil }