This is an automated email from the ASF dual-hosted git repository. robin0716 pushed a commit to branch develop/robin in repository https://gitbox.apache.org/repos/asf/incubator-answer.git
commit a24d9061250831215dea3ed0e3a1c6dd40271bbc Author: kumfo <ku...@sifou.com> AuthorDate: Tue Aug 13 17:50:10 2024 +0800 feat(badge): badge manage add badge search --- docs/docs.go | 25 +++-------- docs/swagger.json | 6 +++ docs/swagger.yaml | 4 ++ internal/controller_admin/badge_controller.go | 1 + internal/repo/badge/badge_repo.go | 9 +++- internal/schema/badge_schema.go | 2 + internal/service/badge/badge_service.go | 61 ++++++++++++++++++++++----- 7 files changed, 78 insertions(+), 30 deletions(-) diff --git a/docs/docs.go b/docs/docs.go index eaa7133a..7fef400f 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -1,22 +1,3 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - // Package docs Code generated by swaggo/swag. DO NOT EDIT package docs @@ -234,6 +215,12 @@ const docTemplate = `{ "description": "badge status", "name": "status", "in": "query" + }, + { + "type": "string", + "description": "search param", + "name": "q", + "in": "query" } ], "responses": { diff --git a/docs/swagger.json b/docs/swagger.json index 116a3a6a..234d2f13 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -204,6 +204,12 @@ "description": "badge status", "name": "status", "in": "query" + }, + { + "type": "string", + "description": "search param", + "name": "q", + "in": "query" } ], "responses": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 116b5932..1a5979e6 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3023,6 +3023,10 @@ paths: in: query name: status type: string + - description: search param + in: query + name: q + type: string produces: - application/json responses: diff --git a/internal/controller_admin/badge_controller.go b/internal/controller_admin/badge_controller.go index 8842592f..4a44f176 100644 --- a/internal/controller_admin/badge_controller.go +++ b/internal/controller_admin/badge_controller.go @@ -47,6 +47,7 @@ func NewBadgeController(badgeService *badge.BadgeService) *BadgeController { // @Param page query int false "page" // @Param page_size query int false "page size" // @Param status query string false "badge status" Enums(, active, inactive) +// @Param q query string false "search param" // @Success 200 {object} handler.RespBody{data=[]schema.GetBadgeListPagedResp} // @Router /answer/admin/api/badges [get] func (b *BadgeController) GetBadgeList(ctx *gin.Context) { diff --git a/internal/repo/badge/badge_repo.go b/internal/repo/badge/badge_repo.go index ebdb0425..8537e389 100644 --- a/internal/repo/badge/badge_repo.go +++ b/internal/repo/badge/badge_repo.go @@ -95,8 +95,15 @@ func (r *badgeRepo) ListByLevelAndGroup(ctx context.Context, level entity.BadgeL // ListPaged returns a list of activated badges func (r *badgeRepo) ListPaged(ctx context.Context, page int, pageSize int) (badges []*entity.Badge, total int64, err error) { badges = make([]*entity.Badge, 0) + total = 0 + session := r.data.DB.Context(ctx).Where("status <> ?", entity.BadgeStatusDeleted) - total, err = pager.Help(page, pageSize, &badges, &entity.Badge{}, session) + if page == 0 || pageSize == 0 { + err = session.Find(&badges) + } else { + total, err = pager.Help(page, pageSize, &badges, &entity.Badge{}, session) + } + if err != nil { err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() } diff --git a/internal/schema/badge_schema.go b/internal/schema/badge_schema.go index 39a2e2ae..088193ad 100644 --- a/internal/schema/badge_schema.go +++ b/internal/schema/badge_schema.go @@ -75,6 +75,8 @@ type GetBadgeListPagedReq struct { PageSize int `validate:"omitempty,min=1" form:"page_size"` // badge status Status BadgeStatus `validate:"omitempty" form:"status"` + // query condition + Query string `validate:"omitempty" form:"q"` } type GetBadgeListPagedResp struct { diff --git a/internal/service/badge/badge_service.go b/internal/service/badge/badge_service.go index 7daab796..c9f3797a 100644 --- a/internal/service/badge/badge_service.go +++ b/internal/service/badge/badge_service.go @@ -30,6 +30,7 @@ import ( "github.com/apache/incubator-answer/pkg/uid" "github.com/gin-gonic/gin" "github.com/segmentfault/pacman/errors" + "strings" ) type BadgeRepo interface { @@ -137,20 +138,44 @@ func (b *BadgeService) ListPaged(ctx context.Context, req *schema.GetBadgeListPa var ( groups []*entity.BadgeGroup badges []*entity.Badge + badge *entity.Badge + exists bool groupMap = make(map[int64]string, 0) ) - 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) - } + total = 0 - if err != nil { - return + 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 + } + } 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 @@ -179,6 +204,22 @@ func (b *BadgeService) ListPaged(ctx context.Context, req *schema.GetBadgeListPa return } +// searchByName +func (b *BadgeService) searchByName(ctx context.Context, name string) (result []*entity.Badge, err error) { + var badges []*entity.Badge + name = strings.ToLower(name) + result = make([]*entity.Badge, 0) + + badges, _, err = b.badgeRepo.ListPaged(ctx, 0, 0) + for _, badge := range badges { + tn := strings.ToLower(translator.Tr(handler.GetLangByCtx(ctx), badge.Name)) + if strings.Contains(tn, name) { + result = append(result, badge) + } + } + return +} + // GetBadgeInfo get badge info func (b *BadgeService) GetBadgeInfo(ctx *gin.Context, id string, userID string) (info *schema.GetBadgeInfoResp, err error) { var (