roles and team

main
alex 2024-09-08 11:46:36 +02:00
parent 1232a909c1
commit 4948c72882
6 changed files with 144 additions and 1 deletions

View File

@ -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
}

View File

@ -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

View File

@ -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 {

View File

@ -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, &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 = ?", 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, &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",
})
}

View File

@ -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)

View File

@ -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
}