From 16581ae431ffeae97db18eb8672232505a7ce3c0 Mon Sep 17 00:00:00 2001 From: Carlos Tadeu Panato Junior Date: Wed, 10 May 2017 12:44:18 +0200 Subject: implement open graph metadata for apiV4 (#6343) --- api4/openGraph.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 api4/openGraph.go (limited to 'api4/openGraph.go') diff --git a/api4/openGraph.go b/api4/openGraph.go new file mode 100644 index 000000000..e9e998474 --- /dev/null +++ b/api4/openGraph.go @@ -0,0 +1,56 @@ +// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package api4 + +import ( + "net/http" + + l4g "github.com/alecthomas/log4go" + "github.com/mattermost/platform/app" + "github.com/mattermost/platform/model" + "github.com/mattermost/platform/utils" +) + +const OPEN_GRAPH_METADATA_CACHE_SIZE = 10000 + +var openGraphDataCache = utils.NewLru(OPEN_GRAPH_METADATA_CACHE_SIZE) + +func InitOpenGraph() { + l4g.Debug(utils.T("api.opengraph.init.debug")) + + BaseRoutes.OpenGraph.Handle("", ApiSessionRequired(getOpenGraphMetadata)).Methods("POST") +} + +func getOpenGraphMetadata(c *Context, w http.ResponseWriter, r *http.Request) { + if !*utils.Cfg.ServiceSettings.EnableLinkPreviews { + c.Err = model.NewAppError("getOpenGraphMetadata", "api.post.link_preview_disabled.app_error", nil, "", http.StatusNotImplemented) + return + } + + props := model.StringInterfaceFromJson(r.Body) + + url := "" + ok := false + if url, ok = props["url"].(string); len(url) == 0 || !ok { + c.SetInvalidParam("url") + return + } + + ogJSONGeneric, ok := openGraphDataCache.Get(url) + if ok { + w.Write(ogJSONGeneric.([]byte)) + return + } + + og := app.GetOpenGraphMetadata(url) + + ogJSON, err := og.ToJSON() + openGraphDataCache.AddWithExpiresInSecs(props["url"], ogJSON, 3600) // Cache would expire after 1 hour + if err != nil { + w.Write([]byte(`{"url": ""}`)) + return + } + + w.Write(ogJSON) +} -- cgit v1.2.3-1-g7c22