diff --git a/api/http/server.go b/api/http/server.go index 046e58ee9..974174b5c 100644 --- a/api/http/server.go +++ b/api/http/server.go @@ -42,7 +42,7 @@ func (server *Server) Start() error { var settingsHandler = NewSettingsHandler(middleWareService) settingsHandler.settings = server.Settings var templatesHandler = NewTemplatesHandler(middleWareService) - templatesHandler.templatesURL = server.TemplatesURL + templatesHandler.containerTemplatesURL = server.TemplatesURL var dockerHandler = NewDockerHandler(middleWareService, server.ResourceControlService) dockerHandler.EndpointService = server.EndpointService var websocketHandler = NewWebSocketHandler() diff --git a/api/http/templates_handler.go b/api/http/templates_handler.go index 510605021..be994ddc2 100644 --- a/api/http/templates_handler.go +++ b/api/http/templates_handler.go @@ -12,10 +12,14 @@ import ( // TemplatesHandler represents an HTTP API handler for managing templates. type TemplatesHandler struct { *mux.Router - Logger *log.Logger - templatesURL string + Logger *log.Logger + containerTemplatesURL string } +const ( + containerTemplatesURLLinuxServerIo = "http://tools.linuxserver.io/portainer.json" +) + // NewTemplatesHandler returns a new instance of TemplatesHandler. func NewTemplatesHandler(mw *middleWareService) *TemplatesHandler { h := &TemplatesHandler{ @@ -27,14 +31,30 @@ func NewTemplatesHandler(mw *middleWareService) *TemplatesHandler { return h } -// handleGetTemplates handles GET requests on /templates +// handleGetTemplates handles GET requests on /templates?key= func (handler *TemplatesHandler) handleGetTemplates(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { handleNotAllowed(w, []string{http.MethodGet}) return } - resp, err := http.Get(handler.templatesURL) + key := r.FormValue("key") + if key == "" { + Error(w, ErrInvalidQueryFormat, http.StatusBadRequest, handler.Logger) + return + } + + var templatesURL string + if key == "containers" { + templatesURL = handler.containerTemplatesURL + } else if key == "linuxserver.io" { + templatesURL = containerTemplatesURLLinuxServerIo + } else { + Error(w, ErrInvalidQueryFormat, http.StatusBadRequest, handler.Logger) + return + } + + resp, err := http.Get(templatesURL) if err != nil { Error(w, err, http.StatusInternalServerError, handler.Logger) return diff --git a/app/app.js b/app/app.js index 21ed9207a..1142ad666 100644 --- a/app/app.js +++ b/app/app.js @@ -456,6 +456,27 @@ angular.module('portainer', [ }) .state('templates', { url: '/templates/', + params: { + key: 'containers', + hide_descriptions: false + }, + views: { + "content@": { + templateUrl: 'app/components/templates/templates.html', + controller: 'TemplatesController' + }, + "sidebar@": { + templateUrl: 'app/components/sidebar/sidebar.html', + controller: 'SidebarController' + } + } + }) + .state('templates_linuxserver', { + url: '^/templates/linuxserver.io', + params: { + key: 'linuxserver.io', + hide_descriptions: true + }, views: { "content@": { templateUrl: 'app/components/templates/templates.html', diff --git a/app/components/sidebar/sidebar.html b/app/components/sidebar/sidebar.html index 5515fa69e..85d60dc83 100644 --- a/app/components/sidebar/sidebar.html +++ b/app/components/sidebar/sidebar.html @@ -21,6 +21,9 @@