✨ 基于事件的消息构成 #1
@ -6,6 +6,7 @@ import (
|
|||||||
"git.solsynth.dev/hydrogen/messaging/pkg/internal/models"
|
"git.solsynth.dev/hydrogen/messaging/pkg/internal/models"
|
||||||
"git.solsynth.dev/hydrogen/messaging/pkg/internal/services"
|
"git.solsynth.dev/hydrogen/messaging/pkg/internal/services"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -71,6 +72,16 @@ func startCall(c *fiber.Ctx) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||||
} else {
|
} else {
|
||||||
|
_, _ = services.NewEvent(models.Event{
|
||||||
|
Uuid: uuid.NewString(),
|
||||||
|
Body: map[string]any{},
|
||||||
|
Type: "calls.start",
|
||||||
|
Channel: channel,
|
||||||
|
Sender: membership,
|
||||||
|
ChannelID: channel.ID,
|
||||||
|
SenderID: membership.ID,
|
||||||
|
})
|
||||||
|
|
||||||
return c.JSON(call)
|
return c.JSON(call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -107,6 +118,16 @@ func endCall(c *fiber.Ctx) error {
|
|||||||
if call, err := services.EndCall(call); err != nil {
|
if call, err := services.EndCall(call); err != nil {
|
||||||
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
||||||
} else {
|
} else {
|
||||||
|
_, _ = services.NewEvent(models.Event{
|
||||||
|
Uuid: uuid.NewString(),
|
||||||
|
Body: map[string]any{"last": call.EndedAt.Unix() - call.CreatedAt.Unix()},
|
||||||
|
Type: "calls.end",
|
||||||
|
Channel: channel,
|
||||||
|
Sender: membership,
|
||||||
|
ChannelID: channel.ID,
|
||||||
|
SenderID: membership.ID,
|
||||||
|
})
|
||||||
|
|
||||||
return c.JSON(call)
|
return c.JSON(call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,35 @@ import (
|
|||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func getEvent(c *fiber.Ctx) error {
|
||||||
|
if err := gap.H.EnsureAuthenticated(c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
user := c.Locals("user").(models.Account)
|
||||||
|
alias := c.Params("channel")
|
||||||
|
id, _ := c.ParamsInt("eventId")
|
||||||
|
|
||||||
|
var err error
|
||||||
|
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 {
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
|
||||||
|
event, err := services.GetEvent(channel, uint(id))
|
||||||
|
if err != nil {
|
||||||
|
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.JSON(event)
|
||||||
|
}
|
||||||
|
|
||||||
func listEvent(c *fiber.Ctx) error {
|
func listEvent(c *fiber.Ctx) error {
|
||||||
if err := gap.H.EnsureAuthenticated(c); err != nil {
|
if err := gap.H.EnsureAuthenticated(c); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -32,14 +61,14 @@ func listEvent(c *fiber.Ctx) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
count := services.CountEvent(channel)
|
count := services.CountEvent(channel)
|
||||||
messages, err := services.ListEvent(channel, take, offset)
|
events, err := services.ListEvent(channel, take, offset)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
return fiber.NewError(fiber.StatusNotFound, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.JSON(fiber.Map{
|
return c.JSON(fiber.Map{
|
||||||
"count": count,
|
"count": count,
|
||||||
"data": messages,
|
"data": events,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +108,7 @@ func newRawEvent(c *fiber.Ctx) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
message := models.Event{
|
event := models.Event{
|
||||||
Uuid: data.Uuid,
|
Uuid: data.Uuid,
|
||||||
Body: data.Body,
|
Body: data.Body,
|
||||||
Type: data.Type,
|
Type: data.Type,
|
||||||
@ -89,9 +118,9 @@ func newRawEvent(c *fiber.Ctx) error {
|
|||||||
SenderID: member.ID,
|
SenderID: member.ID,
|
||||||
}
|
}
|
||||||
|
|
||||||
if message, err = services.NewEvent(message); err != nil {
|
if event, err = services.NewEvent(event); err != nil {
|
||||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.JSON(message)
|
return c.JSON(event)
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ func MapAPIs(app *fiber.App) {
|
|||||||
channels.Delete("/:channel/members/me", leaveChannel)
|
channels.Delete("/:channel/members/me", leaveChannel)
|
||||||
|
|
||||||
channels.Get("/:channel/events", listEvent)
|
channels.Get("/:channel/events", listEvent)
|
||||||
|
channels.Get("/:channel/events/:eventId", getEvent)
|
||||||
channels.Post("/:channel/events", newRawEvent)
|
channels.Post("/:channel/events", newRawEvent)
|
||||||
|
|
||||||
channels.Post("/:channel/messages", newMessageEvent)
|
channels.Post("/:channel/messages", newMessageEvent)
|
||||||
|
@ -138,44 +138,15 @@ func NotifyMessageEvent(members []models.ChannelMember, event models.Event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func EditEvent(event models.Event) (models.Event, error) {
|
func EditEvent(event models.Event) (models.Event, error) {
|
||||||
var members []models.ChannelMember
|
|
||||||
if err := database.C.Save(&event).Error; err != nil {
|
if err := database.C.Save(&event).Error; err != nil {
|
||||||
return event, err
|
return event, err
|
||||||
} else if err = database.C.Where(models.ChannelMember{
|
|
||||||
ChannelID: event.ChannelID,
|
|
||||||
}).Find(&members).Error; err == nil {
|
|
||||||
event, _ = GetEvent(models.Channel{
|
|
||||||
BaseModel: models.BaseModel{ID: event.Channel.ID},
|
|
||||||
}, event.ID)
|
|
||||||
for _, member := range members {
|
|
||||||
PushCommand(member.AccountID, models.UnifiedCommand{
|
|
||||||
Action: "events.update",
|
|
||||||
Payload: event,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return event, nil
|
return event, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeleteEvent(event models.Event) (models.Event, error) {
|
func DeleteEvent(event models.Event) (models.Event, error) {
|
||||||
prev, _ := GetEvent(models.Channel{
|
|
||||||
BaseModel: models.BaseModel{ID: event.Channel.ID},
|
|
||||||
}, event.ID)
|
|
||||||
|
|
||||||
var members []models.ChannelMember
|
|
||||||
if err := database.C.Delete(&event).Error; err != nil {
|
if err := database.C.Delete(&event).Error; err != nil {
|
||||||
return event, err
|
return event, err
|
||||||
} else if err = database.C.Where(models.ChannelMember{
|
|
||||||
ChannelID: event.ChannelID,
|
|
||||||
}).Find(&members).Error; err == nil {
|
|
||||||
for _, member := range members {
|
|
||||||
PushCommand(member.AccountID, models.UnifiedCommand{
|
|
||||||
Action: "events.burnt",
|
|
||||||
Payload: prev,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return event, nil
|
return event, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user