Files
libredesk/cmd/widget_help.go
T

148 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")))
if query == "" {
return r.SendEnvelope([]hcmodels.Article{})
}
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
})
}