♻️ Optimize user join channel logic
This commit is contained in:
parent
1975a89bbb
commit
397386be12
@ -1,7 +1,6 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.solsynth.dev/hypernet/messaging/pkg/internal/gap"
|
||||
"git.solsynth.dev/hypernet/nexus/pkg/nex/cruda"
|
||||
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
|
||||
@ -97,11 +96,13 @@ func addChannelMember(c *fiber.Ctx) error {
|
||||
return fiber.NewError(fiber.StatusBadRequest, "direct message member changes was not allowed")
|
||||
}
|
||||
|
||||
if !channel.IsPublic {
|
||||
if member, err := services.GetChannelMember(user, channel.ID); err != nil {
|
||||
return fiber.NewError(fiber.StatusForbidden, err.Error())
|
||||
} else if member.PowerLevel < 50 {
|
||||
return fiber.NewError(fiber.StatusForbidden, "you must be a moderator of a channel to add member into it")
|
||||
}
|
||||
}
|
||||
|
||||
var err error
|
||||
var account authm.Account
|
||||
@ -115,7 +116,7 @@ func addChannelMember(c *fiber.Ctx) error {
|
||||
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
||||
}
|
||||
|
||||
if err := services.AddChannelMemberWithCheck(account, channel); err != nil {
|
||||
if err := services.AddChannelMemberWithCheck(account, user, channel); err != nil {
|
||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||
} else {
|
||||
return c.SendStatus(fiber.StatusOK)
|
||||
@ -252,37 +253,6 @@ func editChannelNotifyLevelOfMyself(c *fiber.Ctx) error {
|
||||
}
|
||||
}
|
||||
|
||||
func joinChannel(c *fiber.Ctx) error {
|
||||
if err := sec.EnsureAuthenticated(c); err != nil {
|
||||
return err
|
||||
}
|
||||
user := c.Locals("user").(authm.Account)
|
||||
alias := c.Params("channel")
|
||||
|
||||
var channel models.Channel
|
||||
if err := database.C.Where(&models.Channel{
|
||||
Alias: alias,
|
||||
}).First(&channel).Error; err != nil {
|
||||
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
||||
} else if _, _, err := services.GetAvailableChannel(channel.ID, user); err == nil {
|
||||
return fiber.NewError(fiber.StatusBadRequest, "you already joined the channel")
|
||||
} else if channel.RealmID == nil && !channel.IsCommunity {
|
||||
return fiber.NewError(fiber.StatusBadRequest, "you were impossible to join a channel without related realm and non-community")
|
||||
}
|
||||
|
||||
if channel.RealmID != nil {
|
||||
if _, err := authkit.GetRealmMember(gap.Nx, *channel.RealmID, user.ID); err != nil {
|
||||
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("you are not a part of the realm: %v", err))
|
||||
}
|
||||
}
|
||||
|
||||
if err := services.AddChannelMember(user, channel); err != nil {
|
||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||
} else {
|
||||
return c.SendStatus(fiber.StatusOK)
|
||||
}
|
||||
}
|
||||
|
||||
func leaveChannel(c *fiber.Ctx) error {
|
||||
if err := sec.EnsureAuthenticated(c); err != nil {
|
||||
return err
|
||||
|
@ -30,7 +30,6 @@ func MapAPIs(app *fiber.App, baseURL string) {
|
||||
channels.Put("/:channel/members/me", editChannelProfileOfMyself)
|
||||
channels.Put("/:channel/members/me/notify", editChannelNotifyLevelOfMyself)
|
||||
channels.Post("/:channel/members", addChannelMember)
|
||||
channels.Post("/:channel/members/me", joinChannel)
|
||||
channels.Delete("/:channel/members/:memberId", removeChannelMember)
|
||||
channels.Delete("/:channel/members/me", leaveChannel)
|
||||
|
||||
|
@ -53,10 +53,12 @@ func GetChannelMember(user authm.Account, channelId uint) (models.ChannelMember,
|
||||
return member, nil
|
||||
}
|
||||
|
||||
func AddChannelMemberWithCheck(user authm.Account, target models.Channel) error {
|
||||
if err := authkit.EnsureUserPermGranted(gap.Nx, user.ID, target.AccountID, "ChannelAdd", true); err != nil {
|
||||
func AddChannelMemberWithCheck(user, op authm.Account, target models.Channel) error {
|
||||
if user.ID != op.ID {
|
||||
if err := authkit.EnsureUserPermGranted(gap.Nx, user.ID, op.ID, "ChannelAdd", true); err != nil {
|
||||
return fmt.Errorf("unable to add user into your channel due to access denied: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
member := models.ChannelMember{
|
||||
ChannelID: target.ID,
|
||||
|
@ -184,7 +184,7 @@ func ListChannel(user *authm.Account, realmId ...uint) ([]models.Channel, error)
|
||||
var idRange []uint
|
||||
if user != nil {
|
||||
if err := database.C.Where("account_id = ?", user.ID).Find(&identities).Error; err != nil {
|
||||
return nil, fmt.Errorf("unabkle to get identities: %v", err)
|
||||
return nil, fmt.Errorf("unable to get identities: %v", err)
|
||||
}
|
||||
for _, identity := range identities {
|
||||
idRange = append(idRange, identity.ChannelID)
|
||||
|
Loading…
x
Reference in New Issue
Block a user