feat: manually mirror opencoze's code from bytedance
Change-Id: I09a73aadda978ad9511264a756b2ce51f5761adf
This commit is contained in:
29
backend/domain/connector/service/connector.go
Normal file
29
backend/domain/connector/service/connector.go
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed 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 connector
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/coze-dev/coze-studio/backend/domain/connector/entity"
|
||||
)
|
||||
|
||||
type Connector interface {
|
||||
List(ctx context.Context) ([]*entity.Connector, error)
|
||||
GetByIDs(ctx context.Context, ids []int64) (map[int64]*entity.Connector, error)
|
||||
GetByID(ctx context.Context, id int64) (*entity.Connector, error)
|
||||
}
|
||||
140
backend/domain/connector/service/connector_impl.go
Normal file
140
backend/domain/connector/service/connector_impl.go
Normal file
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed 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 connector
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/coze-dev/coze-studio/backend/api/model/crossdomain/connector"
|
||||
"github.com/coze-dev/coze-studio/backend/domain/connector/entity"
|
||||
"github.com/coze-dev/coze-studio/backend/infra/contract/storage"
|
||||
"github.com/coze-dev/coze-studio/backend/pkg/errorx"
|
||||
"github.com/coze-dev/coze-studio/backend/pkg/i18n"
|
||||
"github.com/coze-dev/coze-studio/backend/pkg/lang/conv"
|
||||
"github.com/coze-dev/coze-studio/backend/types/consts"
|
||||
"github.com/coze-dev/coze-studio/backend/types/errno"
|
||||
)
|
||||
|
||||
type connectorImpl struct {
|
||||
tos storage.Storage
|
||||
}
|
||||
|
||||
func NewService(tos storage.Storage) Connector {
|
||||
return &connectorImpl{
|
||||
tos: tos,
|
||||
}
|
||||
}
|
||||
|
||||
var i18n2ConnectorDesc = map[i18n.Locale]map[int64]string{
|
||||
i18n.LocaleEN: {
|
||||
consts.WebSDKConnectorID: "Deploy the bot as a Web SDK",
|
||||
consts.APIConnectorID: "Supports OAuth 2.0 and personal access tokens",
|
||||
consts.CozeConnectorID: "Coze",
|
||||
},
|
||||
}
|
||||
|
||||
func (c *connectorImpl) AllConnectorInfo(ctx context.Context) []*entity.Connector {
|
||||
connectors := []*entity.Connector{
|
||||
{
|
||||
Connector: &connector.Connector{
|
||||
ID: consts.WebSDKConnectorID,
|
||||
Name: "Chat SDK",
|
||||
URI: "default_icon/connector-chat-sdk.jpg",
|
||||
Desc: "将Bot部署为Web SDK",
|
||||
},
|
||||
},
|
||||
{
|
||||
Connector: &connector.Connector{
|
||||
ID: consts.APIConnectorID,
|
||||
Name: "API",
|
||||
URI: "default_icon/connector-api.jpg",
|
||||
Desc: "支持 OAuth 2.0 和个人访问令牌",
|
||||
},
|
||||
},
|
||||
{
|
||||
Connector: &connector.Connector{
|
||||
ID: consts.CozeConnectorID,
|
||||
Name: "coze",
|
||||
URI: "default_icon/connector-coze.png",
|
||||
Desc: "Coze",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
locale := i18n.GetLocale(ctx)
|
||||
for _, connector := range connectors {
|
||||
i18nDesc, ok := i18n2ConnectorDesc[locale][connector.ID]
|
||||
if ok {
|
||||
connector.Desc = i18nDesc
|
||||
}
|
||||
}
|
||||
|
||||
return connectors
|
||||
}
|
||||
|
||||
func (c *connectorImpl) List(ctx context.Context) ([]*entity.Connector, error) {
|
||||
allConnectors := c.AllConnectorInfo(ctx)
|
||||
res := make([]*entity.Connector, 0, len(allConnectors))
|
||||
|
||||
for _, connector := range allConnectors {
|
||||
var err error
|
||||
connector.URL, err = c.tos.GetObjectUrl(ctx, connector.URI)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
res = append(res, connector)
|
||||
}
|
||||
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (c *connectorImpl) GetByID(ctx context.Context, id int64) (*entity.Connector, error) {
|
||||
res, err := c.GetByIDs(ctx, []int64{id})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
connector, ok := res[id]
|
||||
if !ok {
|
||||
return nil, errorx.New(errno.ErrConnectorNotFound, errorx.KV("id", conv.Int64ToStr(id)))
|
||||
}
|
||||
|
||||
return connector, nil
|
||||
}
|
||||
|
||||
func (c *connectorImpl) GetByIDs(ctx context.Context, ids []int64) (map[int64]*entity.Connector, error) {
|
||||
connectorsMap := make(map[int64]*entity.Connector, len(ids))
|
||||
allConnectors := c.AllConnectorInfo(ctx)
|
||||
|
||||
for _, connector := range allConnectors {
|
||||
connectorsMap[connector.ID] = connector
|
||||
}
|
||||
|
||||
cr := make(map[int64]*entity.Connector, len(ids))
|
||||
for _, id := range ids {
|
||||
if connector, ok := connectorsMap[id]; ok {
|
||||
var err error
|
||||
connector.URL, err = c.tos.GetObjectUrl(ctx, connector.URI)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cr[id] = connector
|
||||
}
|
||||
}
|
||||
return cr, nil
|
||||
}
|
||||
44
backend/domain/connector/service/connector_impl_test.go
Normal file
44
backend/domain/connector/service/connector_impl_test.go
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed 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 connector
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestConnectorImpl_List(t *testing.T) {
|
||||
// svc := NewService()
|
||||
// connectors, err := svc.List(context.Background())
|
||||
// if err != nil {
|
||||
// t.Fatal(err)
|
||||
// }
|
||||
// jsonString, err := json.Marshal(connectors)
|
||||
// assert.NoError(t, err)
|
||||
|
||||
// t.Log("list", string(jsonString))
|
||||
|
||||
// assert.Equal(t, 3, len(connectors))
|
||||
}
|
||||
|
||||
func TestConnectorImpl_Get(t *testing.T) {
|
||||
// svc := NewService()
|
||||
// connectors, err := svc.GetByIDs(context.Background(), []int64{999})
|
||||
// assert.NoError(t, err)
|
||||
|
||||
// assert.Equal(t, 1, len(connectors))
|
||||
// assert.Equal(t, int64(999), connectors[0].ID)
|
||||
}
|
||||
Reference in New Issue
Block a user