From 6a54f3c4890135ea925365e59628afbb58ff6f87 Mon Sep 17 00:00:00 2001 From: Corey Hulen Date: Fri, 2 Jun 2017 09:08:04 -0700 Subject: PLT-6581 breakup webhooks greater than 4K into multiple posts (#6530) --- app/webhook.go | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) (limited to 'app/webhook.go') diff --git a/app/webhook.go b/app/webhook.go index 1ec96a32e..6a7bb16e1 100644 --- a/app/webhook.go +++ b/app/webhook.go @@ -150,11 +150,37 @@ func CreateWebhookPost(userId, teamId, channelId, text, overrideUsername, overri } } - if _, err := CreatePost(post, teamId, false); err != nil { - return nil, model.NewLocAppError("CreateWebhookPost", "api.post.create_webhook_post.creating.app_error", nil, "err="+err.Message) + splits := make([]string, 0) + remainingText := post.Message + + for len(remainingText) > model.POST_MESSAGE_MAX_RUNES { + splits = append(splits, remainingText[:model.POST_MESSAGE_MAX_RUNES]) + remainingText = remainingText[model.POST_MESSAGE_MAX_RUNES:] + } + + splits = append(splits, remainingText) + + var firstPost *model.Post = nil + + for _, txt := range splits { + post.Id = "" + post.UpdateAt = 0 + post.CreateAt = 0 + post.Message = txt + if _, err := CreatePost(post, teamId, false); err != nil { + return nil, model.NewLocAppError("CreateWebhookPost", "api.post.create_webhook_post.creating.app_error", nil, "err="+err.Message) + } + + if firstPost == nil { + if len(splits) > 1 { + firstPost = model.PostFromJson(strings.NewReader(post.ToJson())) + } else { + firstPost = post + } + } } - return post, nil + return firstPost, nil } func CreateIncomingWebhookForChannel(creatorId string, channel *model.Channel, hook *model.IncomingWebhook) (*model.IncomingWebhook, *model.AppError) { @@ -430,11 +456,6 @@ func HandleIncomingWebhook(hookId string, req *model.IncomingWebhookRequest) *mo return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.text.app_error", nil, "", http.StatusBadRequest) } - textSize := utf8.RuneCountInString(text) - if textSize > model.POST_MESSAGE_MAX_RUNES { - return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.text.length.app_error", map[string]interface{}{"Max": model.POST_MESSAGE_MAX_RUNES, "Actual": textSize}, "", http.StatusBadRequest) - } - channelName := req.ChannelName webhookType := req.Type -- cgit v1.2.3-1-g7c22