123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- package service
- import (
- "context"
- "encoding/json"
- "strconv"
- "strings"
- "go-common/app/interface/main/space/model"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/sync/errgroup"
- )
- const _defaultPrivacy = 1
- // SettingInfo get setting info.
- func (s *Service) SettingInfo(c context.Context, mid int64) (data *model.Setting, err error) {
- data = new(model.Setting)
- group, errCtx := errgroup.WithContext(c)
- group.Go(func() error {
- data.Privacy = s.privacy(errCtx, mid)
- return nil
- })
- group.Go(func() error {
- data.IndexOrder = s.indexOrder(errCtx, mid)
- return nil
- })
- group.Wait()
- return
- }
- // PrivacyModify privacy modify.
- func (s *Service) PrivacyModify(c context.Context, mid int64, field string, value int) (err error) {
- privacy := s.privacy(c, mid)
- for k, v := range privacy {
- if field == k && value == v {
- err = ecode.NotModified
- return
- }
- }
- if err = s.dao.PrivacyModify(c, mid, field, value); err == nil {
- s.dao.DelPrivacyCache(c, mid)
- }
- return
- }
- // PrivacyBatchModify privacy batch modify.
- func (s *Service) PrivacyBatchModify(c context.Context, mid int64, data map[string]int) (err error) {
- group, errCtx := errgroup.WithContext(c)
- for k, v := range data {
- field := k
- value := v
- group.Go(func() error {
- if e := s.PrivacyModify(errCtx, mid, field, value); e != nil {
- log.Warn("PrivacyBatchModify mid(%d) filed(%s) value(%d) error(%v)", mid, field, value, e)
- }
- return nil
- })
- }
- group.Wait()
- return
- }
- // IndexOrderModify index order modify
- func (s *Service) IndexOrderModify(c context.Context, mid int64, orderNum []string) (err error) {
- var orderStr []byte
- if orderStr, err = json.Marshal(orderNum); err != nil {
- log.Error("index order modify json.Marshal(%v) error(%v)", orderNum, err)
- err = ecode.RequestErr
- return
- }
- if err = s.dao.IndexOrderModify(c, mid, string(orderStr)); err == nil {
- s.cache.Do(c, func(c context.Context) {
- var cacheData []*model.IndexOrder
- for _, v := range orderNum {
- i, _ := strconv.Atoi(v)
- cacheData = append(cacheData, &model.IndexOrder{ID: i, Name: model.IndexOrderMap[i]})
- }
- s.dao.SetIndexOrderCache(c, mid, cacheData)
- })
- }
- return
- }
- func (s *Service) privacy(c context.Context, mid int64) (data map[string]int) {
- var (
- privacy map[string]int
- err error
- addCache = true
- )
- if data, err = s.dao.PrivacyCache(c, mid); err != nil {
- addCache = false
- } else if data != nil {
- return
- }
- if privacy, err = s.dao.Privacy(c, mid); err != nil || len(privacy) == 0 {
- data = model.DefaultPrivacy
- } else {
- data = fmtPrivacy(privacy)
- }
- if addCache {
- s.cache.Do(c, func(c context.Context) {
- s.dao.SetPrivacyCache(c, mid, data)
- })
- }
- return
- }
- func (s *Service) indexOrder(c context.Context, mid int64) (data []*model.IndexOrder) {
- var (
- indexOrderStr string
- err error
- addCache = true
- )
- if data, err = s.dao.IndexOrderCache(c, mid); err != nil {
- addCache = false
- } else if len(data) != 0 {
- return
- }
- if indexOrderStr, err = s.dao.IndexOrder(c, mid); err != nil || indexOrderStr == "" {
- data = model.DefaultIndexOrder
- } else {
- orderNum := make([]string, 0)
- if err = json.Unmarshal([]byte(indexOrderStr), &orderNum); err != nil {
- log.Error("indexOrder mid(%d) json.Unmarshal(%s) error(%v)", mid, indexOrderStr, err)
- addCache = false
- s.cache.Do(c, func(c context.Context) {
- s.fixIndexOrder(c, mid, indexOrderStr)
- })
- data = model.DefaultIndexOrder
- } else {
- extraOrder := make(map[int]string)
- for _, v := range orderNum {
- if index, err := strconv.Atoi(v); err != nil {
- continue
- } else if name, ok := model.IndexOrderMap[index]; ok {
- data = append(data, &model.IndexOrder{ID: index, Name: name})
- extraOrder[index] = name
- }
- }
- for i, v := range model.IndexOrderMap {
- if _, ok := extraOrder[i]; !ok {
- data = append(data, &model.IndexOrder{ID: i, Name: v})
- }
- }
- }
- }
- if addCache {
- s.cache.Do(c, func(c context.Context) {
- s.dao.SetIndexOrderCache(c, mid, data)
- })
- }
- return
- }
- func fmtPrivacy(privacy map[string]int) (data map[string]int) {
- data = make(map[string]int, len(model.PrivacyFields))
- for _, v := range model.PrivacyFields {
- if value, ok := privacy[v]; ok {
- data[v] = value
- } else {
- data[v] = _defaultPrivacy
- }
- }
- return
- }
- func (s *Service) fixIndexOrder(c context.Context, mid int64, indexOrderStr string) {
- fixStr := strings.Replace(strings.TrimRight(strings.TrimLeft(indexOrderStr, "["), "]"), "\"", "", -1)
- fixArr := strings.Split(fixStr, ",")
- fixByte, err := json.Marshal(fixArr)
- if err != nil {
- log.Error("fixIndexOrder mid(%d) indexOrder(%s) error(%v)", mid, indexOrderStr, err)
- return
- }
- if err := s.dao.IndexOrderModify(c, mid, string(fixByte)); err == nil {
- s.dao.DelIndexOrderCache(c, mid)
- }
- }
|