✨ 基于事件的消息构成 #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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user