setting.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "strconv"
  6. "strings"
  7. "go-common/app/interface/main/space/model"
  8. "go-common/library/ecode"
  9. "go-common/library/log"
  10. "go-common/library/sync/errgroup"
  11. )
  12. const _defaultPrivacy = 1
  13. // SettingInfo get setting info.
  14. func (s *Service) SettingInfo(c context.Context, mid int64) (data *model.Setting, err error) {
  15. data = new(model.Setting)
  16. group, errCtx := errgroup.WithContext(c)
  17. group.Go(func() error {
  18. data.Privacy = s.privacy(errCtx, mid)
  19. return nil
  20. })
  21. group.Go(func() error {
  22. data.IndexOrder = s.indexOrder(errCtx, mid)
  23. return nil
  24. })
  25. group.Wait()
  26. return
  27. }
  28. // PrivacyModify privacy modify.
  29. func (s *Service) PrivacyModify(c context.Context, mid int64, field string, value int) (err error) {
  30. privacy := s.privacy(c, mid)
  31. for k, v := range privacy {
  32. if field == k && value == v {
  33. err = ecode.NotModified
  34. return
  35. }
  36. }
  37. if err = s.dao.PrivacyModify(c, mid, field, value); err == nil {
  38. s.dao.DelPrivacyCache(c, mid)
  39. }
  40. return
  41. }
  42. // PrivacyBatchModify privacy batch modify.
  43. func (s *Service) PrivacyBatchModify(c context.Context, mid int64, data map[string]int) (err error) {
  44. group, errCtx := errgroup.WithContext(c)
  45. for k, v := range data {
  46. field := k
  47. value := v
  48. group.Go(func() error {
  49. if e := s.PrivacyModify(errCtx, mid, field, value); e != nil {
  50. log.Warn("PrivacyBatchModify mid(%d) filed(%s) value(%d) error(%v)", mid, field, value, e)
  51. }
  52. return nil
  53. })
  54. }
  55. group.Wait()
  56. return
  57. }
  58. // IndexOrderModify index order modify
  59. func (s *Service) IndexOrderModify(c context.Context, mid int64, orderNum []string) (err error) {
  60. var orderStr []byte
  61. if orderStr, err = json.Marshal(orderNum); err != nil {
  62. log.Error("index order modify json.Marshal(%v) error(%v)", orderNum, err)
  63. err = ecode.RequestErr
  64. return
  65. }
  66. if err = s.dao.IndexOrderModify(c, mid, string(orderStr)); err == nil {
  67. s.cache.Do(c, func(c context.Context) {
  68. var cacheData []*model.IndexOrder
  69. for _, v := range orderNum {
  70. i, _ := strconv.Atoi(v)
  71. cacheData = append(cacheData, &model.IndexOrder{ID: i, Name: model.IndexOrderMap[i]})
  72. }
  73. s.dao.SetIndexOrderCache(c, mid, cacheData)
  74. })
  75. }
  76. return
  77. }
  78. func (s *Service) privacy(c context.Context, mid int64) (data map[string]int) {
  79. var (
  80. privacy map[string]int
  81. err error
  82. addCache = true
  83. )
  84. if data, err = s.dao.PrivacyCache(c, mid); err != nil {
  85. addCache = false
  86. } else if data != nil {
  87. return
  88. }
  89. if privacy, err = s.dao.Privacy(c, mid); err != nil || len(privacy) == 0 {
  90. data = model.DefaultPrivacy
  91. } else {
  92. data = fmtPrivacy(privacy)
  93. }
  94. if addCache {
  95. s.cache.Do(c, func(c context.Context) {
  96. s.dao.SetPrivacyCache(c, mid, data)
  97. })
  98. }
  99. return
  100. }
  101. func (s *Service) indexOrder(c context.Context, mid int64) (data []*model.IndexOrder) {
  102. var (
  103. indexOrderStr string
  104. err error
  105. addCache = true
  106. )
  107. if data, err = s.dao.IndexOrderCache(c, mid); err != nil {
  108. addCache = false
  109. } else if len(data) != 0 {
  110. return
  111. }
  112. if indexOrderStr, err = s.dao.IndexOrder(c, mid); err != nil || indexOrderStr == "" {
  113. data = model.DefaultIndexOrder
  114. } else {
  115. orderNum := make([]string, 0)
  116. if err = json.Unmarshal([]byte(indexOrderStr), &orderNum); err != nil {
  117. log.Error("indexOrder mid(%d) json.Unmarshal(%s) error(%v)", mid, indexOrderStr, err)
  118. addCache = false
  119. s.cache.Do(c, func(c context.Context) {
  120. s.fixIndexOrder(c, mid, indexOrderStr)
  121. })
  122. data = model.DefaultIndexOrder
  123. } else {
  124. extraOrder := make(map[int]string)
  125. for _, v := range orderNum {
  126. if index, err := strconv.Atoi(v); err != nil {
  127. continue
  128. } else if name, ok := model.IndexOrderMap[index]; ok {
  129. data = append(data, &model.IndexOrder{ID: index, Name: name})
  130. extraOrder[index] = name
  131. }
  132. }
  133. for i, v := range model.IndexOrderMap {
  134. if _, ok := extraOrder[i]; !ok {
  135. data = append(data, &model.IndexOrder{ID: i, Name: v})
  136. }
  137. }
  138. }
  139. }
  140. if addCache {
  141. s.cache.Do(c, func(c context.Context) {
  142. s.dao.SetIndexOrderCache(c, mid, data)
  143. })
  144. }
  145. return
  146. }
  147. func fmtPrivacy(privacy map[string]int) (data map[string]int) {
  148. data = make(map[string]int, len(model.PrivacyFields))
  149. for _, v := range model.PrivacyFields {
  150. if value, ok := privacy[v]; ok {
  151. data[v] = value
  152. } else {
  153. data[v] = _defaultPrivacy
  154. }
  155. }
  156. return
  157. }
  158. func (s *Service) fixIndexOrder(c context.Context, mid int64, indexOrderStr string) {
  159. fixStr := strings.Replace(strings.TrimRight(strings.TrimLeft(indexOrderStr, "["), "]"), "\"", "", -1)
  160. fixArr := strings.Split(fixStr, ",")
  161. fixByte, err := json.Marshal(fixArr)
  162. if err != nil {
  163. log.Error("fixIndexOrder mid(%d) indexOrder(%s) error(%v)", mid, indexOrderStr, err)
  164. return
  165. }
  166. if err := s.dao.IndexOrderModify(c, mid, string(fixByte)); err == nil {
  167. s.dao.DelIndexOrderCache(c, mid)
  168. }
  169. }