product.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gogf/gf/util/guid"
  6. "sparrow/pkg/models"
  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. product.RecordId = guid.S()
  13. if err != nil {
  14. return err
  15. }
  16. if product.ID == 0 {
  17. // create product
  18. err = db.Save(product).Error
  19. if err != nil {
  20. return err
  21. }
  22. key, err := r.keygen.GenRandomKey(product.RecordId)
  23. if err != nil {
  24. return err
  25. }
  26. product.ProductKey = key
  27. }
  28. err = db.Save(product).Error
  29. if err != nil {
  30. return err
  31. }
  32. cache := getCache()
  33. cacheKey := fmt.Sprintf("Product:%v", product.ID)
  34. if _, ok := cache.Get(cacheKey); ok {
  35. cache.Delete(cacheKey)
  36. }
  37. setProduct(reply, product)
  38. return nil
  39. }
  40. // DelProduct 删除一个产品
  41. func (r *Registry) DelProduct(product *models.Product, reply *models.Product) error {
  42. // clear cache
  43. cache := getCache()
  44. key := fmt.Sprintf("Product:%v", product.ID)
  45. if _, ok := cache.Get(key); ok {
  46. cache.Delete(key)
  47. }
  48. // clear db
  49. db, err := getDB()
  50. if err != nil {
  51. return err
  52. }
  53. err = db.Delete(product).Error
  54. if err != nil {
  55. server.Log.Errorf("delete product error: %s", err.Error())
  56. return errDbActFailt
  57. }
  58. return nil
  59. }
  60. // FindProduct will find product by specified ID
  61. func (r *Registry) FindProduct(id string, reply *models.Product) error {
  62. db, err := getDB()
  63. if err != nil {
  64. return err
  65. }
  66. cache := getCache()
  67. cacheKey := fmt.Sprintf("Product:%v", id)
  68. if cacheValue, ok := cache.Get(cacheKey); ok {
  69. product := cacheValue.(*models.Product)
  70. setProduct(reply, product)
  71. } else {
  72. err = db.First(reply, "record_id = ?", id).Error
  73. if err != nil {
  74. return err
  75. }
  76. var storage models.Product
  77. storage = *reply
  78. cache.Set(cacheKey, &storage)
  79. }
  80. return nil
  81. }
  82. // ValidateProduct try to validate the given product key.
  83. // if success, it will reply the corresponding product
  84. func (r *Registry) ValidateProduct(key string, reply *models.Product) error {
  85. db, err := getDB()
  86. if err != nil {
  87. return err
  88. }
  89. id, err := r.keygen.DecodeIDFromRandomKey(key)
  90. if err != nil {
  91. return err
  92. }
  93. cache := getCache()
  94. cacheKey := fmt.Sprintf("Product:%v", id)
  95. if cacheValue, ok := cache.Get(cacheKey); ok {
  96. product := cacheValue.(*models.Product)
  97. setProduct(reply, product)
  98. } else {
  99. err = db.First(reply, "record_id = ?", id).Error
  100. if err != nil {
  101. return err
  102. }
  103. var storage models.Product
  104. storage = *reply
  105. cache.Set(cacheKey, &storage)
  106. }
  107. if reply.ProductKey != key {
  108. return errors.New("product key not match.")
  109. }
  110. return nil
  111. }