lms-backend/routers/router/api/v1/organization/team.go

251 lines
6.4 KiB
Go

package organization
import (
"encoding/base64"
"git.ex.umbach.dev/Alex/roese-utils/rsutils"
"git.ex.umbach.dev/LMS/libcore/models"
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/rs/zerolog/log"
"golang.org/x/crypto/bcrypt"
"lms.de/backend/modules/database"
"lms.de/backend/modules/structs"
"lms.de/backend/modules/utils"
"lms.de/backend/socketclients"
)
func GetTeamMembers(c *fiber.Ctx) error {
// swagger:operation GET /organization/team/members organization getTeamMembers
// ---
// summary: Get team members
// consumes:
// - application/json
// produces:
// - application/json
// responses:
// '200':
// description: Team members fetched successfully
// schema:
// type: array
// items:
// "$ref": "#/definitions/TeamMember"
// '400':
// description: Invalid request body
// '500':
// description: Failed to fetch team members
var users []structs.TeamMember
if err := database.DB.Model(&models.User{}).
Where("organization_id = ?", c.Locals("organizationId")).
Find(&users).Error; err != nil {
return c.SendStatus(fiber.StatusInternalServerError)
}
for i, user := range users {
users[i].Online = socketclients.IsUserConnected(user.Id)
}
return c.JSON(users)
}
func CreateTeamMember(c *fiber.Ctx) error {
// swagger:operation POST /organization/team/members organization createTeamMember
// ---
// summary: Create team member
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/CreateTeamMemberRequest"
// responses:
// '200':
// description: Team member created successfully
// '400':
// description: Invalid request body
// '500':
// description: Failed to create team member
var body structs.CreateTeamMemberRequest
if err := rsutils.BodyParserHelper(c, &body); err != nil {
return c.SendStatus(fiber.StatusBadRequest)
}
user := models.User{
Id: uuid.New().String(),
FirstName: body.FirstName,
LastName: body.LastName,
Email: body.Email,
OrganizationId: c.Locals("organizationId").(string),
RoleId: body.RoleId,
}
decodedPassword, err := base64.StdEncoding.DecodeString(body.Password)
if err != nil {
log.Error().Msg("Failed to decode base64 password, err: " + err.Error())
return c.SendStatus(fiber.StatusBadRequest)
}
if passwordValid := utils.IsPasswordLengthValid(string(decodedPassword)); !passwordValid {
return c.SendStatus(fiber.StatusBadRequest)
}
// Hash password
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(body.Password), bcrypt.DefaultCost)
if err != nil {
log.Error().Msg("Failed to hash password, err: " + err.Error())
return c.SendStatus(fiber.StatusInternalServerError)
}
user.Password = string(hashedPassword)
// Create user
if err := database.DB.Create(&user).Error; err != nil {
return c.SendStatus(fiber.StatusInternalServerError)
}
socketclients.BroadcastMessageToTopicExceptBrowserTabSession(
c.Locals("organizationId").(string),
utils.SubscribedTopicTeam,
c.Locals("browserTabSession").(string),
structs.SendSocketMessage{
Cmd: utils.SendCmdTeamAddedMember,
Body: struct {
Id string
FirstName string
LastName string
Email string
RoleId string
}{
Id: user.Id,
FirstName: user.FirstName,
LastName: user.LastName,
Email: user.Email,
RoleId: user.RoleId,
},
},
)
return c.JSON(fiber.Map{
"message": "Team member created successfully",
})
}
func UpdateTeamMemberRole(c *fiber.Ctx) error {
// swagger:operation PATCH /organization/team/members/{memberId}/role organization updateTeamMemberRole
// ---
// summary: Update team member role
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/UpdateTeamMemberRoleRequest"
// responses:
// '200':
// description: Team member role updated successfully
// '400':
// description: Invalid request body
// '500':
// description: Failed to update team member role
var params structs.TeamMemberUserIdParam
if err := rsutils.ParamsParserHelper(c, &params); err != nil {
return c.SendStatus(fiber.StatusBadRequest)
}
var body structs.UpdateTeamMemberRoleRequest
if err := rsutils.BodyParserHelper(c, &body); err != nil {
return c.SendStatus(fiber.StatusBadRequest)
}
if params.MemberId == c.Locals("userId").(string) {
return c.SendStatus(fiber.StatusBadRequest)
}
if err := database.DB.Model(&models.User{}).
Where("id = ? AND organization_id = ?", params.MemberId, c.Locals("organizationId").(string)).
Update("role_id", body.RoleId).Error; err != nil {
return c.SendStatus(fiber.StatusInternalServerError)
}
socketclients.BroadcastMessageToTopic(
c.Locals("organizationId").(string),
utils.SubscribedTopicTeam,
structs.SendSocketMessage{
Cmd: utils.SendCmdTeamUpdatedMemberRole,
Body: struct {
MemberId string
RoleId string
}{
MemberId: params.MemberId,
RoleId: body.RoleId,
},
},
)
return c.JSON(fiber.Map{
"message": "Team member role updated successfully",
})
}
func DeleteTeamMember(c *fiber.Ctx) error {
// swagger:operation DELETE /organization/team/members/{memberId} organization deleteTeamMember
// ---
// summary: Delete team member
// consumes:
// - application/json
// produces:
// - application/json
// responses:
// '200':
// description: Team member deleted successfully
// '400':
// description: Invalid request body
// '500':
// description: Failed to delete team member
var params structs.TeamMemberUserIdParam
if err := rsutils.ParamsParserHelper(c, &params); err != nil {
return c.SendStatus(fiber.StatusBadRequest)
}
if params.MemberId == c.Locals("userId").(string) {
return c.SendStatus(fiber.StatusBadRequest)
}
if err := database.DB.Where("id = ?", params.MemberId).
Where("organization_id = ?", c.Locals("organizationId").(string)).
Delete(&models.User{}).Error; err != nil {
return c.SendStatus(fiber.StatusInternalServerError)
}
socketclients.BroadcastMessageToTopic(
c.Locals("organizationId").(string),
utils.SubscribedTopicTeam,
structs.SendSocketMessage{
Cmd: utils.SendCmdTeamDeletedMember,
Body: params.MemberId,
},
)
return c.JSON(fiber.Map{
"message": "Team member deleted successfully",
})
}