From 2e18b2455b8e05d9ef7033ef33cd410c99f37126 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 15 Feb 2025 15:55:06 +0800 Subject: [PATCH] :sparkles: Separate list public channel --- pkg/internal/http/api/channels_api.go | 15 +++++++++++++++ pkg/internal/http/api/index.go | 1 + pkg/internal/services/channels.go | 17 +++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/pkg/internal/http/api/channels_api.go b/pkg/internal/http/api/channels_api.go index a029033..44e3143 100644 --- a/pkg/internal/http/api/channels_api.go +++ b/pkg/internal/http/api/channels_api.go @@ -76,6 +76,21 @@ func listChannel(c *fiber.Ctx) error { return c.JSON(channels) } +func listPublicChannel(c *fiber.Ctx) error { + var err error + var channels []models.Channel + if val, ok := c.Locals("realm").(authm.Realm); ok { + channels, err = services.ListChannelPublic(val.ID) + } else { + channels, err = services.ListChannelPublic() + } + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + + return c.JSON(channels) +} + func listOwnedChannel(c *fiber.Ctx) error { if err := sec.EnsureAuthenticated(c); err != nil { return err diff --git a/pkg/internal/http/api/index.go b/pkg/internal/http/api/index.go index 40bd290..a9af296 100644 --- a/pkg/internal/http/api/index.go +++ b/pkg/internal/http/api/index.go @@ -15,6 +15,7 @@ func MapAPIs(app *fiber.App, baseURL string) { channels := api.Group("/channels/:realm").Use(realmMiddleware).Name("Channels API") { channels.Get("/", listChannel) + channels.Get("/public", listPublicChannel) channels.Get("/me", listOwnedChannel) channels.Get("/me/available", listAvailableChannel) channels.Get("/:channel", getChannel) diff --git a/pkg/internal/services/channels.go b/pkg/internal/services/channels.go index 5fb3913..9f14ed1 100644 --- a/pkg/internal/services/channels.go +++ b/pkg/internal/services/channels.go @@ -207,6 +207,23 @@ func ListChannel(user *authm.Account, realmId ...uint) ([]models.Channel, error) return channels, nil } +func ListChannelPublic(realmId ...uint) ([]models.Channel, error) { + var channels []models.Channel + tx := database.C + tx = tx.Where("is_public = true") + if len(realmId) > 0 { + tx = tx.Where("realm_id = ?", realmId) + } + + tx = PreloadDirectChannelMembers(tx) + + if err := tx.Find(&channels).Error; err != nil { + return channels, err + } + + return channels, nil +} + func ListChannelWithUser(user authm.Account, realmId ...uint) ([]models.Channel, error) { var channels []models.Channel tx := database.C.Where(&models.Channel{AccountID: user.ID})