roles and team
parent
1232a909c1
commit
4948c72882
|
@ -23,6 +23,7 @@ type TeamMember struct {
|
||||||
Email string
|
Email string
|
||||||
RoleId string
|
RoleId string
|
||||||
ProfilePictureUrl string
|
ProfilePictureUrl string
|
||||||
|
Online bool `gorm:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type CreateTeamMemberRequest struct {
|
type CreateTeamMemberRequest struct {
|
||||||
|
@ -32,3 +33,11 @@ type CreateTeamMemberRequest struct {
|
||||||
RoleId string
|
RoleId string
|
||||||
Password string
|
Password string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TeamMemberUserIdParam struct {
|
||||||
|
MemberId string
|
||||||
|
}
|
||||||
|
|
||||||
|
type UpdateTeamMemberRoleRequest struct {
|
||||||
|
RoleId string
|
||||||
|
}
|
||||||
|
|
|
@ -20,6 +20,9 @@ const (
|
||||||
|
|
||||||
MaxImageSize = 25 * 1024 * 1024 // 25MB
|
MaxImageSize = 25 * 1024 * 1024 // 25MB
|
||||||
MaxVideoSize = 50 * 1024 * 1024 // 50MB
|
MaxVideoSize = 50 * 1024 * 1024 // 50MB
|
||||||
|
|
||||||
|
ConnectionStateOffline = 0
|
||||||
|
ConnectionStateOnline = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -82,6 +85,8 @@ const (
|
||||||
SendCmdSettingsUpdatedBanner = 3
|
SendCmdSettingsUpdatedBanner = 3
|
||||||
SendCmdSettingsUpdatedSubdomain = 4
|
SendCmdSettingsUpdatedSubdomain = 4
|
||||||
SendCmdTeamAddedMember = 5
|
SendCmdTeamAddedMember = 5
|
||||||
|
SendCmdTeamUpdatedMemberRole = 6
|
||||||
|
SendCmdTeamDeletedMember = 7
|
||||||
)
|
)
|
||||||
|
|
||||||
// commands received from websocket clients
|
// commands received from websocket clients
|
||||||
|
|
|
@ -86,7 +86,9 @@ func UpdateOrganizationSettings(c *fiber.Ctx) error {
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
return c.SendStatus(fiber.StatusOK)
|
return c.JSON(fiber.Map{
|
||||||
|
"status": "success",
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func UpdateOrganizationFile(c *fiber.Ctx) error {
|
func UpdateOrganizationFile(c *fiber.Ctx) error {
|
||||||
|
|
|
@ -41,6 +41,10 @@ func GetTeamMembers(c *fiber.Ctx) error {
|
||||||
return c.SendStatus(fiber.StatusInternalServerError)
|
return c.SendStatus(fiber.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for i, user := range users {
|
||||||
|
users[i].Online = socketclients.IsUserConnected(user.Id)
|
||||||
|
}
|
||||||
|
|
||||||
return c.JSON(users)
|
return c.JSON(users)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,3 +137,113 @@ func CreateTeamMember(c *fiber.Ctx) error {
|
||||||
"message": "Team member created successfully",
|
"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 = ?", params.MemberId).
|
||||||
|
Where("organization_id = ?", 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",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -23,6 +23,8 @@ func SetupRoutes(app *fiber.App) {
|
||||||
o.Post("/", organization.CreateOrganization)
|
o.Post("/", organization.CreateOrganization)
|
||||||
o.Get("/team/members", handleOrganizationSubdomain, requestAccessValidation, organization.GetTeamMembers)
|
o.Get("/team/members", handleOrganizationSubdomain, requestAccessValidation, organization.GetTeamMembers)
|
||||||
o.Post("/team/members", handleOrganizationSubdomain, requestAccessValidation, organization.CreateTeamMember)
|
o.Post("/team/members", handleOrganizationSubdomain, requestAccessValidation, organization.CreateTeamMember)
|
||||||
|
o.Patch("/team/members/:memberId/role", handleOrganizationSubdomain, requestAccessValidation, organization.UpdateTeamMemberRole)
|
||||||
|
o.Delete("/team/members/:memberId", handleOrganizationSubdomain, requestAccessValidation, organization.DeleteTeamMember)
|
||||||
o.Get("/settings", handleOrganizationSubdomain, requestAccessValidation, organization.GetOrganizationSettings)
|
o.Get("/settings", handleOrganizationSubdomain, requestAccessValidation, organization.GetOrganizationSettings)
|
||||||
o.Patch("/settings", handleOrganizationSubdomain, requestAccessValidation, organization.UpdateOrganizationSettings)
|
o.Patch("/settings", handleOrganizationSubdomain, requestAccessValidation, organization.UpdateOrganizationSettings)
|
||||||
o.Post("/file/:type", handleOrganizationSubdomain, requestAccessValidation, organization.UpdateOrganizationFile)
|
o.Post("/file/:type", handleOrganizationSubdomain, requestAccessValidation, organization.UpdateOrganizationFile)
|
||||||
|
|
|
@ -42,3 +42,14 @@ func BroadcastMessageToTopicExceptBrowserTabSession(organizationId string, topic
|
||||||
func hasClientSubscribedToTopic(topic string, clientTopic string) bool {
|
func hasClientSubscribedToTopic(topic string, clientTopic string) bool {
|
||||||
return clientTopic == topic || strings.HasPrefix(clientTopic, topic)
|
return clientTopic == topic || strings.HasPrefix(clientTopic, topic)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used to determine if a user is connected regardless of the session used
|
||||||
|
func IsUserConnected(userId string) bool {
|
||||||
|
for _, socketClient := range cache.GetSocketClients() {
|
||||||
|
if socketClient.UserId == userId {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue