From a8dbcfdb058795a998d20e747b3b3d8b3ee08d36 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 21 Feb 2025 23:35:52 +0800 Subject: [PATCH] :bug: Yeah, fix bugs --- pkg/internal/http/api/channel_members_api.go | 105 +++++++++---------- pkg/internal/http/api/channels_api.go | 18 ++-- pkg/internal/http/api/index.go | 7 +- 3 files changed, 64 insertions(+), 66 deletions(-) diff --git a/pkg/internal/http/api/channel_members_api.go b/pkg/internal/http/api/channel_members_api.go index a96ed85..7515a9b 100644 --- a/pkg/internal/http/api/channel_members_api.go +++ b/pkg/internal/http/api/channel_members_api.go @@ -2,14 +2,12 @@ package api import ( "git.solsynth.dev/hypernet/messaging/pkg/internal/gap" + "git.solsynth.dev/hypernet/messaging/pkg/internal/http/exts" "git.solsynth.dev/hypernet/nexus/pkg/nex/cruda" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/passport/pkg/authkit" authm "git.solsynth.dev/hypernet/passport/pkg/authkit/models" "strconv" - "strings" - - "git.solsynth.dev/hypernet/messaging/pkg/internal/http/exts" "git.solsynth.dev/hypernet/messaging/pkg/internal/database" "git.solsynth.dev/hypernet/messaging/pkg/internal/models" @@ -48,31 +46,6 @@ func listChannelMembers(c *fiber.Ctx) error { } } -func getChannelProfileOfMyself(c *fiber.Ctx) error { - alias := c.Params("channel") - if err := sec.EnsureAuthenticated(c); err != nil { - return err - } - user := c.Locals("user").(authm.Account) - - var err error - var channel models.Channel - if val, ok := c.Locals("realm").(authm.Realm); ok { - channel, err = services.GetChannelWithAlias(alias, val.ID) - } else { - channel, err = services.GetChannelWithAlias(alias) - } - if err != nil { - return fiber.NewError(fiber.StatusNotFound, err.Error()) - } - - if member, err := services.GetChannelMember(user, channel.ID); err != nil { - return fiber.NewError(fiber.StatusNotFound, err.Error()) - } else { - return c.JSON(member) - } -} - func addChannelMember(c *fiber.Ctx) error { if err := sec.EnsureAuthenticated(c); err != nil { return err @@ -132,6 +105,11 @@ func removeChannelMember(c *fiber.Ctx) error { alias := c.Params("channel") memberId := c.Params("memberId") + numericId, err := strconv.Atoi(memberId) + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, "invalid member id") + } + var channel models.Channel if err := database.C.Where(&models.Channel{ Alias: alias, @@ -144,31 +122,17 @@ func removeChannelMember(c *fiber.Ctx) error { } var member models.ChannelMember - if strings.EqualFold(memberId, "me") { - if err := database.C.Where(&models.ChannelMember{ - BaseModel: cruda.BaseModel{ID: user.ID}, - ChannelID: channel.ID, - }).First(&member).Error; err != nil { - return fiber.NewError(fiber.StatusNotFound, err.Error()) - } - } else { - numericId, err := strconv.Atoi(memberId) - if err != nil { - return fiber.NewError(fiber.StatusBadRequest, "invalid member id") - } + if me, err := services.GetChannelMember(user, channel.ID); err != nil { + return fiber.NewError(fiber.StatusForbidden, err.Error()) + } else if me.PowerLevel < 50 { + return fiber.NewError(fiber.StatusForbidden, "you must be a moderator of a channel to remove member from it") + } - if me, err := services.GetChannelMember(user, channel.ID); err != nil { - return fiber.NewError(fiber.StatusForbidden, err.Error()) - } else if me.PowerLevel < 50 { - return fiber.NewError(fiber.StatusForbidden, "you must be a moderator of a channel to remove member from it") - } - - if err := database.C.Where(&models.ChannelMember{ - BaseModel: cruda.BaseModel{ID: uint(numericId)}, - ChannelID: channel.ID, - }).First(&member).Error; err != nil { - return fiber.NewError(fiber.StatusNotFound, err.Error()) - } + if err := database.C.Where(&models.ChannelMember{ + BaseModel: cruda.BaseModel{ID: uint(numericId)}, + ChannelID: channel.ID, + }).First(&member).Error; err != nil { + return fiber.NewError(fiber.StatusNotFound, err.Error()) } if err := services.RemoveChannelMember(member, channel); err != nil { @@ -178,7 +142,40 @@ func removeChannelMember(c *fiber.Ctx) error { } } -func editChannelProfileOfMyself(c *fiber.Ctx) error { +func deleteChannelIdentity(c *fiber.Ctx) error { + if err := sec.EnsureAuthenticated(c); err != nil { + return err + } + user := c.Locals("user").(authm.Account) + alias := c.Params("channel") + + var err error + var channel models.Channel + if val, ok := c.Locals("realm").(authm.Realm); ok { + channel, err = services.GetChannelWithAlias(alias, val.ID) + } else { + channel, err = services.GetChannelWithAlias(alias) + } + if err != nil { + return fiber.NewError(fiber.StatusNotFound, err.Error()) + } + + var membership models.ChannelMember + if err := database.C.Where(&models.ChannelMember{ + ChannelID: channel.ID, + AccountID: user.ID, + }).First(&membership).Error; err != nil { + return fiber.NewError(fiber.StatusNotFound, err.Error()) + } + + if err = services.RemoveChannelMember(membership, channel); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } else { + return c.JSON(membership) + } +} + +func editChannelIdentity(c *fiber.Ctx) error { if err := sec.EnsureAuthenticated(c); err != nil { return err } @@ -226,7 +223,7 @@ func editChannelProfileOfMyself(c *fiber.Ctx) error { } } -func editChannelNotifyLevelOfMyself(c *fiber.Ctx) error { +func editChannelNotifyLevel(c *fiber.Ctx) error { if err := sec.EnsureAuthenticated(c); err != nil { return err } diff --git a/pkg/internal/http/api/channels_api.go b/pkg/internal/http/api/channels_api.go index ca906ee..a29b155 100644 --- a/pkg/internal/http/api/channels_api.go +++ b/pkg/internal/http/api/channels_api.go @@ -35,26 +35,28 @@ func getChannel(c *fiber.Ctx) error { } func getChannelIdentity(c *fiber.Ctx) error { + alias := c.Params("channel") if err := sec.EnsureAuthenticated(c); err != nil { return err } user := c.Locals("user").(authm.Account) - alias := c.Params("channel") var err error - var member models.ChannelMember - + var channel models.Channel if val, ok := c.Locals("realm").(authm.Realm); ok { - _, member, err = services.GetChannelIdentity(alias, user.ID, val) + channel, err = services.GetChannelWithAlias(alias, val.ID) } else { - _, member, err = services.GetChannelIdentity(alias, user.ID) + channel, err = services.GetChannelWithAlias(alias) } - if err != nil { - return c.SendStatus(fiber.StatusForbidden) + return fiber.NewError(fiber.StatusNotFound, err.Error()) } - return c.JSON(member) + if member, err := services.GetChannelMember(user, channel.ID); err != nil { + return fiber.NewError(fiber.StatusNotFound, err.Error()) + } else { + return c.JSON(member) + } } func listChannel(c *fiber.Ctx) error { diff --git a/pkg/internal/http/api/index.go b/pkg/internal/http/api/index.go index 9786450..dba5a2c 100644 --- a/pkg/internal/http/api/index.go +++ b/pkg/internal/http/api/index.go @@ -20,16 +20,15 @@ func MapAPIs(app *fiber.App, baseURL string) { channels.Get("/me/available", listAvailableChannel) channels.Get("/:channel", getChannel) channels.Get("/:channel/me", getChannelIdentity) + channels.Put("/:channel/me", editChannelIdentity) + channels.Put("/:channel/me/notify", editChannelNotifyLevel) + channels.Delete("/:channel/me", deleteChannelIdentity) channels.Post("/", createChannel) channels.Post("/dm", createDirectChannel) channels.Put("/:channelId", editChannel) channels.Delete("/:channelId", deleteChannel) - channels.Get("/:channel/members", listChannelMembers) - channels.Get("/:channel/members/me", getChannelProfileOfMyself) - channels.Put("/:channel/members/me", editChannelProfileOfMyself) - channels.Put("/:channel/members/me/notify", editChannelNotifyLevelOfMyself) channels.Post("/:channel/members", addChannelMember) channels.Delete("/:channel/members/:memberId", removeChannelMember)