Compare commits
No commits in common. "3a6b51da97d1b61d2043925b7ad3269854937118" and "3929f502ecd9887afa661c72a98e5f89dd37deac" have entirely different histories.
3a6b51da97
...
3929f502ec
4
go.mod
4
go.mod
@ -5,7 +5,7 @@ go 1.22
|
|||||||
toolchain go1.22.1
|
toolchain go1.22.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.solsynth.dev/hydrogen/passport v0.0.0-20240504085931-7c418a3cd32f
|
git.solsynth.dev/hydrogen/identity v0.0.0-20240406034845-44d2ec9c4ace
|
||||||
github.com/go-playground/validator/v10 v10.17.0
|
github.com/go-playground/validator/v10 v10.17.0
|
||||||
github.com/gofiber/contrib/websocket v1.3.0
|
github.com/gofiber/contrib/websocket v1.3.0
|
||||||
github.com/gofiber/fiber/v2 v2.52.4
|
github.com/gofiber/fiber/v2 v2.52.4
|
||||||
@ -59,7 +59,7 @@ require (
|
|||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.5 // indirect
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
github.com/jxskiss/base62 v1.1.0 // indirect
|
github.com/jxskiss/base62 v1.1.0 // indirect
|
||||||
github.com/klauspost/compress v1.17.8 // indirect
|
github.com/klauspost/compress v1.17.7 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
|
||||||
github.com/leodido/go-urn v1.2.4 // indirect
|
github.com/leodido/go-urn v1.2.4 // indirect
|
||||||
github.com/lithammer/shortuuid/v4 v4.0.0 // indirect
|
github.com/lithammer/shortuuid/v4 v4.0.0 // indirect
|
||||||
|
8
go.sum
8
go.sum
@ -1,5 +1,5 @@
|
|||||||
git.solsynth.dev/hydrogen/passport v0.0.0-20240504085931-7c418a3cd32f h1:sKrQrKZc5C+dwefRsnc0uAGttzpSUWXUBoFaCXLkaTo=
|
git.solsynth.dev/hydrogen/identity v0.0.0-20240406034845-44d2ec9c4ace h1:bXbBjM56vA3BxfyuD0IrlJabpVx5bLi4qCv3/RsPa1c=
|
||||||
git.solsynth.dev/hydrogen/passport v0.0.0-20240504085931-7c418a3cd32f/go.mod h1:3JRFPtf0dXRk2UQ1yVIgIspNfytM2yLBeBePJChgLZE=
|
git.solsynth.dev/hydrogen/identity v0.0.0-20240406034845-44d2ec9c4ace/go.mod h1:GxcduEpQWQ2mO37A9uRtseS680uMLi957GDywRBAJHg=
|
||||||
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
||||||
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
||||||
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
|
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
|
||||||
@ -119,8 +119,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
|
|||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||||
github.com/jxskiss/base62 v1.1.0 h1:A5zbF8v8WXx2xixnAKD2w+abC+sIzYJX+nxmhA6HWFw=
|
github.com/jxskiss/base62 v1.1.0 h1:A5zbF8v8WXx2xixnAKD2w+abC+sIzYJX+nxmhA6HWFw=
|
||||||
github.com/jxskiss/base62 v1.1.0/go.mod h1:HhWAlUXvxKThfOlZbcuFzsqwtF5TcqS9ru3y5GfjWAc=
|
github.com/jxskiss/base62 v1.1.0/go.mod h1:HhWAlUXvxKThfOlZbcuFzsqwtF5TcqS9ru3y5GfjWAc=
|
||||||
github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU=
|
github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
|
||||||
github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
|
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
@ -7,7 +7,6 @@ import (
|
|||||||
|
|
||||||
var DatabaseAutoActionRange = []any{
|
var DatabaseAutoActionRange = []any{
|
||||||
&models.Account{},
|
&models.Account{},
|
||||||
&models.Realm{},
|
|
||||||
&models.Channel{},
|
&models.Channel{},
|
||||||
&models.ChannelMember{},
|
&models.ChannelMember{},
|
||||||
&models.Call{},
|
&models.Call{},
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
idpb "git.solsynth.dev/hydrogen/passport/pkg/grpc/proto"
|
idpb "git.solsynth.dev/hydrogen/identity/pkg/grpc/proto"
|
||||||
"google.golang.org/grpc/credentials/insecure"
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
|
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Realms idpb.RealmsClient
|
|
||||||
var Friendships idpb.FriendshipsClient
|
var Friendships idpb.FriendshipsClient
|
||||||
var Notify idpb.NotifyClient
|
var Notify idpb.NotifyClient
|
||||||
var Auth idpb.AuthClient
|
var Auth idpb.AuthClient
|
||||||
@ -18,7 +17,6 @@ func ConnectPassport() error {
|
|||||||
if conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil {
|
if conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
Realms = idpb.NewRealmsClient(conn)
|
|
||||||
Friendships = idpb.NewFriendshipsClient(conn)
|
Friendships = idpb.NewFriendshipsClient(conn)
|
||||||
Notify = idpb.NewNotifyClient(conn)
|
Notify = idpb.NewNotifyClient(conn)
|
||||||
Auth = idpb.NewAuthClient(conn)
|
Auth = idpb.NewAuthClient(conn)
|
||||||
|
@ -10,7 +10,7 @@ const (
|
|||||||
type Channel struct {
|
type Channel struct {
|
||||||
BaseModel
|
BaseModel
|
||||||
|
|
||||||
Alias string `json:"alias"`
|
Alias string `json:"alias" gorm:"uniqueIndex"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
Members []ChannelMember `json:"members"`
|
Members []ChannelMember `json:"members"`
|
||||||
@ -19,7 +19,7 @@ type Channel struct {
|
|||||||
Type ChannelType `json:"type"`
|
Type ChannelType `json:"type"`
|
||||||
Account Account `json:"account"`
|
Account Account `json:"account"`
|
||||||
AccountID uint `json:"account_id"`
|
AccountID uint `json:"account_id"`
|
||||||
RealmID *uint `json:"realm_id"`
|
RealmID uint `json:"realm_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type NotifyLevel = int8
|
type NotifyLevel = int8
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
package models
|
|
||||||
|
|
||||||
// Realm profiles basically fetched from Hydrogen.Passport
|
|
||||||
// But cache at here for better usage and database relations
|
|
||||||
type Realm struct {
|
|
||||||
BaseModel
|
|
||||||
|
|
||||||
Alias string `json:"alias"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Description string `json:"description"`
|
|
||||||
Channels []Channel `json:"channels"`
|
|
||||||
IsPublic bool `json:"is_public"`
|
|
||||||
IsCommunity bool `json:"is_community"`
|
|
||||||
ExternalID uint `json:"external_id"`
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
package services
|
package security
|
||||||
|
|
||||||
import "golang.org/x/crypto/bcrypt"
|
import "golang.org/x/crypto/bcrypt"
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package services
|
package security
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
@ -3,13 +3,14 @@ package server
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"git.solsynth.dev/hydrogen/messaging/pkg/security"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/services"
|
"git.solsynth.dev/hydrogen/messaging/pkg/services"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func authMiddleware(c *fiber.Ctx) error {
|
func authMiddleware(c *fiber.Ctx) error {
|
||||||
var token string
|
var token string
|
||||||
if cookie := c.Cookies(services.CookieAccessKey); len(cookie) > 0 {
|
if cookie := c.Cookies(security.CookieAccessKey); len(cookie) > 0 {
|
||||||
token = cookie
|
token = cookie
|
||||||
}
|
}
|
||||||
if header := c.Get(fiber.HeaderAuthorization); len(header) > 0 {
|
if header := c.Get(fiber.HeaderAuthorization); len(header) > 0 {
|
||||||
@ -41,10 +42,10 @@ func authFunc(c *fiber.Ctx, overrides ...string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rtk := c.Cookies(services.CookieRefreshKey)
|
rtk := c.Cookies(security.CookieRefreshKey)
|
||||||
if user, atk, rtk, err := services.Authenticate(token, rtk); err == nil {
|
if user, atk, rtk, err := services.Authenticate(token, rtk); err == nil {
|
||||||
if atk != token {
|
if atk != token {
|
||||||
services.SetJwtCookieSet(c, atk, rtk)
|
security.SetJwtCookieSet(c, atk, rtk)
|
||||||
}
|
}
|
||||||
c.Locals("principal", user)
|
c.Locals("principal", user)
|
||||||
return nil
|
return nil
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/database"
|
"git.solsynth.dev/hydrogen/messaging/pkg/database"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/models"
|
"git.solsynth.dev/hydrogen/messaging/pkg/models"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/services"
|
"git.solsynth.dev/hydrogen/messaging/pkg/services"
|
||||||
@ -23,7 +22,7 @@ func listChannelMembers(c *fiber.Ctx) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addChannelMember(c *fiber.Ctx) error {
|
func inviteChannel(c *fiber.Ctx) error {
|
||||||
user := c.Locals("principal").(models.Account)
|
user := c.Locals("principal").(models.Account)
|
||||||
alias := c.Params("channel")
|
alias := c.Params("channel")
|
||||||
|
|
||||||
@ -50,14 +49,14 @@ func addChannelMember(c *fiber.Ctx) error {
|
|||||||
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := services.AddChannelMemberWithCheck(account, channel); err != nil {
|
if err := services.InviteChannelMember(account, channel); err != nil {
|
||||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||||
} else {
|
} else {
|
||||||
return c.SendStatus(fiber.StatusOK)
|
return c.SendStatus(fiber.StatusOK)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeChannelMember(c *fiber.Ctx) error {
|
func kickChannel(c *fiber.Ctx) error {
|
||||||
user := c.Locals("principal").(models.Account)
|
user := c.Locals("principal").(models.Account)
|
||||||
alias := c.Params("channel")
|
alias := c.Params("channel")
|
||||||
|
|
||||||
@ -125,34 +124,6 @@ func editChannelMembership(c *fiber.Ctx) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func joinChannel(c *fiber.Ctx) error {
|
|
||||||
user := c.Locals("principal").(models.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 {
|
|
||||||
return fiber.NewError(fiber.StatusBadRequest, "you was impossible to join a channel without related realm")
|
|
||||||
}
|
|
||||||
|
|
||||||
if realm, err := services.GetRealm(channel.ID); err != nil {
|
|
||||||
return fiber.NewError(fiber.StatusInternalServerError, fmt.Sprintf("invalid channel, related realm was not found: %v", err))
|
|
||||||
} else if _, err := services.GetRealmMember(realm.ID, user.ExternalID); 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 {
|
func leaveChannel(c *fiber.Ctx) error {
|
||||||
user := c.Locals("principal").(models.Account)
|
user := c.Locals("principal").(models.Account)
|
||||||
alias := c.Params("channel")
|
alias := c.Params("channel")
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/database"
|
"git.solsynth.dev/hydrogen/messaging/pkg/database"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/models"
|
"git.solsynth.dev/hydrogen/messaging/pkg/models"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/services"
|
"git.solsynth.dev/hydrogen/messaging/pkg/services"
|
||||||
@ -11,13 +10,7 @@ import (
|
|||||||
func getChannel(c *fiber.Ctx) error {
|
func getChannel(c *fiber.Ctx) error {
|
||||||
alias := c.Params("channel")
|
alias := c.Params("channel")
|
||||||
|
|
||||||
var err error
|
channel, err := services.GetChannelWithAlias(alias)
|
||||||
var channel models.Channel
|
|
||||||
if val, ok := c.Locals("realm").(models.Realm); ok {
|
|
||||||
channel, err = services.GetChannelWithAlias(alias, val.ID)
|
|
||||||
} else {
|
|
||||||
channel, err = services.GetChannelWithAlias(alias)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
||||||
}
|
}
|
||||||
@ -26,13 +19,7 @@ func getChannel(c *fiber.Ctx) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func listChannel(c *fiber.Ctx) error {
|
func listChannel(c *fiber.Ctx) error {
|
||||||
var err error
|
channels, err := services.ListChannel()
|
||||||
var channels []models.Channel
|
|
||||||
if val, ok := c.Locals("realm").(models.Realm); ok {
|
|
||||||
channels, err = services.ListChannel(val.ID)
|
|
||||||
} else {
|
|
||||||
channels, err = services.ListChannel()
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||||
}
|
}
|
||||||
@ -77,25 +64,7 @@ func createChannel(c *fiber.Ctx) error {
|
|||||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
var realm *models.Realm
|
channel, err := services.NewChannel(user, data.Alias, data.Name, data.Description)
|
||||||
if val, ok := c.Locals("realm").(models.Realm); ok {
|
|
||||||
if info, err := services.GetRealmMember(val.ID, user.ExternalID); err != nil {
|
|
||||||
return fmt.Errorf("you must be a part of that realm then can create channel related to it")
|
|
||||||
} else if info.GetPowerLevel() < 50 {
|
|
||||||
return fmt.Errorf("you must be a moderator of that realm then can create channel related to it")
|
|
||||||
} else {
|
|
||||||
realm = &val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
var channel models.Channel
|
|
||||||
if realm != nil {
|
|
||||||
channel, err = services.NewChannel(user, data.Alias, data.Name, data.Description, realm.ID)
|
|
||||||
} else {
|
|
||||||
channel, err = services.NewChannel(user, data.Alias, data.Name, data.Description)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||||
}
|
}
|
||||||
@ -117,22 +86,11 @@ func editChannel(c *fiber.Ctx) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx := database.C.Where(&models.Channel{BaseModel: models.BaseModel{ID: uint(id)}})
|
|
||||||
|
|
||||||
if val, ok := c.Locals("realm").(models.Realm); ok {
|
|
||||||
if info, err := services.GetRealmMember(val.ID, user.ExternalID); err != nil {
|
|
||||||
return fmt.Errorf("you must be a part of that realm then can edit channel related to it")
|
|
||||||
} else if info.GetPowerLevel() < 50 {
|
|
||||||
return fmt.Errorf("you must be a moderator of that realm then can edit channel related to it")
|
|
||||||
} else {
|
|
||||||
tx = tx.Where("realm_id = ?", val.ID)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tx = tx.Where("account_id = ? AND realm_id IS NULL", user.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
var channel models.Channel
|
var channel models.Channel
|
||||||
if err := tx.First(&channel).Error; err != nil {
|
if err := database.C.Where(&models.Channel{
|
||||||
|
BaseModel: models.BaseModel{ID: uint(id)},
|
||||||
|
AccountID: user.ID,
|
||||||
|
}).First(&channel).Error; err != nil {
|
||||||
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,22 +106,11 @@ func deleteChannel(c *fiber.Ctx) error {
|
|||||||
user := c.Locals("principal").(models.Account)
|
user := c.Locals("principal").(models.Account)
|
||||||
id, _ := c.ParamsInt("channelId", 0)
|
id, _ := c.ParamsInt("channelId", 0)
|
||||||
|
|
||||||
tx := database.C.Where(&models.Channel{BaseModel: models.BaseModel{ID: uint(id)}})
|
|
||||||
|
|
||||||
if val, ok := c.Locals("realm").(models.Realm); ok {
|
|
||||||
if info, err := services.GetRealmMember(val.ID, user.ExternalID); err != nil {
|
|
||||||
return fmt.Errorf("you must be a part of that realm then can delete channel related to it")
|
|
||||||
} else if info.GetPowerLevel() < 50 {
|
|
||||||
return fmt.Errorf("you must be a moderator of that realm then can delete channel related to it")
|
|
||||||
} else {
|
|
||||||
tx = tx.Where("realm_id = ?", val.ID)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tx = tx.Where("account_id = ? AND realm_id IS NULL", user.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
var channel models.Channel
|
var channel models.Channel
|
||||||
if err := tx.First(&channel).Error; err != nil {
|
if err := database.C.Where(&models.Channel{
|
||||||
|
BaseModel: models.BaseModel{ID: uint(id)},
|
||||||
|
AccountID: user.ID,
|
||||||
|
}).First(&channel).Error; err != nil {
|
||||||
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func listMessage(c *fiber.Ctx) error {
|
func listMessage(c *fiber.Ctx) error {
|
||||||
user := c.Locals("principal").(models.Account)
|
|
||||||
take := c.QueryInt("take", 0)
|
take := c.QueryInt("take", 0)
|
||||||
offset := c.QueryInt("offset", 0)
|
offset := c.QueryInt("offset", 0)
|
||||||
alias := c.Params("channel")
|
alias := c.Params("channel")
|
||||||
@ -17,8 +16,6 @@ func listMessage(c *fiber.Ctx) error {
|
|||||||
channel, err := services.GetChannelWithAlias(alias)
|
channel, err := services.GetChannelWithAlias(alias)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
||||||
} else if _, _, err := services.GetAvailableChannel(channel.ID, user); err != nil {
|
|
||||||
return fiber.NewError(fiber.StatusForbidden, fmt.Sprintf("you need join the channel before you read the messages: %v", err))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
count := services.CountMessage(channel)
|
count := services.CountMessage(channel)
|
||||||
@ -33,7 +30,7 @@ func listMessage(c *fiber.Ctx) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMessage(c *fiber.Ctx) error {
|
func newTextMessage(c *fiber.Ctx) error {
|
||||||
user := c.Locals("principal").(models.Account)
|
user := c.Locals("principal").(models.Account)
|
||||||
alias := c.Params("channel")
|
alias := c.Params("channel")
|
||||||
|
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/services"
|
|
||||||
"github.com/gofiber/fiber/v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
func realmMiddleware(c *fiber.Ctx) error {
|
|
||||||
realmAlias := c.Params("realm")
|
|
||||||
if len(realmAlias) > 0 && realmAlias != "global" {
|
|
||||||
realm, err := services.GetRealmWithAlias(realmAlias)
|
|
||||||
if err != nil {
|
|
||||||
return fiber.NewError(fiber.StatusInternalServerError, fmt.Sprintf("requested channel with realm, but realm was not found: %v", err))
|
|
||||||
} else {
|
|
||||||
c.Locals("realm", realm)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return c.Next()
|
|
||||||
}
|
|
@ -75,7 +75,7 @@ func NewServer() {
|
|||||||
api.Post("/attachments", authMiddleware, uploadAttachment)
|
api.Post("/attachments", authMiddleware, uploadAttachment)
|
||||||
api.Delete("/attachments/:id", authMiddleware, deleteAttachment)
|
api.Delete("/attachments/:id", authMiddleware, deleteAttachment)
|
||||||
|
|
||||||
channels := api.Group("/channels/:realm").Use(realmMiddleware).Name("Channels API")
|
channels := api.Group("/channels").Name("Channels API")
|
||||||
{
|
{
|
||||||
channels.Get("/", listChannel)
|
channels.Get("/", listChannel)
|
||||||
channels.Get("/:channel", getChannel)
|
channels.Get("/:channel", getChannel)
|
||||||
@ -88,13 +88,12 @@ func NewServer() {
|
|||||||
|
|
||||||
channels.Get("/:channel/members", listChannelMembers)
|
channels.Get("/:channel/members", listChannelMembers)
|
||||||
channels.Put("/:channel/members", authMiddleware, editChannelMembership)
|
channels.Put("/:channel/members", authMiddleware, editChannelMembership)
|
||||||
channels.Post("/:channel/members", authMiddleware, addChannelMember)
|
channels.Post("/:channel/invite", authMiddleware, inviteChannel)
|
||||||
channels.Post("/:channel/members/me", authMiddleware, joinChannel)
|
channels.Post("/:channel/kick", authMiddleware, kickChannel)
|
||||||
channels.Delete("/:channel/members", authMiddleware, removeChannelMember)
|
channels.Post("/:channel/leave", authMiddleware, leaveChannel)
|
||||||
channels.Delete("/:channel/members/me", authMiddleware, leaveChannel)
|
|
||||||
|
|
||||||
channels.Get("/:channel/messages", authMiddleware, listMessage)
|
channels.Get("/:channel/messages", listMessage)
|
||||||
channels.Post("/:channel/messages", authMiddleware, newMessage)
|
channels.Post("/:channel/messages", authMiddleware, newTextMessage)
|
||||||
channels.Put("/:channel/messages/:messageId", authMiddleware, editMessage)
|
channels.Put("/:channel/messages/:messageId", authMiddleware, editMessage)
|
||||||
channels.Delete("/:channel/messages/:messageId", authMiddleware, deleteMessage)
|
channels.Delete("/:channel/messages/:messageId", authMiddleware, deleteMessage)
|
||||||
|
|
||||||
|
@ -5,9 +5,9 @@ import (
|
|||||||
"git.solsynth.dev/hydrogen/messaging/pkg/database"
|
"git.solsynth.dev/hydrogen/messaging/pkg/database"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.solsynth.dev/hydrogen/identity/pkg/grpc/proto"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/grpc"
|
"git.solsynth.dev/hydrogen/messaging/pkg/grpc"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/models"
|
"git.solsynth.dev/hydrogen/messaging/pkg/models"
|
||||||
"git.solsynth.dev/hydrogen/passport/pkg/grpc/proto"
|
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -7,10 +7,10 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.solsynth.dev/hydrogen/identity/pkg/grpc/proto"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/database"
|
"git.solsynth.dev/hydrogen/messaging/pkg/database"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/grpc"
|
"git.solsynth.dev/hydrogen/messaging/pkg/grpc"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/models"
|
"git.solsynth.dev/hydrogen/messaging/pkg/models"
|
||||||
"git.solsynth.dev/hydrogen/passport/pkg/grpc/proto"
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ func ListChannelMember(channelId uint) ([]models.ChannelMember, error) {
|
|||||||
return members, nil
|
return members, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddChannelMemberWithCheck(user models.Account, target models.Channel) error {
|
func InviteChannelMember(user models.Account, target models.Channel) error {
|
||||||
if _, err := GetAccountFriend(user.ID, target.AccountID, 1); err != nil {
|
if _, err := GetAccountFriend(user.ID, target.AccountID, 1); err != nil {
|
||||||
return fmt.Errorf("you only can invite your friends to your channel")
|
return fmt.Errorf("you only can invite your friends to your channel")
|
||||||
}
|
}
|
||||||
|
@ -27,15 +27,11 @@ func GetChannel(id uint) (models.Channel, error) {
|
|||||||
return channel, nil
|
return channel, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetChannelWithAlias(alias string, realmId ...uint) (models.Channel, error) {
|
func GetChannelWithAlias(alias string) (models.Channel, error) {
|
||||||
var channel models.Channel
|
var channel models.Channel
|
||||||
tx := database.C.Where(models.Channel{Alias: alias}).Preload("Account")
|
if err := database.C.Where(models.Channel{
|
||||||
if len(realmId) > 0 {
|
Alias: alias,
|
||||||
tx = tx.Where("realm_id = ?", realmId)
|
}).Preload("Account").First(&channel).Error; err != nil {
|
||||||
} else {
|
|
||||||
tx = tx.Where("realm_id IS NULL")
|
|
||||||
}
|
|
||||||
if err := tx.First(&channel).Error; err != nil {
|
|
||||||
return channel, err
|
return channel, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,15 +74,9 @@ func GetAvailableChannel(id uint, user models.Account) (models.Channel, models.C
|
|||||||
return channel, member, nil
|
return channel, member, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListChannel(realmId ...uint) ([]models.Channel, error) {
|
func ListChannel() ([]models.Channel, error) {
|
||||||
var channels []models.Channel
|
var channels []models.Channel
|
||||||
tx := database.C.Preload("Account")
|
if err := database.C.Preload("Account").Find(&channels).Error; err != nil {
|
||||||
if len(realmId) > 0 {
|
|
||||||
tx = tx.Where("realm_id = ?", realmId)
|
|
||||||
} else {
|
|
||||||
tx = tx.Where("realm_id IS NULL")
|
|
||||||
}
|
|
||||||
if err := tx.Find(&channels).Error; err != nil {
|
|
||||||
return channels, err
|
return channels, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,7 +112,7 @@ func ListChannelIsAvailable(user models.Account) ([]models.Channel, error) {
|
|||||||
return channels, nil
|
return channels, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewChannel(user models.Account, alias, name, description string, realmId ...uint) (models.Channel, error) {
|
func NewChannel(user models.Account, alias, name, description string) (models.Channel, error) {
|
||||||
channel := models.Channel{
|
channel := models.Channel{
|
||||||
Alias: alias,
|
Alias: alias,
|
||||||
Name: name,
|
Name: name,
|
||||||
@ -132,9 +122,6 @@ func NewChannel(user models.Account, alias, name, description string, realmId ..
|
|||||||
{AccountID: user.ID},
|
{AccountID: user.ID},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if len(realmId) > 0 {
|
|
||||||
channel.RealmID = &realmId[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
err := database.C.Save(&channel).Error
|
err := database.C.Save(&channel).Error
|
||||||
|
|
||||||
|
@ -1,82 +0,0 @@
|
|||||||
package services
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/database"
|
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/grpc"
|
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/models"
|
|
||||||
"git.solsynth.dev/hydrogen/passport/pkg/grpc/proto"
|
|
||||||
"github.com/samber/lo"
|
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetRealm(id uint) (models.Realm, error) {
|
|
||||||
var realm models.Realm
|
|
||||||
response, err := grpc.Realms.GetRealm(context.Background(), &proto.RealmLookupRequest{
|
|
||||||
Id: lo.ToPtr(uint64(id)),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return realm, err
|
|
||||||
}
|
|
||||||
return LinkRealm(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRealmWithAlias(alias string) (models.Realm, error) {
|
|
||||||
var realm models.Realm
|
|
||||||
response, err := grpc.Realms.GetRealm(context.Background(), &proto.RealmLookupRequest{
|
|
||||||
Alias: &alias,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return realm, err
|
|
||||||
}
|
|
||||||
return LinkRealm(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRealmMember(realmId uint, userId uint) (*proto.RealmMemberResponse, error) {
|
|
||||||
response, err := grpc.Realms.GetRealmMember(context.Background(), &proto.RealmMemberLookupRequest{
|
|
||||||
RealmId: uint64(realmId),
|
|
||||||
UserId: lo.ToPtr(uint64(userId)),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else {
|
|
||||||
return response, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ListRealmMember(realmId uint) ([]*proto.RealmMemberResponse, error) {
|
|
||||||
response, err := grpc.Realms.ListRealmMember(context.Background(), &proto.RealmMemberLookupRequest{
|
|
||||||
RealmId: uint64(realmId),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else {
|
|
||||||
return response.Data, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func LinkRealm(info *proto.RealmResponse) (models.Realm, error) {
|
|
||||||
var realm models.Realm
|
|
||||||
if info == nil {
|
|
||||||
return realm, fmt.Errorf("remote realm info was not found")
|
|
||||||
}
|
|
||||||
if err := database.C.Where(&models.Realm{
|
|
||||||
ExternalID: uint(info.Id),
|
|
||||||
}).First(&realm).Error; err != nil {
|
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
||||||
realm = models.Realm{
|
|
||||||
Alias: info.Alias,
|
|
||||||
Name: info.Name,
|
|
||||||
Description: info.Description,
|
|
||||||
IsPublic: info.IsPublic,
|
|
||||||
IsCommunity: info.IsCommunity,
|
|
||||||
ExternalID: uint(info.Id),
|
|
||||||
}
|
|
||||||
return realm, database.C.Save(&realm).Error
|
|
||||||
}
|
|
||||||
return realm, err
|
|
||||||
}
|
|
||||||
return realm, nil
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user