250 lines
6.5 KiB
Go
250 lines
6.5 KiB
Go
package router
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"voltaserve/errorpkg"
|
|
"voltaserve/service"
|
|
|
|
"github.com/go-playground/validator/v10"
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type GroupRouter struct {
|
|
groupSvc *service.GroupService
|
|
}
|
|
|
|
func NewGroupRouter() *GroupRouter {
|
|
return &GroupRouter{
|
|
groupSvc: service.NewGroupService(),
|
|
}
|
|
}
|
|
|
|
func (r *GroupRouter) AppendRoutes(g fiber.Router) {
|
|
g.Get("/", r.List)
|
|
g.Post("/", r.Create)
|
|
g.Get("/:id", r.GetByID)
|
|
g.Delete("/:id", r.Delete)
|
|
g.Post("/:id/update_name", r.UpdateName)
|
|
g.Post("/:id/add_member", r.AddMember)
|
|
g.Post("/:id/remove_member", r.RemoveMember)
|
|
}
|
|
|
|
// Create godoc
|
|
//
|
|
// @Summary Create
|
|
// @Description Create
|
|
// @Tags Groups
|
|
// @Id groups_create
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param body body service.GroupCreateOptions true "Body"
|
|
// @Success 200 {object} service.Group
|
|
// @Failure 400 {object} errorpkg.ErrorResponse
|
|
// @Failure 500 {object} errorpkg.ErrorResponse
|
|
// @Router /groups [post]
|
|
func (r *GroupRouter) Create(c *fiber.Ctx) error {
|
|
userID := GetUserID(c)
|
|
req := new(service.GroupCreateOptions)
|
|
if err := c.BodyParser(req); err != nil {
|
|
return err
|
|
}
|
|
if err := validator.New().Struct(req); err != nil {
|
|
return errorpkg.NewRequestBodyValidationError(err)
|
|
}
|
|
res, err := r.groupSvc.Create(*req, userID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return c.Status(http.StatusCreated).JSON(res)
|
|
}
|
|
|
|
// GetByID godoc
|
|
//
|
|
// @Summary Get by ID
|
|
// @Description Get by ID
|
|
// @Tags Groups
|
|
// @Id groups_get_by_id
|
|
// @Produce json
|
|
// @Param id path string true "ID"
|
|
// @Success 200 {object} service.Group
|
|
// @Failure 404 {object} errorpkg.ErrorResponse
|
|
// @Failure 500 {object} errorpkg.ErrorResponse
|
|
// @Router /groups/{id} [get]
|
|
func (r *GroupRouter) GetByID(c *fiber.Ctx) error {
|
|
userID := GetUserID(c)
|
|
res, err := r.groupSvc.Find(c.Params("id"), userID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return c.JSON(res)
|
|
}
|
|
|
|
// List godoc
|
|
//
|
|
// @Summary List
|
|
// @Description List
|
|
// @Tags Groups
|
|
// @Id groups_list
|
|
// @Produce json
|
|
// @Param query query string false "Query"
|
|
// @Param organization_id query string false "Organization ID"
|
|
// @Param page query string false "Page"
|
|
// @Param size query string false "Size"
|
|
// @Param sort_by query string false "Sort By"
|
|
// @Param sort_order query string false "Sort Order"
|
|
// @Success 200 {object} service.GroupList
|
|
// @Failure 404 {object} errorpkg.ErrorResponse
|
|
// @Failure 500 {object} errorpkg.ErrorResponse
|
|
// @Router /groups [get]
|
|
func (r *GroupRouter) List(c *fiber.Ctx) error {
|
|
var err error
|
|
var page int64
|
|
if c.Query("page") == "" {
|
|
page = 1
|
|
} else {
|
|
page, err = strconv.ParseInt(c.Query("page"), 10, 32)
|
|
if err != nil {
|
|
page = 1
|
|
}
|
|
}
|
|
var size int64
|
|
if c.Query("size") == "" {
|
|
size = GroupDefaultPageSize
|
|
} else {
|
|
size, err = strconv.ParseInt(c.Query("size"), 10, 32)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
sortBy := c.Query("sort_by")
|
|
if !IsValidSortBy(sortBy) {
|
|
return errorpkg.NewInvalidQueryParamError("sort_by")
|
|
}
|
|
sortOrder := c.Query("sort_order")
|
|
if !IsValidSortOrder(sortOrder) {
|
|
return errorpkg.NewInvalidQueryParamError("sort_order")
|
|
}
|
|
res, err := r.groupSvc.List(service.GroupListOptions{
|
|
Query: c.Query("query"),
|
|
OrganizationID: c.Query("organization_id"),
|
|
Page: uint(page),
|
|
Size: uint(size),
|
|
SortBy: sortBy,
|
|
SortOrder: sortOrder,
|
|
}, GetUserID(c))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return c.JSON(res)
|
|
}
|
|
|
|
// UpdateName godoc
|
|
//
|
|
// @Summary Update name
|
|
// @Description Update name
|
|
// @Tags Groups
|
|
// @Id groups_update_name
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "ID"
|
|
// @Param body body service.GroupUpdateNameOptions true "Body"
|
|
// @Success 200 {object} service.Group
|
|
// @Failure 404 {object} errorpkg.ErrorResponse
|
|
// @Failure 400 {object} errorpkg.ErrorResponse
|
|
// @Failure 500 {object} errorpkg.ErrorResponse
|
|
// @Router /groups/{id}/update_name [post]
|
|
func (r *GroupRouter) UpdateName(c *fiber.Ctx) error {
|
|
userID := GetUserID(c)
|
|
req := new(service.GroupUpdateNameOptions)
|
|
if err := c.BodyParser(req); err != nil {
|
|
return err
|
|
}
|
|
if err := validator.New().Struct(req); err != nil {
|
|
return errorpkg.NewRequestBodyValidationError(err)
|
|
}
|
|
res, err := r.groupSvc.UpdateName(c.Params("id"), req.Name, userID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return c.JSON(res)
|
|
}
|
|
|
|
// Delete godoc
|
|
//
|
|
// @Summary Delete
|
|
// @Description Delete
|
|
// @Tags Groups
|
|
// @Id groups_delete
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "ID"
|
|
// @Success 200
|
|
// @Failure 404 {object} errorpkg.ErrorResponse
|
|
// @Failure 500 {object} errorpkg.ErrorResponse
|
|
// @Router /groups/{id} [delete]
|
|
func (r *GroupRouter) Delete(c *fiber.Ctx) error {
|
|
userID := GetUserID(c)
|
|
if err := r.groupSvc.Delete(c.Params("id"), userID); err != nil {
|
|
return err
|
|
}
|
|
return c.SendStatus(http.StatusNoContent)
|
|
}
|
|
|
|
// AddMember godoc
|
|
//
|
|
// @Summary Add member
|
|
// @Description Add member
|
|
// @Tags Groups
|
|
// @Id groups_add_member
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "ID"
|
|
// @Failure 404 {object} errorpkg.ErrorResponse
|
|
// @Failure 400 {object} errorpkg.ErrorResponse
|
|
// @Failure 500 {object} errorpkg.ErrorResponse
|
|
// @Router /groups/{id}/add_member [post]
|
|
func (r *GroupRouter) AddMember(c *fiber.Ctx) error {
|
|
userID := GetUserID(c)
|
|
req := new(service.GroupAddMemberOptions)
|
|
if err := c.BodyParser(req); err != nil {
|
|
return err
|
|
}
|
|
if err := validator.New().Struct(req); err != nil {
|
|
return errorpkg.NewRequestBodyValidationError(err)
|
|
}
|
|
if err := r.groupSvc.AddMember(c.Params("id"), req.UserID, userID); err != nil {
|
|
return err
|
|
}
|
|
return c.SendStatus(http.StatusNoContent)
|
|
}
|
|
|
|
// RemoveMember godoc
|
|
//
|
|
// @Summary Remove member
|
|
// @Description Remove member
|
|
// @Tags Groups
|
|
// @Id groups_remove_member
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "ID"
|
|
// @Param body body service.GroupRemoveMemberOptions true "Body"
|
|
// @Failure 404 {object} errorpkg.ErrorResponse
|
|
// @Failure 400 {object} errorpkg.ErrorResponse
|
|
// @Failure 500 {object} errorpkg.ErrorResponse
|
|
// @Router /groups/{id}/remove_member [post]
|
|
func (r *GroupRouter) RemoveMember(c *fiber.Ctx) error {
|
|
userID := GetUserID(c)
|
|
req := new(service.GroupRemoveMemberOptions)
|
|
if err := c.BodyParser(req); err != nil {
|
|
return err
|
|
}
|
|
if err := validator.New().Struct(req); err != nil {
|
|
return errorpkg.NewRequestBodyValidationError(err)
|
|
}
|
|
if err := r.groupSvc.RemoveMember(c.Params("id"), req.UserID, userID); err != nil {
|
|
return err
|
|
}
|
|
return c.SendStatus(http.StatusNoContent)
|
|
}
|