func()

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
}