You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
4.0 KiB
157 lines
4.0 KiB
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 |
|
}
|
|
|