blob: d40bfc98008581bbb222ae158532a8a92815ad81 [file]
/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package plugin
import (
"encoding/json"
"fmt"
"net/http"
"github.com/apache/incubator-devlake/core/dal"
"github.com/apache/incubator-devlake/core/errors"
"github.com/go-playground/validator/v10"
)
// ApiConnection represents a API Connection
type ApiConnection interface {
GetEndpoint() string
GetProxy() string
GetRateLimitPerHour() int
}
type CacheableConnection interface {
ApiConnection
GetHash() string
}
// ApiAuthenticator is to be implemented by a Concreate Connection if Authorization is required
type ApiAuthenticator interface {
// SetupAuthentication is a hook function for connection to set up authentication for the HTTP request
// before sending it to the server
SetupAuthentication(request *http.Request) errors.Error
}
// TODO: deprecated, remove
// ConnectionValidator represents the API Connection would validate its fields with customized logic
type ConnectionValidator interface {
ValidateConnection(connection interface{}, validator *validator.Validate) errors.Error
}
// PrepareApiClient is to be implemented by the concrete Connection which requires
// preparation for the ApiClient created by NewApiClientFromConnection, i.e. fetch token for future requests
type PrepareApiClient interface {
PrepareApiClient(apiClient ApiClient) errors.Error
}
// MultiAuth
const (
AUTH_METHOD_BASIC = "BasicAuth"
AUTH_METHOD_TOKEN = "AccessToken"
AUTH_METHOD_APPKEY = "AppKey"
)
var ALL_AUTH = map[string]bool{
AUTH_METHOD_BASIC: true,
AUTH_METHOD_TOKEN: true,
AUTH_METHOD_APPKEY: true,
}
// MultiAuthenticator represents the API Connection supports multiple authorization methods
type MultiAuthenticator interface {
GetAuthMethod() string
}
// BasicAuthenticator represents HTTP Basic Authentication
type BasicAuthenticator interface {
GetBasicAuthenticator() ApiAuthenticator
}
// AccessTokenAuthenticator represents HTTP Bearer Authentication with Access Token
type AccessTokenAuthenticator interface {
GetAccessTokenAuthenticator() ApiAuthenticator
}
// AppKeyAuthenticator represents the API Key and Secret authentication mechanism
type AppKeyAuthenticator interface {
GetAppKeyAuthenticator() ApiAuthenticator
}
// Scope represents the top level entity for a data source, i.e. github repo,
// gitlab project, jira board. They turn into repo, board in Domain Layer. In
// Apache Devlake, a Project is essentially a set of these top level entities,
// for the framework to maintain these relationships dynamically and
// automatically, all Domain Layer Top Level Entities should implement this
// interface
type Scope interface {
ScopeId() string
ScopeName() string
TableName() string
}
type ToolLayerConnection interface {
dal.Tabler
ConnectionId() uint64
}
type ToolLayerApiConnection interface {
ApiConnection
ToolLayerConnection
}
type ToolLayerScope interface {
dal.Tabler
Scope
ScopeFullName() string
ScopeParams() interface{}
ScopeConnectionId() uint64
ScopeScopeConfigId() uint64
}
type ToolLayerScopeConfig interface {
dal.Tabler
ScopeConfigId() uint64
ScopeConfigConnectionId() uint64
}
type ApiScope interface {
ConvertApiScope() ToolLayerScope
}
type ApiGroup interface {
GroupId() string
GroupName() string
}
func MarshalScopeParams(params interface{}) string {
bytes, err := json.Marshal(params)
if err != nil {
panic(fmt.Errorf("Failed to marshal %v, due to: %v", params, err))
}
return string(bytes)
}