first commit
This commit is contained in:
		
							
								
								
									
										123
									
								
								entity/product.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								entity/product.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,123 @@
 | 
			
		||||
package entity
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//Product defines a structure for an item in product catalog
 | 
			
		||||
type Product struct {
 | 
			
		||||
	ID          string  `json:"id"`
 | 
			
		||||
	Name        string  `json:"name"`
 | 
			
		||||
	Description string  `json:"description"`
 | 
			
		||||
	Price       float64 `json:"price"`
 | 
			
		||||
	IsAvailable bool    `json:"isAvailable"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ErrNoProduct is used if no product found
 | 
			
		||||
var ErrNoProduct = errors.New("no product found")
 | 
			
		||||
 | 
			
		||||
// GetProducts returns the JSON file content if available else returns an error.
 | 
			
		||||
func GetProducts() ([]byte, error) {
 | 
			
		||||
	// Read JSON file
 | 
			
		||||
	data, err := ioutil.ReadFile("./data/data.json")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return data, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetProduct takes id as input and returns the corresponding product, else it returns ErrNoProduct error.
 | 
			
		||||
func GetProduct(id string) (Product, error) {
 | 
			
		||||
	// Read JSON file
 | 
			
		||||
	data, err := ioutil.ReadFile("./data/data.json")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return Product{}, err
 | 
			
		||||
	}
 | 
			
		||||
	// read products
 | 
			
		||||
	var products []Product
 | 
			
		||||
	err = json.Unmarshal(data, &products)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return Product{}, err
 | 
			
		||||
	}
 | 
			
		||||
	// iterate through product array
 | 
			
		||||
	for i := 0; i < len(products); i++ {
 | 
			
		||||
		// if we find one product with the given ID
 | 
			
		||||
		if products[i].ID == id {
 | 
			
		||||
			// return product
 | 
			
		||||
			return products[i], nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return Product{}, ErrNoProduct
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteProduct takes id as input and deletes the corresponding product, else it returns ErrNoProduct error.
 | 
			
		||||
func DeleteProduct(id string) error {
 | 
			
		||||
	// Read JSON file
 | 
			
		||||
	data, err := ioutil.ReadFile("./data/data.json")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// read products
 | 
			
		||||
	var products []Product
 | 
			
		||||
	err = json.Unmarshal(data, &products)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// iterate through product array
 | 
			
		||||
	for i := 0; i < len(products); i++ {
 | 
			
		||||
		// if we find one product with the given ID
 | 
			
		||||
		if products[i].ID == id {
 | 
			
		||||
			products = removeElement(products, i)
 | 
			
		||||
			// Write Updated JSON file
 | 
			
		||||
			updatedData, err := json.Marshal(products)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			err = ioutil.WriteFile("./data/data.json", updatedData, os.ModePerm)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return ErrNoProduct
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddProduct adds an input product to the product list in JSON document.
 | 
			
		||||
func AddProduct(product Product) error {
 | 
			
		||||
	// Load existing products and append the data to product list
 | 
			
		||||
	var products []Product
 | 
			
		||||
	data, err := ioutil.ReadFile("./data/data.json")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// Load our JSON file to memory using array of products
 | 
			
		||||
	err = json.Unmarshal(data, &products)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// Add new Product to our list
 | 
			
		||||
	products = append(products, product)
 | 
			
		||||
 | 
			
		||||
	// Write Updated JSON file
 | 
			
		||||
	updatedData, err := json.Marshal(products)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	err = ioutil.WriteFile("./data/data.json", updatedData, os.ModePerm)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// removeElement is used to remove element from product array at given index
 | 
			
		||||
func removeElement(arr []Product, index int) []Product {
 | 
			
		||||
	ret := make([]Product, 0)
 | 
			
		||||
	ret = append(ret, arr[:index]...)
 | 
			
		||||
	return append(ret, arr[index+1:]...)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user