mirror of
https://github.com/abhinavxd/libredesk.git
synced 2026-10-26 22:37:00 +00:00
148 lines
4.8 KiB
Go
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
|
|
})
|
|
}
|