123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- package main
- import (
- "errors"
- "fmt"
- "github.com/gogf/gf/util/guid"
- "sparrow/pkg/models"
- "sparrow/pkg/server"
- )
- // SaveProduct 如果product.ID为空则会添加,否则更新相应产品信息
- func (r *Registry) SaveProduct(product *models.Product, reply *models.Product) error {
- db, err := getDB()
- product.RecordId = guid.S()
- if err != nil {
- return err
- }
- if product.ID == 0 {
- // create product
- err = db.Save(product).Error
- if err != nil {
- return err
- }
- key, err := r.keygen.GenRandomKey(product.RecordId)
- if err != nil {
- return err
- }
- product.ProductKey = key
- }
- err = db.Save(product).Error
- if err != nil {
- return err
- }
- cache := getCache()
- cacheKey := fmt.Sprintf("Product:%v", product.ID)
- if _, ok := cache.Get(cacheKey); ok {
- cache.Delete(cacheKey)
- }
- setProduct(reply, product)
- return nil
- }
- // DelProduct 删除一个产品
- func (r *Registry) DelProduct(product *models.Product, reply *models.Product) error {
- // clear cache
- cache := getCache()
- key := fmt.Sprintf("Product:%v", product.ID)
- if _, ok := cache.Get(key); ok {
- cache.Delete(key)
- }
- // clear db
- db, err := getDB()
- if err != nil {
- return err
- }
- err = db.Delete(product).Error
- if err != nil {
- server.Log.Errorf("delete product error: %s", err.Error())
- return errDbActFailt
- }
- return nil
- }
- // FindProduct will find product by specified ID
- func (r *Registry) FindProduct(id string, reply *models.Product) error {
- db, err := getDB()
- if err != nil {
- return err
- }
- cache := getCache()
- cacheKey := fmt.Sprintf("Product:%v", id)
- if cacheValue, ok := cache.Get(cacheKey); ok {
- product := cacheValue.(*models.Product)
- setProduct(reply, product)
- } else {
- err = db.First(reply, "record_id = ?", id).Error
- if err != nil {
- return err
- }
- var storage models.Product
- storage = *reply
- cache.Set(cacheKey, &storage)
- }
- return nil
- }
- // ValidateProduct try to validate the given product key.
- // if success, it will reply the corresponding product
- func (r *Registry) ValidateProduct(key string, reply *models.Product) error {
- db, err := getDB()
- if err != nil {
- return err
- }
- id, err := r.keygen.DecodeIDFromRandomKey(key)
- if err != nil {
- return err
- }
- cache := getCache()
- cacheKey := fmt.Sprintf("Product:%v", id)
- if cacheValue, ok := cache.Get(cacheKey); ok {
- product := cacheValue.(*models.Product)
- setProduct(reply, product)
- } else {
- err = db.First(reply, "record_id = ?", id).Error
- if err != nil {
- return err
- }
- var storage models.Product
- storage = *reply
- cache.Set(cacheKey, &storage)
- }
- if reply.ProductKey != key {
- return errors.New("product key not match.")
- }
- return nil
- }
|