forked from ebhomengo/niki
				
			Merge pull request 'feat(niki): add get all agents by admin' (#58) from stage/erfan/103-admin-get-all-agent into develop
Reviewed-on: ebhomengo/niki#58
This commit is contained in:
		
						commit
						ec81297f98
					
				| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
package adminhandler
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg"
 | 
			
		||||
	"github.com/labstack/echo/v4"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GetAllAgent godoc
 | 
			
		||||
// @Summary 	 Get all agents by admin
 | 
			
		||||
// @Tags         Admin
 | 
			
		||||
// @Accept       json
 | 
			
		||||
// @Produce      json
 | 
			
		||||
// @Success      200  {object}  adminserviceparam.GetAllAgentResponse
 | 
			
		||||
// @Failure      400  {string}  "Bad request"
 | 
			
		||||
// @Security 	 AuthBearerAdmin
 | 
			
		||||
// @Router       /admins/agents [get]
 | 
			
		||||
func (h Handler) GetAllAgent(c echo.Context) error {
 | 
			
		||||
	resp, sErr := h.adminSvc.GetAllAgent(c.Request().Context())
 | 
			
		||||
	if sErr != nil {
 | 
			
		||||
		msg, code := httpmsg.Error(sErr)
 | 
			
		||||
 | 
			
		||||
		return echo.NewHTTPError(code, msg)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -15,4 +15,5 @@ func (h Handler) SetRoutes(e *echo.Echo) {
 | 
			
		|||
	r.POST("/login-by-phone", h.LoginByPhoneNumber)
 | 
			
		||||
	//nolint:gocritic
 | 
			
		||||
	//r.PATCH("/:id", h.Update).Name = "admin-updatekindboxreq"
 | 
			
		||||
	r.GET("/agents", h.GetAllAgent, middleware.Auth(h.authSvc, h.authConfig), middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminAdminGetAllAgentPermission))
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										65
									
								
								docs/docs.go
								
								
								
								
							
							
						
						
									
										65
									
								
								docs/docs.go
								
								
								
								
							| 
						 | 
				
			
			@ -463,6 +463,39 @@ const docTemplate = `{
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/admins/agents": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "AuthBearerAdmin": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "Admin"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "Get all agents by admin",
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/adminserviceparam.GetAllAgentResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    "400": {
 | 
			
		||||
                        "description": "Bad request",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "type": "string"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/admins/login-by-phone": {
 | 
			
		||||
            "post": {
 | 
			
		||||
                "consumes": [
 | 
			
		||||
| 
						 | 
				
			
			@ -1075,6 +1108,38 @@ const docTemplate = `{
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "adminserviceparam.Agent": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "first_name": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "John"
 | 
			
		||||
                },
 | 
			
		||||
                "id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1
 | 
			
		||||
                },
 | 
			
		||||
                "last_name": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "Doe"
 | 
			
		||||
                },
 | 
			
		||||
                "phone_number": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "09123456789"
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "adminserviceparam.GetAllAgentResponse": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "agents": {
 | 
			
		||||
                    "type": "array",
 | 
			
		||||
                    "items": {
 | 
			
		||||
                        "$ref": "#/definitions/adminserviceparam.Agent"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "adminserviceparam.LoginWithPhoneNumberRequest": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -452,6 +452,39 @@
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/admins/agents": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "AuthBearerAdmin": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "Admin"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "Get all agents by admin",
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/adminserviceparam.GetAllAgentResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    "400": {
 | 
			
		||||
                        "description": "Bad request",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "type": "string"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/admins/login-by-phone": {
 | 
			
		||||
            "post": {
 | 
			
		||||
                "consumes": [
 | 
			
		||||
| 
						 | 
				
			
			@ -1064,6 +1097,38 @@
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "adminserviceparam.Agent": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "first_name": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "John"
 | 
			
		||||
                },
 | 
			
		||||
                "id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1
 | 
			
		||||
                },
 | 
			
		||||
                "last_name": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "Doe"
 | 
			
		||||
                },
 | 
			
		||||
                "phone_number": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "09123456789"
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "adminserviceparam.GetAllAgentResponse": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "agents": {
 | 
			
		||||
                    "type": "array",
 | 
			
		||||
                    "items": {
 | 
			
		||||
                        "$ref": "#/definitions/adminserviceparam.Agent"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "adminserviceparam.LoginWithPhoneNumberRequest": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,6 +157,28 @@ definitions:
 | 
			
		|||
        - $ref: '#/definitions/entity.AdminStatus'
 | 
			
		||||
        example: 1
 | 
			
		||||
    type: object
 | 
			
		||||
  adminserviceparam.Agent:
 | 
			
		||||
    properties:
 | 
			
		||||
      first_name:
 | 
			
		||||
        example: John
 | 
			
		||||
        type: string
 | 
			
		||||
      id:
 | 
			
		||||
        example: 1
 | 
			
		||||
        type: integer
 | 
			
		||||
      last_name:
 | 
			
		||||
        example: Doe
 | 
			
		||||
        type: string
 | 
			
		||||
      phone_number:
 | 
			
		||||
        example: "09123456789"
 | 
			
		||||
        type: string
 | 
			
		||||
    type: object
 | 
			
		||||
  adminserviceparam.GetAllAgentResponse:
 | 
			
		||||
    properties:
 | 
			
		||||
      agents:
 | 
			
		||||
        items:
 | 
			
		||||
          $ref: '#/definitions/adminserviceparam.Agent'
 | 
			
		||||
        type: array
 | 
			
		||||
    type: object
 | 
			
		||||
  adminserviceparam.LoginWithPhoneNumberRequest:
 | 
			
		||||
    properties:
 | 
			
		||||
      password:
 | 
			
		||||
| 
						 | 
				
			
			@ -785,6 +807,26 @@ paths:
 | 
			
		|||
      summary: Reject a kindboxreq by admin
 | 
			
		||||
      tags:
 | 
			
		||||
      - KindBoxReq
 | 
			
		||||
  /admins/agents:
 | 
			
		||||
    get:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
      produces:
 | 
			
		||||
      - application/json
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: OK
 | 
			
		||||
          schema:
 | 
			
		||||
            $ref: '#/definitions/adminserviceparam.GetAllAgentResponse'
 | 
			
		||||
        "400":
 | 
			
		||||
          description: Bad request
 | 
			
		||||
          schema:
 | 
			
		||||
            type: string
 | 
			
		||||
      security:
 | 
			
		||||
      - AuthBearerAdmin: []
 | 
			
		||||
      summary: Get all agents by admin
 | 
			
		||||
      tags:
 | 
			
		||||
      - Admin
 | 
			
		||||
  /admins/login-by-phone:
 | 
			
		||||
    post:
 | 
			
		||||
      consumes:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,4 +9,5 @@ const (
 | 
			
		|||
	AdminKindBoxReqGetAllPermission            = AdminPermission("kindboxreq-getall")
 | 
			
		||||
	AdminKindBoxReqDeliverPermission           = AdminPermission("kindboxreq-deliver")
 | 
			
		||||
	AdminKindBoxReqAssignSenderAgentPermission = AdminPermission("kindboxreq-assign_sender_agent")
 | 
			
		||||
	AdminAdminGetAllAgentPermission            = AdminPermission("admin-getall_agent")
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
package adminserviceparam
 | 
			
		||||
 | 
			
		||||
type GetAllAgentResponse struct {
 | 
			
		||||
	Agents []Agent `json:"agents"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Agent struct {
 | 
			
		||||
	ID          uint   `json:"id" example:"1"`
 | 
			
		||||
	FirstName   string `json:"first_name" example:"John"`
 | 
			
		||||
	LastName    string `json:"last_name" example:"Doe"`
 | 
			
		||||
	PhoneNumber string `json:"phone_number" example:"09123456789"`
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
package mysqladmin
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/entity"
 | 
			
		||||
 | 
			
		||||
	errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
 | 
			
		||||
	richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (d DB) GetAllAgent(ctx context.Context) ([]entity.Admin, error) {
 | 
			
		||||
	const op = "mysqladmin.GetAllAgent"
 | 
			
		||||
 | 
			
		||||
	agents := make([]entity.Admin, 0)
 | 
			
		||||
	query := `SELECT id, first_name, last_name, phone_number FROM admins WHERE role = 'agent' AND status = 'active'`
 | 
			
		||||
	rows, err := d.conn.Conn().QueryContext(ctx, query)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 | 
			
		||||
		return nil, richerror.New(op).WithErr(err).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected)
 | 
			
		||||
	}
 | 
			
		||||
	defer rows.Close()
 | 
			
		||||
 | 
			
		||||
	for rows.Next() {
 | 
			
		||||
		var agent entity.Admin
 | 
			
		||||
		sErr := rows.Scan(&agent.ID, &agent.FirstName, &agent.LastName, &agent.PhoneNumber)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
 | 
			
		||||
			return nil, richerror.New(op).WithErr(sErr).
 | 
			
		||||
				WithMessage(errmsg.ErrorMsgCantScanQueryResult).WithKind(richerror.KindUnexpected)
 | 
			
		||||
		}
 | 
			
		||||
		agents = append(agents, agent)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if rErr := rows.Err(); rErr != nil {
 | 
			
		||||
 | 
			
		||||
		return nil, richerror.New(op).WithErr(rErr).
 | 
			
		||||
			WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return agents, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -6,7 +6,8 @@ ALTER TABLE `admin_access_controls` MODIFY COLUMN `permission`
 | 
			
		|||
        'kindboxreq-reject',
 | 
			
		||||
        'kindboxreq-getall',
 | 
			
		||||
        'kindboxreq-deliver',
 | 
			
		||||
        'kindboxreq-assign_sender_agent'
 | 
			
		||||
        'kindboxreq-assign_sender_agent',
 | 
			
		||||
        'admin-getall_agent'
 | 
			
		||||
    ) NOT NULL;
 | 
			
		||||
    
 | 
			
		||||
-- +migrate Down
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +11,9 @@ INSERT INTO `admin_access_controls` (`id`, `actor_id`, `actor_type`,`permission`
 | 
			
		|||
        (9, 2 , 'role','kindboxreq-reject'),
 | 
			
		||||
        (10, 2 , 'role','kindboxreq-getall'),
 | 
			
		||||
        (11, 2 , 'role','kindboxreq-deliver'),
 | 
			
		||||
        (12, 2 , 'role','kindboxreq-assign_sender_agent');
 | 
			
		||||
        (12, 2 , 'role','kindboxreq-assign_sender_agent'),
 | 
			
		||||
        (13, 1, 'role', 'admin-getall_agent'),
 | 
			
		||||
        (13, 2, 'role', 'admin-getall_agent');
 | 
			
		||||
 | 
			
		||||
-- +migrate Down
 | 
			
		||||
DELETE
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
package adminservice
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	param "git.gocasts.ir/ebhomengo/niki/param/admin/admin"
 | 
			
		||||
	richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (s Service) GetAllAgent(ctx context.Context) (param.GetAllAgentResponse, error) {
 | 
			
		||||
	const op = "adminservice.GetAllAgent"
 | 
			
		||||
 | 
			
		||||
	agentsInfo := make([]param.Agent, 0)
 | 
			
		||||
 | 
			
		||||
	agents, err := s.repo.GetAllAgent(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 | 
			
		||||
		return param.GetAllAgentResponse{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, agent := range agents {
 | 
			
		||||
		agentsInfo = append(agentsInfo, param.Agent{
 | 
			
		||||
			ID:          agent.ID,
 | 
			
		||||
			FirstName:   agent.FirstName,
 | 
			
		||||
			LastName:    agent.LastName,
 | 
			
		||||
			PhoneNumber: agent.PhoneNumber,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return param.GetAllAgentResponse{Agents: agentsInfo}, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,7 @@ type Repository interface {
 | 
			
		|||
	AddAdmin(ctx context.Context, admin entity.Admin) (entity.Admin, error)
 | 
			
		||||
	GetAdminByPhoneNumber(ctx context.Context, phoneNumber string) (entity.Admin, error)
 | 
			
		||||
	GetAdminByID(ctx context.Context, adminID uint) (entity.Admin, error)
 | 
			
		||||
	GetAllAgent(ctx context.Context) ([]entity.Admin, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Service struct {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue