product.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "sparrow/pkg/models"
  6. "sparrow/pkg/rpcs"
  7. "sparrow/pkg/server"
  8. )
  9. // SaveProduct 如果product.ID为空则会添加,否则更新相应产品信息
  10. func (r *Registry) SaveProduct(product *models.Product, reply *models.Product) error {
  11. db, err := getDB()
  12. if err != nil {
  13. return err
  14. }
  15. if product.ID == 0 {
  16. // create product
  17. err = db.Save(product).Error
  18. if err != nil {
  19. return err
  20. }
  21. key, err := r.keygen.GenRandomKey(product.ID)
  22. if err != nil {
  23. return err
  24. }
  25. product.ProductKey = key
  26. }
  27. err = db.Save(product).Error
  28. if err != nil {
  29. return err
  30. }
  31. cache := getCache()
  32. cacheKey := fmt.Sprintf("Product:%v", product.ID)
  33. if _, ok := cache.Get(cacheKey); ok {
  34. cache.Delete(cacheKey)
  35. }
  36. setProduct(reply, product)
  37. return nil
  38. }
  39. // DelProduct 删除一个产品
  40. func (r *Registry) DelProduct(product *models.Product, reply *models.Product) error {
  41. // clear cache
  42. cache := getCache()
  43. key := fmt.Sprintf("Product:%v", product.ID)
  44. if _, ok := cache.Get(key); ok {
  45. cache.Delete(key)
  46. }
  47. // clear db
  48. db, err := getDB()
  49. if err != nil {
  50. return err
  51. }
  52. err = db.Delete(product).Error
  53. if err != nil {
  54. server.Log.Errorf("delete product error: %s", err.Error())
  55. return errDbActFailt
  56. }
  57. return nil
  58. }
  59. // GetProducts 获取当前用户的产品
  60. func (r *Registry) GetProducts(args *rpcs.ArgsProductList, reply map[string]interface{}) error {
  61. db, err := getDB()
  62. if err != nil {
  63. return err
  64. }
  65. tx := db.Where("1=1")
  66. if args.ProductName != "" {
  67. tx = tx.Where("product_name like ?", "%"+args.ProductName+"%")
  68. }
  69. var datas []models.Product
  70. var total int
  71. err = tx.Limit(args.Ps).Offset((args.Pi - 1) * args.Ps).Find(&datas).Error
  72. tx.Model(&models.Product{}).Count(&total)
  73. if err != nil {
  74. return err
  75. }
  76. reply = map[string]interface{}{
  77. "list": datas,
  78. "total": total,
  79. }
  80. return nil
  81. }
  82. // FindProduct will find product by specified ID
  83. func (r *Registry) FindProduct(id int32, reply *models.Product) error {
  84. db, err := getDB()
  85. if err != nil {
  86. return err
  87. }
  88. cache := getCache()
  89. cacheKey := fmt.Sprintf("Product:%v", id)
  90. if cacheValue, ok := cache.Get(cacheKey); ok {
  91. product := cacheValue.(*models.Product)
  92. setProduct(reply, product)
  93. } else {
  94. err = db.First(reply, id).Error
  95. if err != nil {
  96. return err
  97. }
  98. var storage models.Product
  99. storage = *reply
  100. cache.Set(cacheKey, &storage)
  101. }
  102. return nil
  103. }
  104. // ValidProduct try to validate the given product key.
  105. // if success, it will reply the corresponding product
  106. func (r *Registry) ValidateProduct(key string, reply *models.Product) error {
  107. db, err := getDB()
  108. if err != nil {
  109. return err
  110. }
  111. id, err := r.keygen.DecodeIdFromRandomKey(key)
  112. if err != nil {
  113. return err
  114. }
  115. cache := getCache()
  116. cacheKey := fmt.Sprintf("Product:%v", id)
  117. if cacheValue, ok := cache.Get(cacheKey); ok {
  118. product := cacheValue.(*models.Product)
  119. setProduct(reply, product)
  120. } else {
  121. err = db.First(reply, id).Error
  122. if err != nil {
  123. return err
  124. }
  125. var storage models.Product
  126. storage = *reply
  127. cache.Set(cacheKey, &storage)
  128. }
  129. if reply.ProductKey != key {
  130. return errors.New("product key not match.")
  131. }
  132. return nil
  133. }