func testConnection()

in backend/plugins/jira/api/connection_api.go [41:116]


func testConnection(ctx context.Context, connection models.JiraConn) (*JiraTestConnResponse, errors.Error) {
	// validate
	if vld != nil {
		e := vld.StructExcept(connection, "BasicAuth", "AccessToken")
		if e != nil {
			return nil, errors.Convert(e)
		}
	}
	// test connection
	apiClient, err := api.NewApiClientFromConnection(ctx, basicRes, &connection)
	if err != nil {
		return nil, err
	}
	// serverInfo checking
	res, err := apiClient.Get("api/2/serverInfo", nil, nil)
	if err != nil {
		return nil, err
	}
	serverInfoFail := "Failed testing the serverInfo: [ " + res.Request.URL.String() + " ]"
	// check if `/rest/` was missing
	if res.StatusCode == http.StatusNotFound && !strings.HasSuffix(connection.Endpoint, "/rest/") {
		endpointUrl, err := url.Parse(connection.Endpoint)
		if err != nil {
			return nil, errors.Convert(err)
		}
		refUrl, err := url.Parse("/rest/")
		if err != nil {
			return nil, errors.Convert(err)
		}
		restUrl := endpointUrl.ResolveReference(refUrl)
		return nil, errors.NotFound.New(fmt.Sprintf("Seems like an invalid Endpoint URL, please try %s", restUrl.String()))
	}
	if res.StatusCode == http.StatusUnauthorized || res.StatusCode == http.StatusForbidden {
		return nil, errors.HttpStatus(res.StatusCode).New("Please check your credential")
	}
	if res.StatusCode != http.StatusOK {
		return nil, errors.HttpStatus(res.StatusCode).New(fmt.Sprintf("%s unexpected status code: %d", serverInfoFail, res.StatusCode))
	}

	resBody := &models.JiraServerInfo{}
	err = api.UnmarshalResponse(res, resBody)
	if err != nil {
		return nil, errors.Convert(err)
	}
	// check version
	if resBody.DeploymentType == models.DeploymentServer {
		// only support 8.x.x or higher
		if versions := resBody.VersionNumbers; len(versions) == 3 && versions[0] < 7 {
			return nil, errors.Default.New(fmt.Sprintf("%s Support JIRA Server 7+ only", serverInfoFail))
		}
	}

	// verify credential
	getStatusFail := "an error occurred while making request to `/rest/agile/1.0/board`"
	res, err = apiClient.Get("agile/1.0/board", nil, nil)
	if err != nil {
		return nil, errors.Default.Wrap(err, getStatusFail)
	}
	getStatusFail += ": [ " + res.Request.URL.String() + " ]"

	errMsg := ""
	if res.StatusCode == http.StatusUnauthorized {
		return nil, errors.HttpStatus(res.StatusCode).New("Please check your credential")
	}

	if res.StatusCode != http.StatusOK {
		return nil, errors.HttpStatus(res.StatusCode).New(fmt.Sprintf("%s Unexpected [%s] status code: %d %s", getStatusFail, res.Request.URL, res.StatusCode, errMsg))
	}
	connection = connection.Sanitize()
	body := JiraTestConnResponse{}
	body.Success = true
	body.Message = "success"
	body.Connection = &connection

	return &body, nil
}