diff --git a/delivery/http_server/admin/benefactor/get_all.go b/delivery/http_server/admin/benefactor/get_all.go index 8a804dcf..595ff48a 100644 --- a/delivery/http_server/admin/benefactor/get_all.go +++ b/delivery/http_server/admin/benefactor/get_all.go @@ -14,6 +14,7 @@ import ( // @Tags Admins Benefactors // @Accept json // @Produce json +// @Param search query string false "Search by id, phone_number, concat(first_name, last_name) benefactor" // @Param filter_id query int false "Filter by ID" // @Param filter_first_name query string false "Filter by first_name" // @Param filter_last_name query string false "Filter by last_name" diff --git a/delivery/http_server/admin/kind_box/get_all.go b/delivery/http_server/admin/kind_box/get_all.go index 72e932b8..59e2b9d5 100644 --- a/delivery/http_server/admin/kind_box/get_all.go +++ b/delivery/http_server/admin/kind_box/get_all.go @@ -15,6 +15,7 @@ import ( // @Tags Admins KindBoxes // @Accept json // @Produce json +// @Param search query string false "Search by id, phone_number, concat(first_name, last_name) benefactor" // @Param filter_id query int false "Filter by ID" // @Param filter_kind_box_req_id query int false "Filter by KindBox request ID" // @Param filter_benefactor_id query int false "Filter by benefactor ID" diff --git a/delivery/http_server/admin/kind_box_req/get_all.go b/delivery/http_server/admin/kind_box_req/get_all.go index 6e54538c..8db4e388 100644 --- a/delivery/http_server/admin/kind_box_req/get_all.go +++ b/delivery/http_server/admin/kind_box_req/get_all.go @@ -15,6 +15,7 @@ import ( // @Tags Admins KindBoxReqs // @Accept json // @Produce json +// @Param search query string false "Search by id, phone_number, concat(first_name, last_name) benefactor" // @Param filter_id query int false "Filter by ID" // @Param filter_benefactor_id query int false "Filter by benefactor ID" // @Param filter_sender_agent_id query int false "Filter by sender agent ID" diff --git a/delivery/http_server/admin/refer_time/route.go b/delivery/http_server/admin/refer_time/route.go index e91ab5b6..ae1e205a 100644 --- a/delivery/http_server/admin/refer_time/route.go +++ b/delivery/http_server/admin/refer_time/route.go @@ -10,10 +10,6 @@ func (h Handler) SetRoutes(e *echo.Echo) { r := e.Group("/admins/refer-times") r.Use(middleware.Auth(h.authSvc)) - r.Use( - middleware.Auth(h.authSvc), - middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminKindBoxReqAddPermission), - ) - r.GET("", h.GetAll) + r.GET("", h.GetAll, middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminReferTimeGetAllPermission)) } diff --git a/docs/docs.go b/docs/docs.go index b7aca285..6d76c124 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -66,6 +66,12 @@ const docTemplate = `{ ], "summary": "Get all benefactors by admin", "parameters": [ + { + "type": "string", + "description": "Search by id, phone_number, concat(first_name, last_name) benefactor", + "name": "search", + "in": "query" + }, { "type": "integer", "description": "Filter by ID", @@ -270,6 +276,12 @@ const docTemplate = `{ ], "summary": "Get all KindBoxes by admin", "parameters": [ + { + "type": "string", + "description": "Search by id, phone_number, concat(first_name, last_name) benefactor", + "name": "search", + "in": "query" + }, { "type": "integer", "description": "Filter by ID", @@ -706,6 +718,12 @@ const docTemplate = `{ ], "summary": "Admin get all kindboxreq", "parameters": [ + { + "type": "string", + "description": "Search by id, phone_number, concat(first_name, last_name) benefactor", + "name": "search", + "in": "query" + }, { "type": "integer", "description": "Filter by ID", diff --git a/docs/swagger.json b/docs/swagger.json index f756d5c3..bf4fc117 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -55,6 +55,12 @@ ], "summary": "Get all benefactors by admin", "parameters": [ + { + "type": "string", + "description": "Search by id, phone_number, concat(first_name, last_name) benefactor", + "name": "search", + "in": "query" + }, { "type": "integer", "description": "Filter by ID", @@ -259,6 +265,12 @@ ], "summary": "Get all KindBoxes by admin", "parameters": [ + { + "type": "string", + "description": "Search by id, phone_number, concat(first_name, last_name) benefactor", + "name": "search", + "in": "query" + }, { "type": "integer", "description": "Filter by ID", @@ -695,6 +707,12 @@ ], "summary": "Admin get all kindboxreq", "parameters": [ + { + "type": "string", + "description": "Search by id, phone_number, concat(first_name, last_name) benefactor", + "name": "search", + "in": "query" + }, { "type": "integer", "description": "Filter by ID", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 78d324c3..6ccdf047 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1109,6 +1109,10 @@ paths: consumes: - application/json parameters: + - description: Search by id, phone_number, concat(first_name, last_name) benefactor + in: query + name: search + type: string - description: Filter by ID in: query name: filter_id @@ -1245,6 +1249,10 @@ paths: description: Retrieves a list of all KindBoxes with filtering, sorting, and pagination options parameters: + - description: Search by id, phone_number, concat(first_name, last_name) benefactor + in: query + name: search + type: string - description: Filter by ID in: query name: filter_id @@ -1536,6 +1544,10 @@ paths: description: Retrieves a list of all KindBox requests with filtering, sorting, and pagination options parameters: + - description: Search by id, phone_number, concat(first_name, last_name) benefactor + in: query + name: search + type: string - description: Filter by ID in: query name: filter_id diff --git a/entity/admin_permission.go b/entity/admin_permission.go index 0f9a0b8a..3fddee93 100644 --- a/entity/admin_permission.go +++ b/entity/admin_permission.go @@ -23,4 +23,5 @@ const ( AdminKindBoxEnumeratePermission = AdminPermission("kindbox-enumerate") AdminKindBoxUpdatePermission = AdminPermission("kindbox-update") AdminBenefactorGetPermission = AdminPermission("benefactor-get") + AdminReferTimeGetAllPermission = AdminPermission("refertime-getall") ) diff --git a/param/admin/benefactor/get_all.go b/param/admin/benefactor/get_all.go index 105bbdd7..3b4a5952 100644 --- a/param/admin/benefactor/get_all.go +++ b/param/admin/benefactor/get_all.go @@ -8,6 +8,7 @@ type BenefactorGetAllRequest struct { Pagination param.PaginationRequest Sort param.SortRequest Filter param.FilterRequest + Search param.SearchRequest } type BenefactorGetAllResponse struct { Data []Data `json:"data"` diff --git a/param/admin/kind_box/get_all.go b/param/admin/kind_box/get_all.go index c020206b..ae751161 100644 --- a/param/admin/kind_box/get_all.go +++ b/param/admin/kind_box/get_all.go @@ -8,6 +8,7 @@ type KindBoxGetAllRequest struct { Pagination param.PaginationRequest Sort param.SortRequest Filter param.FilterRequest + Search param.SearchRequest } type KindBoxGetAllResponse struct { diff --git a/param/admin/kind_box_req/get_all.go b/param/admin/kind_box_req/get_all.go index 80c855d4..55cc8e74 100644 --- a/param/admin/kind_box_req/get_all.go +++ b/param/admin/kind_box_req/get_all.go @@ -8,6 +8,7 @@ type KindBoxReqGetAllRequest struct { Pagination param.PaginationRequest Sort param.SortRequest Filter param.FilterRequest + Search param.SearchRequest } type KindBoxReqGetAllResponse struct { diff --git a/param/search.go b/param/search.go new file mode 100644 index 00000000..6b0cb283 --- /dev/null +++ b/param/search.go @@ -0,0 +1,34 @@ +package param + +import ( + "regexp" + "strings" +) + +const ( + id = "benefactors.id" + phoneNumber = "benefactors.phone_number" + fullName = "concat(benefactors.first_name, benefactors.last_name)" +) + +var searchItems = []string{id, phoneNumber, fullName} + +type SearchRequest struct { + Query string `query:"search" example:"09123456789"` +} + +type QuerySearch map[string]any + +func (s *SearchRequest) GetSearch() *QuerySearch { + searchParams := QuerySearch{} + + if s.Query != "" { + s.Query = strings.TrimSpace(s.Query) + re := regexp.MustCompile(`[\p{P}\p{S}]+`) + s.Query = re.ReplaceAllString(s.Query, "") + for _, val := range searchItems { + searchParams[val] = s.Query + } + } + return &searchParams +} diff --git a/pkg/query_builder/mysql/deleted_at.go b/pkg/query_builder/mysql/deleted_at.go new file mode 100644 index 00000000..a350c223 --- /dev/null +++ b/pkg/query_builder/mysql/deleted_at.go @@ -0,0 +1,35 @@ +package mysqlquerybuilder + +import ( + "fmt" + "strings" +) + +func BuildDeletedAtQuery(query, table string) string { + deletedAtClause := fmt.Sprintf(" %s.deleted_at IS NULL ", table) + + if !strings.Contains(query, "WHERE") { + return appendStringBefore(query, "WHERE", deletedAtClause) + } + + return appendStringAfter(query, "AND", deletedAtClause) +} + +func appendStringBefore(s, operator, appendage string) string { + limitIndex := strings.Index(strings.ToUpper(s), "LIMIT") + if limitIndex == -1 { + return s + operator + appendage + } + return s[:limitIndex] + operator + appendage + s[limitIndex:] +} + +func appendStringAfter(s, operator, appendage string) string { + index := strings.Index(strings.ToUpper(s), "WHERE") + + spaceAfterTarget := strings.Index(s[index:], " ") + if spaceAfterTarget == -1 { + spaceAfterTarget = len(s) - index + } + + return s[:index+spaceAfterTarget] + appendage + operator + s[index+spaceAfterTarget:] +} diff --git a/pkg/query_builder/mysql/filter.go b/pkg/query_builder/mysql/filter.go index ee34f30d..8561ec77 100644 --- a/pkg/query_builder/mysql/filter.go +++ b/pkg/query_builder/mysql/filter.go @@ -12,16 +12,16 @@ func isValidDateOrDateTime(value string) bool { return datePattern.MatchString(value) } -func BuildFilterQuery(baseQuery string, filter map[string]interface{}) (string, []any) { +func BuildFilterQuery(baseQuery, table string, filter map[string]interface{}) (string, []any) { var conditions []string var args []any for key, value := range filter { if strVal, ok := value.(string); ok && isValidDateOrDateTime(strVal) { - conditions = append(conditions, fmt.Sprintf("DATE(%s) = ?", key)) + conditions = append(conditions, fmt.Sprintf("DATE(%s.%s) = ?", table, key)) args = append(args, strVal) } else { - conditions = append(conditions, fmt.Sprintf("%s = ?", key)) + conditions = append(conditions, fmt.Sprintf("%s.%s = ?", table, key)) args = append(args, value) } } diff --git a/pkg/query_builder/mysql/get_all.go b/pkg/query_builder/mysql/get_all.go index 7140d131..af86a692 100644 --- a/pkg/query_builder/mysql/get_all.go +++ b/pkg/query_builder/mysql/get_all.go @@ -6,8 +6,8 @@ import ( "git.gocasts.ir/ebhomengo/niki/param" ) -func BuildGetAllQuery(baseQuery string, filter param.FilterRequest, pagination param.PaginationRequest, sort param.SortRequest) (query string, args []any) { - filterQuery, fArgs := BuildFilterQuery(baseQuery, filter) +func BuildGetAllQuery(baseQuery, table string, filter param.FilterRequest, pagination param.PaginationRequest, sort param.SortRequest) (query string, args []any) { + filterQuery, fArgs := BuildFilterQuery(baseQuery, table, filter) paginationQuery, pArgs := BuildPaginationQuery(pagination) sortQuery := BuildSortQuery(sort) diff --git a/pkg/query_builder/mysql/search.go b/pkg/query_builder/mysql/search.go new file mode 100644 index 00000000..9156439b --- /dev/null +++ b/pkg/query_builder/mysql/search.go @@ -0,0 +1,38 @@ +package mysqlquerybuilder + +import ( + "fmt" + "strings" +) + +// TODO: implementation more complete search service. + +func BuildGetSearchQuery(baseQuery string, filter map[string]interface{}, exist bool) (string, []any) { + var conditions []string + var args []any + for key, value := range filter { + if key == "id" { + conditions = append(conditions, fmt.Sprintf("%s = ?", key)) + } else { + conditions = append(conditions, fmt.Sprintf("%s LIKE ?", key)) + } + args = append(args, value) + } + + query := baseQuery + if len(conditions) > 0 { + subQuery := strings.Join(conditions, " OR ") + if exist { + query += fmt.Sprintf(" INNER JOIN benefactors ON benefactor_id = benefactors.id WHERE (%s) ", subQuery) + } else { + if strings.Contains(strings.ToUpper(baseQuery), "WHERE") { + query += " AND " + } else { + query += " WHERE " + } + query += subQuery + } + } + + return query, args +} diff --git a/repository/mysql/benefactor/get_all.go b/repository/mysql/benefactor/get_all.go index 65517694..b55ab70f 100644 --- a/repository/mysql/benefactor/get_all.go +++ b/repository/mysql/benefactor/get_all.go @@ -10,11 +10,16 @@ import ( richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" ) -func (d *DB) GetAllBenefactor(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.Benefactor, uint, error) { +func (d *DB) GetAllBenefactor(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest, searchParams *params.QuerySearch) ([]entity.Benefactor, uint, error) { const op = "mysqlbenefactor.GetAllBenefactor" + table := "benefactors" baseQuery := `SELECT * FROM benefactors` - query, args := builder.BuildGetAllQuery(baseQuery, filter, pagination, sort) + + searchQuery, sArgs := builder.BuildGetSearchQuery(baseQuery, *searchParams, false) + query, fArgs := builder.BuildGetAllQuery(searchQuery, table, filter, pagination, sort) + args := append(sArgs, fArgs...) + rows, qErr := d.conn.Conn().QueryContext(ctx, query, args...) if qErr != nil { return nil, 0, richerror.New(op).WithErr(qErr).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected) @@ -38,7 +43,7 @@ func (d *DB) GetAllBenefactor(ctx context.Context, filter params.FilterRequest, } var total uint baseQuery = `SELECT COUNT(*) FROM benefactors` - query, args = builder.BuildGetAllQuery(baseQuery, filter, params.PaginationRequest{}, params.SortRequest{}) + query, args = builder.BuildGetAllQuery(baseQuery, table, filter, params.PaginationRequest{}, params.SortRequest{}) qErr = d.conn.Conn().QueryRowContext(ctx, query, args...).Scan(&total) if qErr != nil { return nil, 0, richerror.New(op).WithErr(qErr).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected) diff --git a/repository/mysql/kind_box/get_all.go b/repository/mysql/kind_box/get_all.go index 089b858e..0679a2df 100644 --- a/repository/mysql/kind_box/get_all.go +++ b/repository/mysql/kind_box/get_all.go @@ -10,11 +10,17 @@ import ( richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" ) -func (d *DB) GetAllKindBox(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.KindBox, uint, error) { +func (d *DB) GetAllKindBox(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest, searchParams *params.QuerySearch) ([]entity.KindBox, uint, error) { const op = "mysqlkindbox.GetAllKindBox" + table := "kind_boxes" + + baseQuery := `SELECT kind_boxes.* FROM kind_boxes` + + searchQuery, sArgs := builder.BuildGetSearchQuery(baseQuery, *searchParams, true) + filterQuery, fArgs := builder.BuildGetAllQuery(searchQuery, table, filter, pagination, sort) + query := builder.BuildDeletedAtQuery(filterQuery, table) + args := append(sArgs, fArgs...) - baseQuery := `SELECT * FROM kind_boxes WHERE deleted_at IS NULL` - query, args := builder.BuildGetAllQuery(baseQuery, filter, pagination, sort) rows, qErr := d.conn.Conn().QueryContext(ctx, query, args...) if qErr != nil { return nil, 0, richerror.New(op).WithErr(qErr).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected) @@ -37,7 +43,7 @@ func (d *DB) GetAllKindBox(ctx context.Context, filter params.FilterRequest, pag var total uint baseQuery = `SELECT COUNT(*) FROM kind_boxes WHERE deleted_at IS NULL` - query, args = builder.BuildGetAllQuery(baseQuery, filter, params.PaginationRequest{}, params.SortRequest{}) + query, args = builder.BuildGetAllQuery(baseQuery, table, filter, params.PaginationRequest{}, params.SortRequest{}) qErr = d.conn.Conn().QueryRowContext(ctx, query, args...).Scan(&total) if qErr != nil { return nil, 0, richerror.New(op).WithErr(qErr).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected) diff --git a/repository/mysql/kind_box_req/get_all.go b/repository/mysql/kind_box_req/get_all.go index 1c0cb852..0f5ab353 100644 --- a/repository/mysql/kind_box_req/get_all.go +++ b/repository/mysql/kind_box_req/get_all.go @@ -10,11 +10,17 @@ import ( richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" ) -func (d *DB) GetAllKindBoxReq(ctx context.Context, filter param.FilterRequest, pagination param.PaginationRequest, sort param.SortRequest) ([]entity.KindBoxReq, uint, error) { +func (d *DB) GetAllKindBoxReq(ctx context.Context, filter param.FilterRequest, pagination param.PaginationRequest, sort param.SortRequest, searchParams *param.QuerySearch) ([]entity.KindBoxReq, uint, error) { const op = "mysqlkindboxreq.GetAllKindBoxReq" + table := "kind_box_reqs" + + baseQuery := `SELECT kind_box_reqs.* FROM kind_box_reqs` + + searchQuery, sArgs := builder.BuildGetSearchQuery(baseQuery, *searchParams, true) + filterQuery, fArgs := builder.BuildGetAllQuery(searchQuery, table, filter, pagination, sort) + query := builder.BuildDeletedAtQuery(filterQuery, table) + args := append(sArgs, fArgs...) - baseQuery := `SELECT * FROM kind_box_reqs WHERE deleted_at IS NULL` - query, args := builder.BuildGetAllQuery(baseQuery, filter, pagination, sort) rows, qErr := d.conn.Conn().QueryContext(ctx, query, args...) if qErr != nil { return nil, 0, richerror.New(op).WithErr(qErr).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected) @@ -37,7 +43,7 @@ func (d *DB) GetAllKindBoxReq(ctx context.Context, filter param.FilterRequest, p var total uint baseQuery = `SELECT COUNT(*) FROM kind_box_reqs WHERE deleted_at IS NULL` - query, args = builder.BuildGetAllQuery(baseQuery, filter, param.PaginationRequest{}, param.SortRequest{}) + query, args = builder.BuildGetAllQuery(baseQuery, table, filter, param.PaginationRequest{}, param.SortRequest{}) qErr = d.conn.Conn().QueryRowContext(ctx, query, args...).Scan(&total) if qErr != nil { return nil, 0, richerror.New(op).WithErr(qErr).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected) diff --git a/repository/mysql/migration/1727209869_add_getall_refertime_access.sql b/repository/mysql/migration/1727209869_add_getall_refertime_access.sql new file mode 100644 index 00000000..c4719a38 --- /dev/null +++ b/repository/mysql/migration/1727209869_add_getall_refertime_access.sql @@ -0,0 +1,33 @@ +-- +migrate Up +ALTER TABLE `admin_access_controls` MODIFY COLUMN `permission` + enum ( + 'admin-register', + 'kindboxreq-accept', + 'kindboxreq-reject', + 'kindboxreq-getall', + 'kindboxreq-deliver', + 'kindboxreq-assign_sender_agent', + 'admin-getall_agent', + 'kindboxreq-get_awaiting_delivery', + 'kindbox-get', + 'kindboxreq-add', + 'kindbox-assign_receiver_agent', + 'kindbox-getall', + 'kindboxreq-update', + 'kindboxreq-get', + 'kindbox-get_awaiting_return', + 'kindbox-return', + 'kindbox-enumerate', + 'kindbox-update', + 'benefactor-getall', + 'benefactor-get', + 'refertime-getall' + ) NOT NULL; + +INSERT INTO `admin_access_controls` (`actor_id`, `actor_type`, `permission`) +VALUES (1, 'role', 'refertime-getall'), + (2, 'role', 'refertime-getall'); + +-- +migrate Down +DELETE +FROM `admin_access_controls`; \ No newline at end of file diff --git a/service/admin/benefactor/get_all.go b/service/admin/benefactor/get_all.go index 3b1e1dd8..6ed982a3 100644 --- a/service/admin/benefactor/get_all.go +++ b/service/admin/benefactor/get_all.go @@ -17,7 +17,7 @@ func (s Service) GetAllBenefactor(ctx context.Context, req param.BenefactorGetAl req.Pagination.GetPageSize() req.Pagination.GetPageNumber() - benefactors, total, err := s.repo.GetAllBenefactor(ctx, req.Filter, req.Pagination, req.Sort) + benefactors, total, err := s.repo.GetAllBenefactor(ctx, req.Filter, req.Pagination, req.Sort, req.Search.GetSearch()) if err != nil { return param.BenefactorGetAllResponse{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected) } diff --git a/service/admin/benefactor/service.go b/service/admin/benefactor/service.go index 966de2c4..8d1552ca 100644 --- a/service/admin/benefactor/service.go +++ b/service/admin/benefactor/service.go @@ -12,7 +12,7 @@ import ( type Repository interface { IsExistBenefactorByID(ctx context.Context, id uint) (bool, error) GetByID(ctx context.Context, id uint) (entity.Benefactor, error) - GetAllBenefactor(ctx context.Context, filter param.FilterRequest, pagination param.PaginationRequest, sort param.SortRequest) ([]entity.Benefactor, uint, error) + GetAllBenefactor(ctx context.Context, filter param.FilterRequest, pagination param.PaginationRequest, sort param.SortRequest, searchParams *param.QuerySearch) ([]entity.Benefactor, uint, error) } type AddressSvc interface { GetAddressByID(ctx context.Context, request adminaddressparam.AddressGetRequest) (adminaddressparam.AddressGetResponse, error) diff --git a/service/admin/kind_box/get_all.go b/service/admin/kind_box/get_all.go index b1d564df..307c3799 100644 --- a/service/admin/kind_box/get_all.go +++ b/service/admin/kind_box/get_all.go @@ -18,7 +18,7 @@ func (s Service) GetAll(ctx context.Context, req param.KindBoxGetAllRequest) (pa req.Pagination.GetPageSize() req.Pagination.GetPageNumber() - allKindBox, total, err := s.repo.GetAllKindBox(ctx, req.Filter, req.Pagination, req.Sort) + allKindBox, total, err := s.repo.GetAllKindBox(ctx, req.Filter, req.Pagination, req.Sort, req.Search.GetSearch()) if err != nil { return param.KindBoxGetAllResponse{}, richerror.New(op).WithErr(err) } diff --git a/service/admin/kind_box/service.go b/service/admin/kind_box/service.go index bbf07359..b12de392 100644 --- a/service/admin/kind_box/service.go +++ b/service/admin/kind_box/service.go @@ -11,7 +11,7 @@ import ( type Repository interface { GetKindBox(ctx context.Context, kindBoxID uint) (entity.KindBox, error) AssignReceiverAgent(ctx context.Context, kindBox entity.KindBox) error - GetAllKindBox(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.KindBox, uint, error) + GetAllKindBox(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest, searchParams *params.QuerySearch) ([]entity.KindBox, uint, error) EnumerateKindBox(ctx context.Context, kindBoxID uint, amount uint) error UpdateKindBox(ctx context.Context, KindBox entity.KindBox) error } diff --git a/service/admin/kind_box_req/get_all.go b/service/admin/kind_box_req/get_all.go index c8e0bab5..a9ba514e 100644 --- a/service/admin/kind_box_req/get_all.go +++ b/service/admin/kind_box_req/get_all.go @@ -18,7 +18,7 @@ func (s Service) GetAll(ctx context.Context, req param.KindBoxReqGetAllRequest) req.Pagination.GetPageSize() req.Pagination.GetPageNumber() - allKindBoxReq, total, err := s.repo.GetAllKindBoxReq(ctx, req.Filter, req.Pagination, req.Sort) + allKindBoxReq, total, err := s.repo.GetAllKindBoxReq(ctx, req.Filter, req.Pagination, req.Sort, req.Search.GetSearch()) if err != nil { return param.KindBoxReqGetAllResponse{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected) } diff --git a/service/admin/kind_box_req/service.go b/service/admin/kind_box_req/service.go index 76fc1bce..976473b6 100644 --- a/service/admin/kind_box_req/service.go +++ b/service/admin/kind_box_req/service.go @@ -14,7 +14,7 @@ type Repository interface { RejectKindBoxReq(ctx context.Context, kindBoxReqID uint, description string) error AssignSenderAgentToKindBoxReq(ctx context.Context, kindBoxReqID uint, senderAgentID uint) error DeliverKindBoxReq(ctx context.Context, kindBoxReqID uint) error - GetAllKindBoxReq(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.KindBoxReq, uint, error) + GetAllKindBoxReq(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest, searchParams *params.QuerySearch) ([]entity.KindBoxReq, uint, error) GetAwaitingDeliveryByAgent(ctx context.Context, kindBoxReqID uint, agentID uint) (entity.KindBoxReq, error) AddKindBoxReq(ctx context.Context, kindBoxReq entity.KindBoxReq) (entity.KindBoxReq, error) UpdateKindBoxReq(ctx context.Context, kindBoxReq entity.KindBoxReq) error diff --git a/service/agent/kind_box/get_all_return_awaiting.go b/service/agent/kind_box/get_all_return_awaiting.go index e8bbc491..f21e793a 100644 --- a/service/agent/kind_box/get_all_return_awaiting.go +++ b/service/agent/kind_box/get_all_return_awaiting.go @@ -20,7 +20,7 @@ func (s Service) GetAll(ctx context.Context, req param.GetAllRequest) (param.Get req.Filter["receiver_agent_id"] = req.ReceiverAgentId req.Filter["status"] = req.Status - allKindBoxes, total, err := s.repo.GetAllKindBox(ctx, req.Filter, req.Pagination, req.Sort) + allKindBoxes, total, err := s.repo.GetAllKindBox(ctx, req.Filter, req.Pagination, req.Sort, nil) if err != nil { return param.GetAllResponse{}, richerror.New(op).WithErr(err) } diff --git a/service/agent/kind_box/service.go b/service/agent/kind_box/service.go index 6a7f25a4..9b82b3f1 100644 --- a/service/agent/kind_box/service.go +++ b/service/agent/kind_box/service.go @@ -10,7 +10,7 @@ import ( type Repository interface { GetAwaitingReturnByAgent(ctx context.Context, kindBoxID uint, agentID uint) (entity.KindBox, error) - GetAllKindBox(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.KindBox, uint, error) + GetAllKindBox(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest, searchParams *params.QuerySearch) ([]entity.KindBox, uint, error) ReturnKindBox(ctx context.Context, kindBoxID uint, serialNumber string) error AddBatchKindBox(ctx context.Context, kindBoxes []entity.KindBox) error } diff --git a/service/agent/kind_box_req/get_all_delivery_awaiting.go b/service/agent/kind_box_req/get_all_delivery_awaiting.go index 12589bc2..29150146 100644 --- a/service/agent/kind_box_req/get_all_delivery_awaiting.go +++ b/service/agent/kind_box_req/get_all_delivery_awaiting.go @@ -20,7 +20,7 @@ func (s Service) GetAllAwaitingDelivery(ctx context.Context, req param.DeliveryA req.Filter["sender_agent_id"] = req.SenderAgentId req.Filter["status"] = req.Status - allAwaitingKindBoxReq, total, err := s.repo.GetAllKindBoxReq(ctx, req.Filter, req.Pagination, req.Sort) + allAwaitingKindBoxReq, total, err := s.repo.GetAllKindBoxReq(ctx, req.Filter, req.Pagination, req.Sort, nil) if err != nil { return param.DeliveryAwaitingGetAllResponse{}, richerror.New(op).WithErr(err) } diff --git a/service/agent/kind_box_req/service.go b/service/agent/kind_box_req/service.go index ad1eeed4..f84fbcd3 100644 --- a/service/agent/kind_box_req/service.go +++ b/service/agent/kind_box_req/service.go @@ -10,7 +10,7 @@ import ( ) type Repository interface { - GetAllKindBoxReq(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.KindBoxReq, uint, error) + GetAllKindBoxReq(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest, searchParams *params.QuerySearch) ([]entity.KindBoxReq, uint, error) DeliverKindBoxReq(ctx context.Context, kindBoxReqID uint) error GetAwaitingDeliveryByAgent(ctx context.Context, kindBoxReqID uint, agentID uint) (entity.KindBoxReq, error) GetByID(ctx context.Context, id uint) (entity.KindBoxReq, error) diff --git a/service/benefactor/kind_box/get_all.go b/service/benefactor/kind_box/get_all.go index 8fa615b2..3881800a 100644 --- a/service/benefactor/kind_box/get_all.go +++ b/service/benefactor/kind_box/get_all.go @@ -18,7 +18,7 @@ func (s Service) GetAll(ctx context.Context, req param.KindBoxGetAllRequest) (pa req.Pagination.GetPageSize() req.Pagination.GetPageNumber() - allKindBox, total, err := s.repo.GetAllKindBox(ctx, req.Filter, req.Pagination, req.Sort) + allKindBox, total, err := s.repo.GetAllKindBox(ctx, req.Filter, req.Pagination, req.Sort, nil) if err != nil { return param.KindBoxGetAllResponse{}, richerror.New(op).WithErr(err) } diff --git a/service/benefactor/kind_box/service.go b/service/benefactor/kind_box/service.go index 322adf2f..a88c87fc 100644 --- a/service/benefactor/kind_box/service.go +++ b/service/benefactor/kind_box/service.go @@ -9,7 +9,7 @@ import ( ) type Repository interface { - GetAllKindBox(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.KindBox, uint, error) + GetAllKindBox(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest, searchParams *params.QuerySearch) ([]entity.KindBox, uint, error) GetKindBox(ctx context.Context, kindBoxID uint) (entity.KindBox, error) RegisterEmptyingRequestForKindBox(ctx context.Context, kindBox entity.KindBox) error } diff --git a/service/benefactor/kind_box_req/get_all.go b/service/benefactor/kind_box_req/get_all.go index 8398a367..5b66d116 100644 --- a/service/benefactor/kind_box_req/get_all.go +++ b/service/benefactor/kind_box_req/get_all.go @@ -18,7 +18,7 @@ func (s Service) GetAll(ctx context.Context, req param.GetAllRequest) (param.Get req.Pagination.GetPageSize() req.Pagination.GetPageNumber() - allKindBoxReq, total, err := s.repo.GetAllKindBoxReq(ctx, req.Filter, req.Pagination, req.Sort) + allKindBoxReq, total, err := s.repo.GetAllKindBoxReq(ctx, req.Filter, req.Pagination, req.Sort, nil) if err != nil { return param.GetAllResponse{}, richerror.New(op).WithErr(err) } diff --git a/service/benefactor/kind_box_req/service.go b/service/benefactor/kind_box_req/service.go index 6c503273..12606f99 100644 --- a/service/benefactor/kind_box_req/service.go +++ b/service/benefactor/kind_box_req/service.go @@ -12,7 +12,7 @@ type Repository interface { AddKindBoxReq(ctx context.Context, kindBoxReq entity.KindBoxReq) (entity.KindBoxReq, error) GetKindBoxReqByID(ctx context.Context, kindBoxReqID uint) (entity.KindBoxReq, error) DeleteKindBoxReqByID(ctx context.Context, kindBoxReqID uint) error - GetAllKindBoxReq(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.KindBoxReq, uint, error) + GetAllKindBoxReq(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest, searchParams *params.QuerySearch) ([]entity.KindBoxReq, uint, error) UpdateKindBoxReq(ctx context.Context, kindBoxReq entity.KindBoxReq) error } diff --git a/validator/admin/benefactor/get_all.go b/validator/admin/benefactor/get_all.go index ef2f7700..9cc80d9a 100644 --- a/validator/admin/benefactor/get_all.go +++ b/validator/admin/benefactor/get_all.go @@ -17,6 +17,7 @@ func (v Validator) ValidateGetAll(req param.BenefactorGetAllRequest) (map[string if err := validation.ValidateStruct(&req, validation.Field(&req.Filter, validation.By(v.AreFilterFieldsValid(validFields))), validation.Field(&req.Sort, validation.By(v.AreSortFieldsValid(validFields))), + validation.Field(&req.Search, validation.By(v.AreSearchValid())), ); err != nil { fieldErrors := make(map[string]string) diff --git a/validator/admin/benefactor/validator.go b/validator/admin/benefactor/validator.go index 3395a6a0..ba44a5ca 100644 --- a/validator/admin/benefactor/validator.go +++ b/validator/admin/benefactor/validator.go @@ -9,6 +9,10 @@ import ( validation "github.com/go-ozzo/ozzo-validation/v4" ) +const ( + MaxLengthQuerySearch = 32 +) + type Validator struct{} func New() Validator { @@ -50,3 +54,17 @@ func (v Validator) AreFilterFieldsValid(validFilters []string) validation.RuleFu return nil } } + +func (v Validator) AreSearchValid() validation.RuleFunc { + return func(value interface{}) error { + search, ok := value.(params.SearchRequest) + if !ok { + return fmt.Errorf(errmsg.ErrorMsgSomethingWentWrong) + } + if len(search.Query) > MaxLengthQuerySearch { + return fmt.Errorf(errmsg.ErrorMsgInvalidInput) + } + + return nil + } +} diff --git a/validator/admin/kind_box/get_all.go b/validator/admin/kind_box/get_all.go index cf6054a1..27c19206 100644 --- a/validator/admin/kind_box/get_all.go +++ b/validator/admin/kind_box/get_all.go @@ -21,6 +21,7 @@ func (v Validator) ValidateGetAll(req param.KindBoxGetAllRequest) (map[string]st if err := validation.ValidateStruct(&req, validation.Field(&req.Filter, validation.By(v.AreFilterFieldsValid(validFields))), validation.Field(&req.Sort, validation.By(v.AreSortFieldsValid(validFields))), + validation.Field(&req.Search, validation.By(v.AreSearchValid())), ); err != nil { fieldErrors := make(map[string]string) diff --git a/validator/admin/kind_box/validator.go b/validator/admin/kind_box/validator.go index 37c7ce25..8e6c7118 100644 --- a/validator/admin/kind_box/validator.go +++ b/validator/admin/kind_box/validator.go @@ -18,6 +18,10 @@ import ( validation "github.com/go-ozzo/ozzo-validation/v4" ) +const ( + MaxLengthQuerySearch = 32 +) + //go:generate mockery --name Repository type Repository interface { KindBoxExist(ctx context.Context, kindBoxID uint) (bool, error) @@ -279,3 +283,17 @@ func (v Validator) AreFilterFieldsValid(validFilters []string) validation.RuleFu return nil } } + +func (v Validator) AreSearchValid() validation.RuleFunc { + return func(value interface{}) error { + search, ok := value.(params.SearchRequest) + if !ok { + return fmt.Errorf(errmsg.ErrorMsgSomethingWentWrong) + } + if len(search.Query) > MaxLengthQuerySearch { + return fmt.Errorf(errmsg.ErrorMsgInvalidInput) + } + + return nil + } +} diff --git a/validator/admin/kind_box_req/get_all.go b/validator/admin/kind_box_req/get_all.go index a5679f0e..3b3d40a8 100644 --- a/validator/admin/kind_box_req/get_all.go +++ b/validator/admin/kind_box_req/get_all.go @@ -20,6 +20,7 @@ func (v Validator) ValidateGetAll(req param.KindBoxReqGetAllRequest) (map[string if err := validation.ValidateStruct(&req, validation.Field(&req.Filter, validation.By(v.AreFilterFieldsValid(validFields))), validation.Field(&req.Sort, validation.By(v.AreSortFieldsValid(validFields))), + validation.Field(&req.Search, validation.By(v.AreSearchValid())), ); err != nil { fieldErrors := make(map[string]string) diff --git a/validator/admin/kind_box_req/validator.go b/validator/admin/kind_box_req/validator.go index dd05eefd..29aa5f08 100644 --- a/validator/admin/kind_box_req/validator.go +++ b/validator/admin/kind_box_req/validator.go @@ -18,8 +18,9 @@ import ( ) const ( - MinKindBoxReq = 1 - MaxKindBoxReq = 100 + MinKindBoxReq = 1 + MaxKindBoxReq = 100 + MaxLengthQuerySearch = 32 ) type Repository interface { @@ -340,3 +341,17 @@ func (v Validator) AreFilterFieldsValid(validFilters []string) validation.RuleFu return nil } } + +func (v Validator) AreSearchValid() validation.RuleFunc { + return func(value interface{}) error { + search, ok := value.(params.SearchRequest) + if !ok { + return fmt.Errorf(errmsg.ErrorMsgSomethingWentWrong) + } + if len(search.Query) > MaxLengthQuerySearch { + return fmt.Errorf(errmsg.ErrorMsgInvalidInput) + } + + return nil + } +}