mirror of
https://github.com/khairul169/vaulterm.git
synced 2026-09-15 17:03:30 +07:00
feat: add team member role change & removal, add uptime server stats, etc
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
package members
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"rul.sh/vaulterm/db"
|
||||
"rul.sh/vaulterm/models"
|
||||
"rul.sh/vaulterm/utils"
|
||||
)
|
||||
|
||||
type TeamMembers struct {
|
||||
db *gorm.DB
|
||||
User *utils.UserContext
|
||||
}
|
||||
|
||||
func NewRepository(r *TeamMembers) *TeamMembers {
|
||||
if r == nil {
|
||||
r = &TeamMembers{}
|
||||
}
|
||||
r.db = db.Get()
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *TeamMembers) Add(data *models.TeamMembers) error {
|
||||
ret := r.db.Clauses(clause.OnConflict{DoNothing: true}).Create(data)
|
||||
return ret.Error
|
||||
}
|
||||
|
||||
func (r *TeamMembers) SetRole(data *models.TeamMembers) error {
|
||||
ret := r.db.
|
||||
Where("team_id = ? AND user_id = ?", data.TeamID, data.UserID).
|
||||
Updates(&models.TeamMembers{Role: data.Role})
|
||||
return ret.Error
|
||||
}
|
||||
|
||||
func (r *TeamMembers) Remove(data *models.TeamMembers) error {
|
||||
ret := r.db.Delete(&models.TeamMembers{TeamID: data.TeamID, UserID: data.UserID})
|
||||
return ret.Error
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
package members
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"rul.sh/vaulterm/app/teams"
|
||||
"rul.sh/vaulterm/app/users"
|
||||
"rul.sh/vaulterm/models"
|
||||
"rul.sh/vaulterm/utils"
|
||||
)
|
||||
|
||||
func Router(app fiber.Router) {
|
||||
router := app.Group("/:id/members")
|
||||
|
||||
// router.Get("/", getAll)
|
||||
router.Post("/", invite)
|
||||
router.Put("/:userId/role", setRole)
|
||||
router.Delete("/:userId", remove)
|
||||
}
|
||||
|
||||
// func getAll(c *fiber.Ctx) error {
|
||||
// user := utils.GetUser(c)
|
||||
// repo := NewRepository(&TeamMembers{User: user})
|
||||
|
||||
// rows, err := repo.GetAll()
|
||||
// if err != nil {
|
||||
// return utils.ResponseError(c, err, 500)
|
||||
// }
|
||||
|
||||
// return c.JSON(fiber.Map{"rows": rows})
|
||||
// }
|
||||
|
||||
func invite(c *fiber.Ctx) error {
|
||||
var body InviteSchema
|
||||
if err := c.BodyParser(&body); err != nil {
|
||||
return utils.ResponseError(c, err, 500)
|
||||
}
|
||||
|
||||
user := utils.GetUser(c)
|
||||
teamRepo := teams.NewRepository(&teams.Teams{User: user})
|
||||
repo := NewRepository(&TeamMembers{User: user})
|
||||
|
||||
id := c.Params("id")
|
||||
exist, _ := teamRepo.Exists(id)
|
||||
if !exist {
|
||||
return utils.ResponseError(c, errors.New("team not found"), 404)
|
||||
}
|
||||
if !user.TeamCanWrite(&id) {
|
||||
return utils.ResponseError(c, errors.New("no access"), 403)
|
||||
}
|
||||
|
||||
userRepo := users.NewRepository(&users.Users{User: user})
|
||||
userData, _ := userRepo.Find(body.Username)
|
||||
if userData.ID == "" {
|
||||
return utils.ResponseError(c, errors.New("user not found"), 404)
|
||||
}
|
||||
|
||||
err := repo.Add(&models.TeamMembers{TeamID: id, UserID: userData.ID, Role: body.Role})
|
||||
if err != nil {
|
||||
return utils.ResponseError(c, err, 500)
|
||||
}
|
||||
|
||||
return c.JSON(true)
|
||||
}
|
||||
|
||||
func setRole(c *fiber.Ctx) error {
|
||||
var body PutRoleSchema
|
||||
if err := c.BodyParser(&body); err != nil {
|
||||
return utils.ResponseError(c, err, 500)
|
||||
}
|
||||
|
||||
user := utils.GetUser(c)
|
||||
teamRepo := teams.NewRepository(&teams.Teams{User: user})
|
||||
repo := NewRepository(&TeamMembers{User: user})
|
||||
|
||||
id := c.Params("id")
|
||||
userId := c.Params("userId")
|
||||
|
||||
exist, _ := teamRepo.Exists(id)
|
||||
if !exist {
|
||||
return utils.ResponseError(c, errors.New("team not found"), 404)
|
||||
}
|
||||
if !user.TeamCanWrite(&id) {
|
||||
return utils.ResponseError(c, errors.New("no access"), 403)
|
||||
}
|
||||
|
||||
userRepo := users.NewRepository(nil)
|
||||
userData, _ := userRepo.Get(userId)
|
||||
if userData == nil || userData.ID == "" {
|
||||
return utils.ResponseError(c, errors.New("user not found"), 404)
|
||||
}
|
||||
if !userData.IsInTeam(&id) {
|
||||
return utils.ResponseError(c, errors.New("user not in team"), 400)
|
||||
}
|
||||
|
||||
err := repo.SetRole(&models.TeamMembers{TeamID: id, UserID: userData.ID, Role: body.Role})
|
||||
if err != nil {
|
||||
return utils.ResponseError(c, err, 500)
|
||||
}
|
||||
|
||||
return c.JSON(true)
|
||||
}
|
||||
|
||||
func remove(c *fiber.Ctx) error {
|
||||
user := utils.GetUser(c)
|
||||
teamRepo := teams.NewRepository(&teams.Teams{User: user})
|
||||
repo := NewRepository(&TeamMembers{User: user})
|
||||
|
||||
id := c.Params("id")
|
||||
userId := c.Params("userId")
|
||||
|
||||
exist, _ := teamRepo.Exists(id)
|
||||
if !exist {
|
||||
return utils.ResponseError(c, errors.New("team not found"), 404)
|
||||
}
|
||||
if !user.TeamCanWrite(&id) {
|
||||
return utils.ResponseError(c, errors.New("no access"), 403)
|
||||
}
|
||||
|
||||
userRepo := users.NewRepository(&users.Users{User: user})
|
||||
userData, _ := userRepo.Get(userId)
|
||||
if userData.ID == "" {
|
||||
return utils.ResponseError(c, errors.New("user not found"), 404)
|
||||
}
|
||||
userRole := userData.GetTeamRole(&id)
|
||||
if userRole == "" {
|
||||
return utils.ResponseError(c, errors.New("user not in team"), 400)
|
||||
}
|
||||
if userRole == models.TeamRoleOwner {
|
||||
return utils.ResponseError(c, errors.New("cannot remove owner"), 400)
|
||||
}
|
||||
|
||||
err := repo.Remove(&models.TeamMembers{TeamID: id, UserID: userData.ID})
|
||||
if err != nil {
|
||||
return utils.ResponseError(c, err, 500)
|
||||
}
|
||||
|
||||
return c.JSON(true)
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package members
|
||||
|
||||
type InviteSchema struct {
|
||||
Username string `json:"username"`
|
||||
Role string `json:"role"`
|
||||
}
|
||||
|
||||
type PutRoleSchema struct {
|
||||
UserID string `json:"username"`
|
||||
Role string `json:"role"`
|
||||
}
|
||||
Reference in New Issue
Block a user