package controllers import ( "encoding/json" "git.secnex.io/secnex/masterlog" "git.secnex.io/secnex/taro-bot/repositories" "git.secnex.io/secnex/taro-bot/utils" "github.com/gofiber/fiber/v2" ) type MessageRequest struct { EventType string `json:"type"` ChannelID string `json:"channelId"` Text string `json:"text"` Recipient Recipient `json:"recipient"` MembersAdded []Member `json:"membersAdded"` MembersRemoved []Member `json:"membersRemoved"` ChannelData ChannelData `json:"channelData"` } type Member struct { ID string `json:"id"` } type Recipient struct { ID string `json:"id"` Name string `json:"name"` } type ChannelData struct { TeamsTeamID string `json:"teamsTeamId"` TeamsChannelID string `json:"teamsChannelId"` Tenant Tenant `json:"tenant"` Team Team `json:"team"` EventType string `json:"eventType"` Settings Settings `json:"settings"` } type Tenant struct { ID string `json:"id"` } type Team struct { ID string `json:"id"` Name string `json:"name"` AADGroupId string `json:"aadGroupId"` } type Settings struct { SelectedChannel SelectedChannel `json:"selectedChannel"` } type SelectedChannel struct { ID string `json:"id"` } func MessageController(c *fiber.Ctx) error { var request MessageRequest if err := json.Unmarshal(c.Body(), &request); err != nil { return utils.NewErrorResponse(fiber.StatusBadRequest, &fiber.Map{ "message": "Invalid request body", }).Send(c) } masterlog.Debug("Message received", map[string]interface{}{"type": request.EventType, "text": request.Text, "channelId": request.ChannelID, "recipient": request.Recipient.ID, "membersAdded": len(request.MembersAdded), "membersRemoved": len(request.MembersRemoved)}) tenantId := request.ChannelData.Tenant.ID teamId := request.ChannelData.Team.ID if request.ChannelID == "emulator" { tenantId = "4ef9262f-f8db-453d-be35-920132ca874d" teamId = "405148b9-752f-4c29-867c-4670081382e1" } switch request.EventType { case "message": message := request.Text masterlog.Debug("Message received", map[string]interface{}{"message": message}) case "conversationUpdate": botIsAdded := false botIsRemoved := false for _, member := range request.MembersAdded { if member.ID == request.Recipient.ID { botIsAdded = true break } } for _, member := range request.MembersRemoved { if member.ID == request.Recipient.ID { botIsRemoved = true break } } if botIsAdded { masterlog.Debug("Bot added to conversation", map[string]interface{}{"channelId": request.ChannelID, "tenantId": tenantId, "teamId": teamId, "eventType": request.ChannelData.EventType, "selectedChannelId": request.ChannelData.Settings.SelectedChannel.ID}) channel, err := repositories.UpsertChannel(request.ChannelData.Team.Name, tenantId, teamId) if err != nil { masterlog.Error("Failed to create team", map[string]interface{}{"error": err}) } masterlog.Debug("Channel created", map[string]interface{}{"channelId": channel.ID}) } if botIsRemoved { err := repositories.DeleteTeamByExternalID(teamId) if err != nil { masterlog.Error("Failed to delete team", map[string]interface{}{"error": err}) } masterlog.Debug("Team deleted", map[string]interface{}{"teamId": teamId}) } } return utils.NewHTTPResponse(fiber.StatusOK, &fiber.Map{ "message": "Message received", }, "", nil, nil).Send(c) } func MessageHeadController(c *fiber.Ctx) error { masterlog.Debug("Message head received") return utils.NewHTTPResponse(fiber.StatusNoContent, nil, "", nil, nil).Send(c) }