nquest/pkg/controller/team.go

212 lines
6 KiB
Go
Raw Normal View History

2023-11-01 23:21:12 +03:00
package controller
import (
"net/http"
"github.com/labstack/echo/v4"
"gitrepo.ru/neonxp/nquest/api"
"gitrepo.ru/neonxp/nquest/pkg/contextlib"
"gitrepo.ru/neonxp/nquest/pkg/models"
2023-11-01 23:21:12 +03:00
"gitrepo.ru/neonxp/nquest/pkg/service"
)
type Team struct {
UserService *service.User
TeamService *service.Team
}
func (t *Team) GetTeams(ctx echo.Context) error {
currentTeamID := uint(0)
user := contextlib.GetUser(ctx)
if user.Team != nil {
currentTeamID = user.Team.TeamID
}
teams, err := t.TeamService.List(ctx.Request().Context())
if err != nil {
return err
}
resp := make([]api.TeamView, 0, len(teams))
2023-11-01 23:21:12 +03:00
for _, t := range teams {
memberCount := len(t.Members)
isCurrentTeam := currentTeamID == t.ID
resp = append(resp, api.TeamView{
2023-11-01 23:21:12 +03:00
Id: int(t.ID),
Members: &memberCount,
2023-11-01 23:21:12 +03:00
Name: t.Name,
CurrentTeam: &isCurrentTeam,
2023-11-01 23:21:12 +03:00
CreatedAt: t.CreatedAt.Format("02.01.06"),
})
}
return ctx.JSON(http.StatusOK, api.TeamsListResponse(resp))
}
func (t *Team) GetTeamsTeamID(ctx echo.Context, teamID int) error {
return t.getTeamResponse(ctx, teamID)
}
func (t *Team) PostTeamsTeamIDMembers(ctx echo.Context, teamID int) error {
user := contextlib.GetUser(ctx)
if user.Team == nil || user.Team.TeamID != uint(teamID) || user.Team.Role != models.Captain {
return ctx.JSON(http.StatusForbidden, api.ErrorResponse{
Code: http.StatusForbidden,
Message: "Вам нельзя менять состав команды",
2023-11-01 23:21:12 +03:00
})
}
req := &api.PostTeamsTeamIDMembersJSONRequestBody{}
if err := ctx.Bind(req); err != nil {
return ctx.JSON(http.StatusBadRequest, api.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
}
if err := t.TeamService.UpdateMembers(ctx.Request().Context(), uint(teamID), req.Members); err != nil {
return ctx.JSON(http.StatusBadRequest, api.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
}
2023-11-01 23:21:12 +03:00
return t.getTeamResponse(ctx, teamID)
}
2023-11-02 23:38:50 +03:00
func (t *Team) PostTeams(ctx echo.Context) error {
req := &api.PostTeamsJSONRequestBody{}
if err := ctx.Bind(req); err != nil {
return err
}
user := contextlib.GetUser(ctx)
team, err := t.TeamService.Create(ctx.Request().Context(), req.Name, user)
if err != nil {
return err
}
return ctx.JSON(http.StatusCreated, api.TeamView{
Id: int(team.ID),
Name: team.Name,
CreatedAt: team.CreatedAt.Format("02.01.06"),
})
}
func (t *Team) DeleteTeamsTeamID(ctx echo.Context, teamID int) error {
user := contextlib.GetUser(ctx)
if user.Team == nil || user.Team.TeamID != uint(teamID) || user.Team.Role != models.Captain {
return ctx.JSON(http.StatusForbidden, api.ErrorResponse{
Code: http.StatusForbidden,
Message: "Нельзя удалить не свою команду",
})
}
if err := t.TeamService.Delete(ctx.Request().Context(), uint(teamID)); err != nil {
return ctx.JSON(http.StatusForbidden, api.ErrorResponse{
Code: http.StatusForbidden,
Message: err.Error(),
})
}
return ctx.NoContent(http.StatusNoContent)
}
2023-11-01 23:21:12 +03:00
func (t *Team) getTeamResponse(ctx echo.Context, teamID int) error {
team, err := t.TeamService.GetByID(ctx.Request().Context(), uint(teamID))
if err != nil {
return ctx.JSON(http.StatusNotFound, api.ErrorResponse{
Code: http.StatusNotFound,
Message: err.Error(),
})
}
members := make([]api.TeamMember, 0, len(team.Members))
for _, tm := range team.Members {
members = append(members, api.TeamMember{
Role: api.MapTeamRole[tm.Role],
2023-11-01 23:21:12 +03:00
User: api.UserView{
Id: int(tm.User.ID),
Username: tm.User.Username,
},
CreatedAt: tm.CreatedAt.Format("02.01.06"),
})
}
requests := make([]api.TeamRequest, 0, len(team.Requests))
for _, tm := range team.Requests {
requests = append(requests, api.TeamRequest{
User: api.UserView{
Id: int(tm.User.ID),
Username: tm.User.Username,
},
CreatedAt: tm.CreatedAt.Format("02.01.06"),
})
}
return ctx.JSON(http.StatusOK, api.TeamResponse(api.TeamResponse{
Id: teamID,
Name: team.Name,
Members: members,
Requests: requests,
CreatedAt: team.CreatedAt.Format("02.01.06"),
}))
}
// (POST /teams/{teamID}/requests)
func (t *Team) PostTeamsTeamIDRequests(ctx echo.Context, teamID int) error {
user := contextlib.GetUser(ctx)
if user.Team != nil {
return ctx.JSON(http.StatusForbidden, api.ErrorResponse{
Code: http.StatusForbidden,
Message: "Вы уже в другой команде",
})
}
if err := t.TeamService.Request(ctx.Request().Context(), uint(teamID), user); err != nil {
return ctx.JSON(http.StatusBadRequest, api.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
}
return t.getTeamResponse(ctx, teamID)
}
// (POST /teams/{teamID}/requests/{userID})
func (t *Team) PostTeamsTeamIDRequestsUserID(ctx echo.Context, teamID int, userID int) error {
user := contextlib.GetUser(ctx)
if user.Team == nil || user.Team.TeamID != uint(teamID) || user.Team.Role != models.Captain {
return ctx.JSON(http.StatusForbidden, api.ErrorResponse{
Code: http.StatusForbidden,
Message: "Вам нельзя менять состав команды",
})
}
req := &api.PostTeamsTeamIDRequestsUserIDJSONRequestBody{}
if err := ctx.Bind(req); err != nil {
return ctx.JSON(http.StatusBadRequest, api.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
}
if err := t.TeamService.ApproveRequest(ctx.Request().Context(), teamID, uint(userID), req.Approve); err != nil {
return ctx.JSON(http.StatusBadRequest, api.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
}
return t.getTeamResponse(ctx, teamID)
}
// (DELETE /teams/{teamID}/members)
func (t *Team) DeleteTeamsTeamIDMembers(ctx echo.Context, teamID int) error {
user := contextlib.GetUser(ctx)
if err := t.TeamService.DeleteMember(ctx.Request().Context(), teamID, user.ID); err != nil {
return ctx.JSON(http.StatusBadRequest, api.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
}
return t.getTeamResponse(ctx, teamID)
}