From 8f0182c3229dfbb8d731557e5006e39bd616b4e9 Mon Sep 17 00:00:00 2001
From: John Olheiser <42128690+jolheiser@users.noreply.github.com>
Date: Wed, 12 Jun 2019 16:07:24 -0500
Subject: [PATCH] API error cleanup (#7186)

---
 integrations/api_repo_file_content_test.go |  3 +--
 integrations/api_repo_file_create_test.go  |  3 +--
 integrations/api_repo_file_delete_test.go  |  4 ++--
 integrations/api_repo_file_update_test.go  |  3 +--
 modules/base/base.go                       |  3 ---
 modules/context/api.go                     | 13 ++-----------
 modules/setting/setting.go                 | 12 +++++++++---
 7 files changed, 16 insertions(+), 25 deletions(-)

diff --git a/integrations/api_repo_file_content_test.go b/integrations/api_repo_file_content_test.go
index 896d811083f..7a6025d423e 100644
--- a/integrations/api_repo_file_content_test.go
+++ b/integrations/api_repo_file_content_test.go
@@ -11,7 +11,6 @@ import (
 	"testing"
 
 	"code.gitea.io/gitea/models"
-	"code.gitea.io/gitea/modules/base"
 	"code.gitea.io/gitea/modules/context"
 	"code.gitea.io/gitea/modules/setting"
 	api "code.gitea.io/gitea/modules/structs"
@@ -98,7 +97,7 @@ func testAPIGetFileContents(t *testing.T, u *url.URL) {
 	resp = session.MakeRequest(t, req, http.StatusInternalServerError)
 	expectedAPIError := context.APIError{
 		Message: "object does not exist [id: " + branch + ", rel_path: ]",
-		URL:     base.DocURL,
+		URL:     setting.API.SwaggerURL,
 	}
 	var apiError context.APIError
 	DecodeJSON(t, resp, &apiError)
diff --git a/integrations/api_repo_file_create_test.go b/integrations/api_repo_file_create_test.go
index 3bb2ecb8128..973ed9dfa59 100644
--- a/integrations/api_repo_file_create_test.go
+++ b/integrations/api_repo_file_create_test.go
@@ -13,7 +13,6 @@ import (
 	"testing"
 
 	"code.gitea.io/gitea/models"
-	"code.gitea.io/gitea/modules/base"
 	"code.gitea.io/gitea/modules/context"
 	"code.gitea.io/gitea/modules/git"
 	"code.gitea.io/gitea/modules/setting"
@@ -160,7 +159,7 @@ func TestAPICreateFile(t *testing.T) {
 		resp = session.MakeRequest(t, req, http.StatusInternalServerError)
 		expectedAPIError := context.APIError{
 			Message: "repository file already exists [path: " + treePath + "]",
-			URL:     base.DocURL,
+			URL:     setting.API.SwaggerURL,
 		}
 		var apiError context.APIError
 		DecodeJSON(t, resp, &apiError)
diff --git a/integrations/api_repo_file_delete_test.go b/integrations/api_repo_file_delete_test.go
index e9029a669b9..2f5f9028a81 100644
--- a/integrations/api_repo_file_delete_test.go
+++ b/integrations/api_repo_file_delete_test.go
@@ -11,8 +11,8 @@ import (
 	"testing"
 
 	"code.gitea.io/gitea/models"
-	"code.gitea.io/gitea/modules/base"
 	"code.gitea.io/gitea/modules/context"
+	"code.gitea.io/gitea/modules/setting"
 	api "code.gitea.io/gitea/modules/structs"
 
 	"github.com/stretchr/testify/assert"
@@ -102,7 +102,7 @@ func TestAPIDeleteFile(t *testing.T) {
 		resp = session.MakeRequest(t, req, http.StatusInternalServerError)
 		expectedAPIError := context.APIError{
 			Message: "sha does not match [given: " + deleteFileOptions.SHA + ", expected: " + correctSHA + "]",
-			URL:     base.DocURL,
+			URL:     setting.API.SwaggerURL,
 		}
 		var apiError context.APIError
 		DecodeJSON(t, resp, &apiError)
diff --git a/integrations/api_repo_file_update_test.go b/integrations/api_repo_file_update_test.go
index eab7090df68..90fecf59d01 100644
--- a/integrations/api_repo_file_update_test.go
+++ b/integrations/api_repo_file_update_test.go
@@ -13,7 +13,6 @@ import (
 	"testing"
 
 	"code.gitea.io/gitea/models"
-	"code.gitea.io/gitea/modules/base"
 	"code.gitea.io/gitea/modules/context"
 	"code.gitea.io/gitea/modules/git"
 	"code.gitea.io/gitea/modules/setting"
@@ -173,7 +172,7 @@ func TestAPIUpdateFile(t *testing.T) {
 		resp = session.MakeRequest(t, req, http.StatusInternalServerError)
 		expectedAPIError := context.APIError{
 			Message: "sha does not match [given: " + updateFileOptions.SHA + ", expected: " + correctSHA + "]",
-			URL:     base.DocURL,
+			URL:     setting.API.SwaggerURL,
 		}
 		var apiError context.APIError
 		DecodeJSON(t, resp, &apiError)
diff --git a/modules/base/base.go b/modules/base/base.go
index 0ba72c328e2..026f68f646c 100644
--- a/modules/base/base.go
+++ b/modules/base/base.go
@@ -4,9 +4,6 @@
 
 package base
 
-// DocURL api doc url
-const DocURL = "https://godoc.org/github.com/go-gitea/go-sdk/gitea"
-
 type (
 	// TplName template relative path type
 	TplName string
diff --git a/modules/context/api.go b/modules/context/api.go
index 61f65147593..9be3fb512cf 100644
--- a/modules/context/api.go
+++ b/modules/context/api.go
@@ -7,14 +7,11 @@ package context
 
 import (
 	"fmt"
-	"net/url"
-	"path"
 	"strings"
 
 	"github.com/go-macaron/csrf"
 
 	"code.gitea.io/gitea/models"
-	"code.gitea.io/gitea/modules/base"
 	"code.gitea.io/gitea/modules/git"
 	"code.gitea.io/gitea/modules/log"
 	"code.gitea.io/gitea/modules/setting"
@@ -76,7 +73,7 @@ func (ctx *APIContext) Error(status int, title string, obj interface{}) {
 
 	ctx.JSON(status, APIError{
 		Message: message,
-		URL:     base.DocURL,
+		URL:     setting.API.SwaggerURL,
 	})
 }
 
@@ -180,15 +177,9 @@ func (ctx *APIContext) NotFound(objs ...interface{}) {
 		}
 	}
 
-	u, err := url.Parse(setting.AppURL)
-	if err != nil {
-		ctx.Error(500, "Invalid AppURL", err)
-		return
-	}
-	u.Path = path.Join(u.Path, "api", "swagger")
 	ctx.JSON(404, map[string]interface{}{
 		"message":           message,
-		"documentation_url": u.String(),
+		"documentation_url": setting.API.SwaggerURL,
 		"errors":            errors,
 	})
 }
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index b550836bc16..5471a0b61d7 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -297,12 +297,14 @@ var (
 	// API settings
 	API = struct {
 		EnableSwagger          bool
+		SwaggerURL             string
 		MaxResponseItems       int
 		DefaultPagingNum       int
 		DefaultGitTreesPerPage int
 		DefaultMaxBlobSize     int64
 	}{
 		EnableSwagger:          true,
+		SwaggerURL:             "",
 		MaxResponseItems:       50,
 		DefaultPagingNum:       30,
 		DefaultGitTreesPerPage: 1000,
@@ -581,17 +583,17 @@ func NewContext() {
 	AppURL = strings.TrimRight(AppURL, "/") + "/"
 
 	// Check if has app suburl.
-	url, err := url.Parse(AppURL)
+	appURL, err := url.Parse(AppURL)
 	if err != nil {
 		log.Fatal("Invalid ROOT_URL '%s': %s", AppURL, err)
 	}
 	// Suburl should start with '/' and end without '/', such as '/{subpath}'.
 	// This value is empty if site does not have sub-url.
-	AppSubURL = strings.TrimSuffix(url.Path, "/")
+	AppSubURL = strings.TrimSuffix(appURL.Path, "/")
 	AppSubURLDepth = strings.Count(AppSubURL, "/")
 	// Check if Domain differs from AppURL domain than update it to AppURL's domain
 	// TODO: Can be replaced with url.Hostname() when minimal GoLang version is 1.8
-	urlHostname := strings.SplitN(url.Host, ":", 2)[0]
+	urlHostname := strings.SplitN(appURL.Host, ":", 2)[0]
 	if urlHostname != Domain && net.ParseIP(urlHostname) == nil {
 		Domain = urlHostname
 	}
@@ -900,6 +902,10 @@ func NewContext() {
 		log.Fatal("Failed to map Metrics settings: %v", err)
 	}
 
+	u := *appURL
+	u.Path = path.Join(u.Path, "api", "swagger")
+	API.SwaggerURL = u.String()
+
 	newCron()
 	newGit()