251 lines
6.4 KiB
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, ¶ms); 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, ¶ms); 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",
|
|
})
|
|
}
|