mirror of
https://github.com/abhinavxd/libredesk.git
synced 2026-10-26 06:19:36 +00:00
7d77754b52
Expand widget conversations with audience-specific forms, AI handoffs, message previews, and help article translations. Keep existing inbox settings compatible and reject invalid live chat configuration.
145 lines
4.8 KiB
Go
145 lines
4.8 KiB
Go
package main
|
|
|
|
import (
|
|
"slices"
|
|
"strings"
|
|
|
|
"github.com/abhinavxd/libredesk/internal/envelope"
|
|
hcmodels "github.com/abhinavxd/libredesk/internal/helpcenter/models"
|
|
"github.com/abhinavxd/libredesk/internal/inbox/channel/livechat"
|
|
umodels "github.com/abhinavxd/libredesk/internal/user/models"
|
|
"github.com/zerodha/fastglue"
|
|
)
|
|
|
|
func optionalWidgetAuth(next func(*fastglue.Request) error) func(*fastglue.Request) error {
|
|
return func(r *fastglue.Request) error {
|
|
if len(r.RequestCtx.Request.Header.Peek("Authorization")) == 0 {
|
|
return validateWidgetInbox(next)(r)
|
|
}
|
|
return widgetAuth(next)(r)
|
|
}
|
|
}
|
|
|
|
func handleWidgetHelp(r *fastglue.Request) error {
|
|
app := r.Context.(*App)
|
|
helpCenter, audience, err := widgetHelpCenter(r)
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
if helpCenter.ID == 0 {
|
|
return r.SendEnvelope(nil)
|
|
}
|
|
locale := resolveQueryLocale(r, helpCenter)
|
|
tree, err := app.helpcenter.GetPublicTree(helpCenter, locale)
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
if len(tree.Tree) == 0 && locale != helpCenter.DefaultLocale {
|
|
locale = helpCenter.DefaultLocale
|
|
tree, err = app.helpcenter.GetPublicTree(helpCenter, locale)
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
}
|
|
hideTreeAuthors(helpCenterTheme(helpCenter), tree.Tree)
|
|
popular, err := app.helpcenter.GetPopularArticles(helpCenter.Slug, locale, 5)
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
for i := range popular {
|
|
hideArticleAuthor(helpCenterTheme(helpCenter), &popular[i])
|
|
}
|
|
config, _ := getWidgetConfig(r)
|
|
return r.SendEnvelope(map[string]any{
|
|
"slug": helpCenter.Slug, "name": helpCenter.Name, "locale": locale,
|
|
"url": helpCenterBaseURL(app, helpCenter) + helpCenterPathPrefix(helpCenter),
|
|
"tree": tree.Tree, "popular": popular, "audience": audience, "locales": helpCenterLocales(helpCenter),
|
|
"featured_ids": config.Help.FeaturedIDs,
|
|
})
|
|
}
|
|
|
|
func handleWidgetHelpSearch(r *fastglue.Request) error {
|
|
app := r.Context.(*App)
|
|
helpCenter, _, err := widgetHelpCenter(r)
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
if helpCenter.ID == 0 {
|
|
return r.SendEnvelope([]hcmodels.Article{})
|
|
}
|
|
query := strings.TrimSpace(string(r.RequestCtx.QueryArgs().Peek("q")))
|
|
articles, err := app.helpcenter.SearchPublishedArticles(helpCenter.Slug, query, resolveQueryLocale(r, helpCenter), publicSearchLimit)
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
app.helpcenter.LogSearch(helpCenter.ID, query, len(articles))
|
|
for i := range articles {
|
|
hideArticleAuthor(helpCenterTheme(helpCenter), &articles[i])
|
|
}
|
|
return r.SendEnvelope(articles)
|
|
}
|
|
|
|
func handleWidgetHelpArticle(r *fastglue.Request) error {
|
|
app := r.Context.(*App)
|
|
helpCenter, _, err := widgetHelpCenter(r)
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
if helpCenter.ID == 0 {
|
|
return sendErrorEnvelope(r, envelope.NewError(envelope.NotFoundError, app.i18n.T("globals.messages.notFound"), nil))
|
|
}
|
|
slug := r.RequestCtx.UserValue("article_slug").(string)
|
|
locale := resolveQueryLocale(r, helpCenter)
|
|
article, err := app.helpcenter.GetPublishedArticle(helpCenter.Slug, slug, locale)
|
|
if envErr, ok := err.(envelope.Error); ok && envErr.ErrorType == envelope.NotFoundError && locale != helpCenter.DefaultLocale {
|
|
article, err = app.helpcenter.GetPublishedArticle(helpCenter.Slug, slug, helpCenter.DefaultLocale)
|
|
}
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
hideArticleAuthor(helpCenterTheme(helpCenter), &article)
|
|
translations, err := app.helpcenter.GetPublishedArticleTranslations(helpCenter.Slug, article.ID)
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
app.helpcenter.IncrementArticleViewCount(article.ID)
|
|
return r.SendEnvelope(helpArticleResponse{Article: article, Translations: translations})
|
|
}
|
|
|
|
func widgetHelpCenter(r *fastglue.Request) (hcmodels.HelpCenter, livechat.HelpAudience, error) {
|
|
app := r.Context.(*App)
|
|
config, err := getWidgetConfig(r)
|
|
if err != nil {
|
|
return hcmodels.HelpCenter{}, livechat.HelpAudience{}, err
|
|
}
|
|
audience := config.Help.Visitors
|
|
if !getWidgetIsVisitor(r) {
|
|
audience = config.Help.Users
|
|
}
|
|
if config.Help.HelpCenterID == 0 || (!audience.Tab && !hasHelpHomeApp(config)) {
|
|
return hcmodels.HelpCenter{}, audience, nil
|
|
}
|
|
helpCenter, err := app.helpcenter.GetHelpCenterByID(config.Help.HelpCenterID)
|
|
if err != nil {
|
|
return hcmodels.HelpCenter{}, audience, err
|
|
}
|
|
if !helpCenter.IsActive {
|
|
return hcmodels.HelpCenter{}, audience, nil
|
|
}
|
|
return helpCenter, audience, nil
|
|
}
|
|
|
|
func widgetContact(r *fastglue.Request) (umodels.User, error) {
|
|
id, err := getWidgetContactID(r)
|
|
if err != nil {
|
|
return umodels.User{}, nil
|
|
}
|
|
return r.Context.(*App).user.GetContactOrVisitor(id, "")
|
|
}
|
|
|
|
func hasHelpHomeApp(config livechat.Config) bool {
|
|
return slices.ContainsFunc(config.HomeApps, func(app livechat.HomeApp) bool {
|
|
return app.Type == livechat.HomeAppHelp
|
|
})
|
|
}
|