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.
119 lines
2.8 KiB
119 lines
2.8 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
"go-common/app/admin/main/member/model" |
|
"net/url" |
|
"strconv" |
|
"sync" |
|
|
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"go-common/library/net/metadata" |
|
"go-common/library/xstr" |
|
) |
|
|
|
const ( |
|
_updateUname = "/intranet/acc/updateUname" |
|
_queryByMids = "/intranet/acc/queryByMids" |
|
) |
|
|
|
// UpdateUname is. |
|
func (d *Dao) UpdateUname(ctx context.Context, mid int64, name string) error { |
|
ip := metadata.String(ctx, metadata.RemoteIP) |
|
params := url.Values{} |
|
params.Set("mid", strconv.FormatInt(mid, 10)) |
|
params.Set("uname", name) |
|
|
|
var res struct { |
|
Code int `json:"code"` |
|
} |
|
|
|
if err := d.passportClient.Post(ctx, d.upUnameURL, ip, params, &res); err != nil { |
|
return err |
|
} |
|
|
|
if res.Code != 0 { |
|
log.Error("Failed to update uname(%+v) code(%+v)", params, res.Code) |
|
return parsePassportEcode(res.Code) |
|
} |
|
return nil |
|
} |
|
|
|
func parsePassportEcode(pecode int) error { |
|
switch pecode { |
|
case -618: |
|
return ecode.UpdateUnameRepeated |
|
case -617: |
|
return ecode.UpdateUnameHadLocked |
|
case -601: |
|
return ecode.UpdateUnameFormat |
|
} |
|
log.Error("Unrecognized passport ecode: %d", pecode) |
|
return ecode.Int(pecode) |
|
} |
|
|
|
// PassportQueryByMids is. |
|
func (d *Dao) PassportQueryByMids(ctx context.Context, mids []int64) (map[int64]*model.PassportQueryByMidResult, error) { |
|
ip := metadata.String(ctx, metadata.RemoteIP) |
|
params := url.Values{} |
|
params.Set("mids", xstr.JoinInts(mids)) |
|
var res struct { |
|
Code int `json:"code"` |
|
Cards map[string]*model.PassportQueryByMidResult `json:"cards"` |
|
} |
|
|
|
if err := d.passportClient.Get(ctx, d.queryByMidsURL, ip, params, &res); err != nil { |
|
return nil, err |
|
} |
|
|
|
if res.Code != 0 { |
|
log.Error("Failed to QueryByMid(%+v) code(%+v)", params, res.Code) |
|
return nil, ecode.Int(res.Code) |
|
} |
|
|
|
result := make(map[int64]*model.PassportQueryByMidResult, len(res.Cards)) |
|
for _, card := range res.Cards { |
|
result[card.Mid] = card |
|
} |
|
|
|
return result, nil |
|
} |
|
|
|
// PassportQueryByMidsChunked is |
|
func (d *Dao) PassportQueryByMidsChunked(ctx context.Context, mids []int64, chunkSize int) (map[int64]*model.PassportQueryByMidResult, error) { |
|
chunkedMids := func() [][]int64 { |
|
divided := make([][]int64, 0) |
|
for i := 0; i < len(mids); i += chunkSize { |
|
end := i + chunkSize |
|
if end > len(mids) { |
|
end = len(mids) |
|
} |
|
divided = append(divided, mids[i:end]) |
|
} |
|
return divided |
|
}() |
|
|
|
lock := sync.Mutex{} |
|
result := make(map[int64]*model.PassportQueryByMidResult, len(mids)) |
|
wg := sync.WaitGroup{} |
|
for _, chunk := range chunkedMids { |
|
wg.Add(1) |
|
go func(chunk []int64) { |
|
defer wg.Done() |
|
res, err := d.PassportQueryByMids(ctx, chunk) |
|
if err != nil { |
|
log.Error("Failed to get passport query by mids: %+v: %+v", chunk, err) |
|
return |
|
} |
|
lock.Lock() |
|
for k, v := range res { |
|
result[k] = v |
|
} |
|
lock.Unlock() |
|
}(chunk) |
|
} |
|
wg.Wait() |
|
|
|
return result, nil |
|
}
|
|
|