in internal/service/badge/badge_service.go [139:228]
func (b *BadgeService) ListPaged(ctx context.Context, req *schema.GetBadgeListPagedReq) (resp []*schema.GetBadgeListPagedResp, total int64, err error) {
var (
groups []*entity.BadgeGroup
badges []*entity.Badge
badge *entity.Badge
exists bool
groupMap = make(map[int64]string, 0)
)
total = 0
if len(req.Query) > 0 {
isID := strings.Index(req.Query, "badge:")
if isID != 0 {
badges, err = b.searchByName(ctx, req.Query)
if err != nil {
return
}
// paged result
count := len(badges)
total = int64(count)
start := (req.Page - 1) * req.PageSize
end := req.Page * req.PageSize
if start >= count {
start = count
end = count
}
if end > count {
end = count
}
badges = badges[start:end]
} else {
req.Query = strings.TrimSpace(strings.TrimLeft(req.Query, "badge:"))
id := uid.DeShortID(req.Query)
if len(id) == 0 {
return
}
badge, exists, err = b.badgeRepo.GetByID(ctx, id)
if err != nil || !exists {
return
}
badges = append(badges, badge)
}
} else {
switch req.Status {
case schema.BadgeStatusActive:
badges, total, err = b.badgeRepo.ListActivated(ctx, req.Page, req.PageSize)
case schema.BadgeStatusInactive:
badges, total, err = b.badgeRepo.ListInactivated(ctx, req.Page, req.PageSize)
default:
badges, total, err = b.badgeRepo.ListPaged(ctx, req.Page, req.PageSize)
}
if err != nil {
return
}
}
// find all group and build group map
groups, err = b.badgeGroupRepo.ListGroups(ctx)
if err != nil {
return
}
for _, group := range groups {
groupMap[converter.StringToInt64(group.ID)] = translator.Tr(handler.GetLangByCtx(ctx), group.Name)
}
resp = make([]*schema.GetBadgeListPagedResp, len(badges))
general, siteErr := b.siteInfoCommonService.GetSiteGeneral(ctx)
var baseURL = ""
if siteErr != nil {
baseURL = ""
} else {
baseURL = general.SiteUrl
}
for i, badge := range badges {
resp[i] = &schema.GetBadgeListPagedResp{
ID: uid.EnShortID(badge.ID),
Name: translator.Tr(handler.GetLangByCtx(ctx), badge.Name),
Description: translator.TrWithData(handler.GetLangByCtx(ctx), badge.Description, &schema.BadgeTplData{ProfileURL: baseURL + "/users/settings/profile"}),
Icon: badge.Icon,
AwardCount: badge.AwardCount,
Level: badge.Level,
GroupName: groupMap[badge.BadgeGroupID],
Status: schema.BadgeStatusMap[badge.Status],
}
}
return
}