package repository_product import ( "context" "online-order/ent" "online-order/ent/product" "online-order/entity" ) type ProductClient struct { client *ent.Client activeBusiness *entity.ActiveBusiness } func NewProductClient(client *ent.Client, activeBusiness *entity.ActiveBusiness) *ProductClient { return &ProductClient{ client: client, activeBusiness: activeBusiness, } } // List all products func (c *ProductClient) List() ([]*entity.ProductDisplay, error) { var u []*entity.ProductDisplay ctx := context.Background() err := c.client.Product. Query(). Where(product.BusinessID(c.activeBusiness.BusinessID)). Select(product.FieldID, product.FieldName, product.FieldDescription, product.FieldOriginalPrice, product.FieldPrice, product.FieldQuantity, product.FieldStatus, product.FieldCreatedAt, product.FieldUpdatedAt). Scan(ctx, &u) if err != nil { return nil, err } return u, nil } // Create a product func (c *ProductClient) Create(p *entity.ProductCreateUpdate) error { ctx := context.Background() resp, err := c.client.Product. Create(). SetName(p.Name). SetBusinessID(c.activeBusiness.BusinessID). SetNillableDescription(p.Description). SetPrice(p.Price). SetOriginalPrice(p.OriginalPrice). SetNillableSummary(p.Summary). SetQuantity(p.Quantity). SetProductCategoryID(p.ProductCategoryID). SetUserID(p.UserID). SetStatus(p.Status). Save(ctx) if err != nil { return err } p.ID = resp.ID p.CreatedAt = resp.CreatedAt p.UpdatedAt = resp.UpdatedAt return nil } func (c *ProductClient) GetByID(id int) (*entity.ProductDisplay, error) { var p entity.ProductDisplay ctx := context.Background() resp := c.client.Product. Query(). Where(product.BusinessID(c.activeBusiness.BusinessID)). Where(product.ID(id)). AllX(ctx) if len(resp) > 0 { p.ID = resp[0].ID p.Name = resp[0].Name p.Description = resp[0].Description p.Status = resp[0].Status p.Quantity = resp[0].Quantity p.Price = resp[0].Price p.OriginalPrice = resp[0].OriginalPrice p.CreatedAt = resp[0].CreatedAt p.UpdatedAt = resp[0].UpdatedAt } else { return nil, entity.ErrNotFound } return &p, nil } // Update product information, except password func (c *ProductClient) Update(p *entity.ProductCreateUpdate) error { ctx := context.Background() _, err := c.client.Product.UpdateOneID(p.ID). SetName(p.Name). SetDescription(p.Name). SetPrice(p.Price). SetOriginalPrice(p.OriginalPrice). SetQuantity(p.Quantity). SetStatus(p.Status). Save(ctx) if err != nil { return err } return nil } // Update user information, except password func (c *ProductClient) Delete(id int) error { ctx := context.Background() err := c.client.Product. DeleteOneID(id). Exec(ctx) return err } // Search a user information by email or username func (c *ProductClient) SearchProduct(identifier string) (*entity.ProductDisplay, error) { var p entity.ProductDisplay ctx := context.Background() resp := c.client.Product. Query(). Where(product.BusinessID(c.activeBusiness.BusinessID)). Where( product.NameContains(identifier), ). AllX(ctx) if len(resp) > 0 { p.ID = resp[0].ID p.Name = resp[0].Name p.Description = resp[0].Description p.Status = resp[0].Status p.Quantity = resp[0].Quantity p.Price = resp[0].Price p.OriginalPrice = resp[0].OriginalPrice p.CreatedAt = resp[0].CreatedAt p.UpdatedAt = resp[0].UpdatedAt } else { return nil, entity.ErrNotFound } return &p, nil }