diff --git a/delivery/http_server/admin/benefactor/get_all.go b/delivery/http_server/admin/benefactor/get_all.go new file mode 100644 index 00000000..9d6731b8 --- /dev/null +++ b/delivery/http_server/admin/benefactor/get_all.go @@ -0,0 +1,29 @@ +package adminbenefactorhandler + +import ( + adminbenefactorparam "git.gocasts.ir/ebhomengo/niki/param/admin/benefactor" + httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg" + "github.com/labstack/echo/v4" + "net/http" +) + +// GetAllBenefactor godoc +// @Summary Get all benefactor by admin +// @Tags Admins Benefactors +// @Accept json +// @Produce json +// @Success 200 {object} adminbenefactorparam.GetAllBenefactorResponse +// @Failure 400 {string} "Bad request" +// @Security AuthBearerAdmin +// @Router /admins/benefactors [get]. +func (h Handler) GetAllBenefactor(c echo.Context) error { + var resp adminbenefactorparam.GetAllBenefactorResponse + resp, sErr := h.benefactorSvc.GetAllBenefactor(c.Request().Context()) + if sErr != nil { + msg, code := httpmsg.Error(sErr) + + return echo.NewHTTPError(code, msg) + } + + return c.JSON(http.StatusOK, resp) +} diff --git a/delivery/http_server/admin/benefactor/handler.go b/delivery/http_server/admin/benefactor/handler.go new file mode 100644 index 00000000..29e91c95 --- /dev/null +++ b/delivery/http_server/admin/benefactor/handler.go @@ -0,0 +1,24 @@ +package adminbenefactorhandler + +import ( + authorizeservice "git.gocasts.ir/ebhomengo/niki/service/admin/authorization" + benefactorservice "git.gocasts.ir/ebhomengo/niki/service/admin/benefactor" + authservice "git.gocasts.ir/ebhomengo/niki/service/auth" +) + +type Handler struct { + authSvc authservice.Service + benefactorSvc benefactorservice.Service + authorizeSvc authorizeservice.Service +} + +func New(authSvc authservice.Service, + benefactorSvc benefactorservice.Service, + authorizeSvc authorizeservice.Service, +) Handler { + return Handler{ + authSvc: authSvc, + benefactorSvc: benefactorSvc, + authorizeSvc: authorizeSvc, + } +} diff --git a/delivery/http_server/admin/benefactor/route.go b/delivery/http_server/admin/benefactor/route.go new file mode 100644 index 00000000..26ff08d9 --- /dev/null +++ b/delivery/http_server/admin/benefactor/route.go @@ -0,0 +1,13 @@ +package adminbenefactorhandler + +import ( + "git.gocasts.ir/ebhomengo/niki/delivery/http_server/middleware" + "git.gocasts.ir/ebhomengo/niki/entity" + "github.com/labstack/echo/v4" +) + +func (h Handler) SetRoutes(e *echo.Echo) { + r := e.Group("/admins") + + r.GET("/benefactors", h.GetAllBenefactor, middleware.Auth(h.authSvc), middleware.AdminAuthorization(h.authorizeSvc, entity.AdminBenefactorGetAllPermission)) +} diff --git a/entity/admin_permission.go b/entity/admin_permission.go index da550367..5ec9a9a5 100644 --- a/entity/admin_permission.go +++ b/entity/admin_permission.go @@ -11,6 +11,7 @@ const ( AdminKindBoxReqDeliverPermission = AdminPermission("kindboxreq-deliver") AdminKindBoxReqAssignSenderAgentPermission = AdminPermission("kindboxreq-assign_sender_agent") AdminAdminGetAllAgentPermission = AdminPermission("admin-getall_agent") + AdminBenefactorGetAllPermission = AdminPermission("benefactor-getall") AdminKindBoxReqGetAwaitingDeliveryPermission = AdminPermission("kindboxreq-get_awaiting_delivery") AdminKindBoxGetPermission = AdminPermission("kindbox-get") AdminKindBoxAssignReceiverAgentPermission = AdminPermission("kindbox-assign_receiver_agent") diff --git a/param/admin/benefactor/data.go b/param/admin/benefactor/data.go new file mode 100644 index 00000000..dfd9cbc3 --- /dev/null +++ b/param/admin/benefactor/data.go @@ -0,0 +1,19 @@ +package adminbenefactoreparam + +import ( + "git.gocasts.ir/ebhomengo/niki/entity" + "time" +) + +type Data struct { + ID uint `json:"id"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + PhoneNumber string `json:"phone_number"` + Description string `json:"description"` + Email string `json:"email"` + Gender entity.Gender `json:"gender"` + BirthDate time.Time `json:"birth_date"` + Roll entity.UserRole `json:"roll"` + Status entity.BenefactorStatus `json:"status"` +} diff --git a/param/admin/benefactor/get_all.go b/param/admin/benefactor/get_all.go new file mode 100644 index 00000000..9e91ece9 --- /dev/null +++ b/param/admin/benefactor/get_all.go @@ -0,0 +1,16 @@ +package adminbenefactoreparam + +import ( + "git.gocasts.ir/ebhomengo/niki/param" +) + +type GetAllBenefactorRequest struct { + Pagination param.PaginationRequest + Sort param.SortRequest + Filter param.FilterRequest +} +type GetAllBenefactorResponse struct { + Data []Data `json:"data"` + Pagination param.PaginationResponse `json:"pagination"` + FieldErrors map[string]string `json:"field_errors,omitempty"` +} diff --git a/repository/mysql/benefactor/get_all.go b/repository/mysql/benefactor/get_all.go new file mode 100644 index 00000000..2538b3ad --- /dev/null +++ b/repository/mysql/benefactor/get_all.go @@ -0,0 +1,47 @@ +package mysqlbenefactor + +import ( + "context" + "git.gocasts.ir/ebhomengo/niki/entity" + params "git.gocasts.ir/ebhomengo/niki/param" + errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" + builder "git.gocasts.ir/ebhomengo/niki/pkg/query_builder/mysql" + 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) { + const op = "mysqlbenefactor.GetAllBenefactor" + + baseQuery := `SELECT * FROM benefactors` + 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) + } + + defer rows.Close() + + benefactors := make([]entity.Benefactor, 0) + for rows.Next() { + benefactor, sErr := scanBenefactor(rows) + if sErr != nil { + return nil, 0, richerror.New(op).WithErr(sErr). + WithMessage(errmsg.ErrorMsgCantScanQueryResult).WithKind(richerror.KindUnexpected) + } + benefactors = append(benefactors, benefactor) + } + + if rErr := rows.Err(); rErr != nil { + return nil, 0, richerror.New(op).WithErr(rErr). + WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected) + } + var total uint + baseQuery = `SELECT COUNT(*) FROM benefactors` + query, args = builder.BuildGetAllQuery(baseQuery, filter, pagination, sort) + 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) + } + + return benefactors, total, nil +} diff --git a/repository/mysql/prepared_statement.go b/repository/mysql/prepared_statement.go index c3aab737..7e954140 100644 --- a/repository/mysql/prepared_statement.go +++ b/repository/mysql/prepared_statement.go @@ -25,6 +25,7 @@ const ( StatementKeyBenefactorGetByID StatementKeyBenefactorGetByPhoneNumber StatementKeyBenefactorCreate + StatementKeyBenefactorGetAll StatementKeyKindBoxAdd StatementKeyKindBoxAssignReceiverAgent StatementKeyKindBoxEnumerate diff --git a/service/admin/benefactor/get_all.go b/service/admin/benefactor/get_all.go new file mode 100644 index 00000000..9f6d9a2b --- /dev/null +++ b/service/admin/benefactor/get_all.go @@ -0,0 +1,40 @@ +package adminbenefactorservice + +import ( + "context" + paginationparam "git.gocasts.ir/ebhomengo/niki/param" + param "git.gocasts.ir/ebhomengo/niki/param/admin/benefactor" + richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" +) + +func (s Service) GetAllBenefactor(ctx context.Context, req param.GetAllBenefactorRequest) (param.GetAllBenefactorResponse, error) { + const op = "adminbenefactorservice.GetAllBenefactor" + + benefactorInfo := make([]param.Data, 0) + + benefactors, total, err := s.benefactorSvc.GetAllBenefactors(ctx, req.Filter, req.Pagination, req.Sort) + if err != nil { + return param.GetAllBenefactorResponse{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected) + } + + for _, benefactor := range benefactors { + benefactorInfo = append(benefactorInfo, param.Data{ + ID: benefactor.ID, + FirstName: benefactor.FirstName, + LastName: benefactor.LastName, + PhoneNumber: benefactor.PhoneNumber, + Description: benefactor.Description, + Email: benefactor.Email, + Gender: benefactor.Gender, + BirthDate: benefactor.BirthDate, + Roll: benefactor.Role, + Status: benefactor.Status, + }) + } + + return param.GetAllBenefactorResponse{Data: benefactorInfo, Pagination: paginationparam.PaginationResponse{ + PageSize: req.Pagination.PageSize, + PageNumber: req.Pagination.PageNumber, + Total: total, + }}, nil +} diff --git a/service/admin/benefactor/service.go b/service/admin/benefactor/service.go index feb23d14..19a03121 100644 --- a/service/admin/benefactor/service.go +++ b/service/admin/benefactor/service.go @@ -2,11 +2,15 @@ package adminbenefactorservice import ( "context" + "git.gocasts.ir/ebhomengo/niki/param" "git.gocasts.ir/ebhomengo/niki/entity" adminaddressparam "git.gocasts.ir/ebhomengo/niki/param/admin/address" ) +type BenefactorSvc interface { + GetAllBenefactors(ctx context.Context, filter param.FilterRequest, pagination param.PaginationRequest, sort param.SortRequest) ([]entity.Benefactor, uint, error) +} type Repository interface { IsExistBenefactorByID(ctx context.Context, id uint) (bool, error) GetByID(ctx context.Context, id uint) (entity.Benefactor, error) @@ -16,10 +20,11 @@ type AddressSvc interface { } type Service struct { - repo Repository - AddressSvc AddressSvc + repo Repository + addressSvc AddressSvc + benefactorSvc BenefactorSvc } -func New(repo Repository, addressSvc AddressSvc) Service { - return Service{repo: repo, AddressSvc: addressSvc} +func New(repo Repository, addressSvc AddressSvc, benefactorSvc BenefactorSvc) Service { + return Service{repo: repo, addressSvc: addressSvc, benefactorSvc: benefactorSvc} } diff --git a/validator/admin/benefactor/get_all.go b/validator/admin/benefactor/get_all.go new file mode 100644 index 00000000..19c20519 --- /dev/null +++ b/validator/admin/benefactor/get_all.go @@ -0,0 +1 @@ +package benefactor diff --git a/validator/admin/benefactor/validator.go b/validator/admin/benefactor/validator.go new file mode 100644 index 00000000..19c20519 --- /dev/null +++ b/validator/admin/benefactor/validator.go @@ -0,0 +1 @@ +package benefactor