123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- package dao
- import (
- "context"
- "encoding/json"
- "net/url"
- "strconv"
- "time"
- "go-common/app/service/main/member/model"
- "go-common/library/cache/memcache"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/net/metadata"
- "github.com/pkg/errors"
- )
- const (
- _moralLogID = 12
- )
- // Moral get user moral from cache,if miss get from db.
- func (d *Dao) Moral(c context.Context, mid int64) (moral *model.Moral, err error) {
- if moral, err = d.moralCache(c, mid); err == nil {
- return
- }
- if err != nil && err != memcache.ErrNotFound {
- log.Error("Failed to get moral from cache, mid: %d, error:%v", mid, err)
- return
- }
- if moral, err = d.MoralDB(c, mid); err != nil {
- return
- }
- if moral == nil {
- moral = &model.Moral{Mid: mid, Moral: model.DefaultMoral}
- }
- d.SetMoralCache(c, mid, moral)
- return
- }
- // MoralLog is
- func (d *Dao) MoralLog(ctx context.Context, mid int64) ([]*model.UserLog, error) {
- ip := metadata.String(ctx, metadata.RemoteIP)
- t := time.Now().Add(-time.Hour * 24 * 7)
- params := url.Values{}
- params.Set("mid", strconv.FormatInt(mid, 10))
- params.Set("appid", "log_user_action")
- params.Set("business", strconv.FormatInt(_moralLogID, 10))
- params.Set("pn", "1")
- params.Set("ps", "1000")
- params.Set("ctime_from", t.Format("2006-01-02 00:00:00"))
- params.Set("sort", "desc")
- params.Set("order", "ctime")
- res := &model.SearchResult{}
- if err := d.client.Get(ctx, d.c.Host.Search+_searchLogURI, ip, params, res); err != nil {
- return nil, err
- }
- if res.Code != 0 {
- return nil, ecode.Int(res.Code)
- }
- logs := asMoralLog(res)
- return logs, nil
- }
- // MoralLogByID get distinct log by log id
- func (d *Dao) MoralLogByID(ctx context.Context, logID string) (*model.UserLog, error) {
- ip := metadata.String(ctx, metadata.RemoteIP)
- params := url.Values{}
- params.Set("str_0", logID)
- params.Set("appid", "log_user_action")
- params.Set("business", strconv.FormatInt(_moralLogID, 10))
- params.Set("pn", "1")
- params.Set("ps", "1")
- params.Set("sort", "desc")
- params.Set("order", "ctime")
- res := &model.SearchResult{}
- if err := d.client.Get(ctx, d.c.Host.Search+_searchLogURI, ip, params, res); err != nil {
- return nil, err
- }
- if res.Code != 0 {
- return nil, ecode.Int(res.Code)
- }
- logs := asMoralLog(res)
- if len(logs) == 0 {
- return nil, ecode.NothingFound
- }
- return logs[0], nil
- }
- // DeleteMoralLog is
- func (d *Dao) DeleteMoralLog(ctx context.Context, logID string) error {
- ip := metadata.String(ctx, metadata.RemoteIP)
- return d.deleteLogReport(ctx, _moralLogID, logID, ip)
- }
- // DeleteLogReport is
- func (d *Dao) deleteLogReport(ctx context.Context, business int, logID string, ip string) error {
- if logID == "" {
- return errors.New("Failed to delete log with empty logID")
- }
- params := url.Values{}
- params.Set("str_0", logID)
- params.Set("appid", "log_user_action")
- params.Set("business", strconv.FormatInt(int64(business), 10))
- res := &model.SearchResult{}
- if err := d.client.Post(ctx, d.c.Host.Search+_deleteLogURI, ip, params, res); err != nil {
- return err
- }
- if res.Code != 0 {
- return ecode.Int(res.Code)
- }
- return nil
- }
- func asMoralLog(res *model.SearchResult) []*model.UserLog {
- logs := make([]*model.UserLog, 0, len(res.Data.Result))
- for _, r := range res.Data.Result {
- ts, err := time.ParseInLocation("2006-01-02 15:04:05", r.Ctime, time.Local)
- if err != nil {
- log.Warn("Failed to parse log ctime: ctime: %s: %+v", r.Ctime, err)
- continue
- }
- content := map[string]string{
- "from_moral": "",
- "log_id": "",
- "mid": "",
- "operater": "",
- "origin": "",
- "reason": "",
- "remark": "",
- "status": "",
- "to_moral": "",
- }
- if err := json.Unmarshal([]byte(r.ExtraData), &content); err != nil {
- log.Warn("Failed to parse extra data in moral log: mid: %d, extra_data: %s: %+v", r.Mid, r.ExtraData, err)
- continue
- }
- if content["mid"] == "" {
- content["mid"] = strconv.FormatInt(r.Mid, 10)
- }
- l := &model.UserLog{
- Mid: r.Mid,
- IP: r.IP,
- TS: ts.Unix(),
- LogID: content["log_id"],
- Content: content,
- }
- logs = append(logs, l)
- }
- return logs
- }
|