/* * 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 your project to the Chat SDK. This publishing method is supported only for projects that have created a conversation flow, please refer to [Installation Guidelines](coze://web-sdk-guide) for installation methods.", 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: "将项目部署到Chat SDK。仅创建过对话流的项目支持该发布方式,安装方式请查看[安装指引](coze://web-sdk-guide)", }, }, { 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 }