Compare commits

..

17 Commits

Author SHA1 Message Date
2944321442@qq.com c7f561a55d .gitignore 2025-03-05 10:49:22 +08:00
2944321442@qq.com 30bead497e feat:update .gitignore 2025-03-05 10:44:19 +08:00
2944321442@qq.com 34ecd56cc4 feat:update .gitignore 2025-03-05 10:43:20 +08:00
2944321442@qq.com e4b46ea2e2 feat:添加服务模型映射功能 2025-03-05 10:15:05 +08:00
2944321442@qq.com 9e520be8b5 Merge branch 'main' into feature/dashen/model_mapping 2025-03-05 10:15:00 +08:00
2944321442@qq.com 2f7db1c871 feat: add service model mapping configuration 2025-03-04 15:19:27 +08:00
ningyv 0aa526b6d4 Merge pull request #222 from APIParkLab/feature/1.5-cx
fix: homepage Permission Configuration
2025-03-03 14:21:16 +08:00
ningyv 9c54fec65e fix: homepage Permission Configuration 2025-03-03 14:20:20 +08:00
ningyv 9315a5de4c Merge pull request #221 from APIParkLab/feature/1.5-cx
fix: homepage Permission Configuration
2025-03-03 14:15:27 +08:00
ningyv e09d35ec53 fix: homepage Permission Configuration 2025-03-03 14:14:20 +08:00
ningyv 07c904be75 Merge pull request #220 from APIParkLab/feature/1.6
fix: service configuration LLM API error
2025-03-03 09:51:49 +08:00
ningyv c2c6f2b3f6 fix: service configuration LLM API error 2025-03-03 09:51:14 +08:00
ningyv 0a3fdd61c8 Merge pull request #212 from APIParkLab/feature/1.5-cx
feat: feature/1.5-Data Integration
2025-02-20 18:36:42 +08:00
Dot.L 3c29a0a5c6 Merge pull request #211 from APIParkLab/feature/1.5-local-model
This pull request includes several changes aimed at improving error handling, adding new functionalities, and refactoring existing code. The changes primarily focus on the AI provider and controller modules.

Error Handling Improvements:
Added checks to ensure the client is initialized before performing operations in multiple functions (PullModel, StopPull, CancelPipeline, RemoveModel, ModelsInstalled) in ai-provider/local/executor.go. [1] [2] [3] [4]
New Functionalities:
Introduced OllamaConfig and OllamaConfigUpdate methods to the ILocalModelController interface and implemented them in controller/ai-local/iml.go. These methods allow for getting and updating the Ollama configuration. [1] [2]
Added functionality to automatically subscribe all applications to new services in the Create method of controller/service/iml.go.
Refactoring:
Refactored the initialization of the Ollama client by replacing the static address with a ResetOllamaAddress function in ai-provider/local/local.go.
Removed unused code and imports, such as the newAIUpstream function and upstream_dto import in controller/service/iml.go. [1] [2]
Codebase Simplification:
Simplified the OnInit method in controller/system/iml.go by consolidating the creation of default entities and adding subscription logic. [1] [2] [3]
Additional Changes:
Added new imports and modules to support the new functionalities and refactoring efforts. [1] [2] [3]
2025-02-20 14:31:31 +08:00
ningyv 06aa17d0c3 Merge pull request #210 from APIParkLab/feature/1.5-cx
feat: feature/1.5-Data Integration
2025-02-20 14:20:59 +08:00
ningyv 718f37e0da Merge pull request #209 from APIParkLab/feature/1.5-cx
feat: feature/1.5-Data Integration
2025-02-20 13:52:50 +08:00
ningyv e760ce953b Merge pull request #208 from APIParkLab/feature/1.5-cx
feat: feature/1.5-Data Integration
2025-02-20 11:37:47 +08:00
21 changed files with 239 additions and 50 deletions
+2
View File
@@ -5,3 +5,5 @@
/apipark
.gitlab-ci.yml
/.vscode/
.vscode/
.air.toml
@@ -241,8 +241,18 @@ function BasicLayout({ project = 'core' }: { project: string }) {
headerTitleRender={() => (
<div className="w-[192px] flex items-center">
<img className="h-[20px] cursor-pointer " src={Logo} onClick={() => navigator(mainPage)} />
<a className="align-text-top" href="https://github.com/APIParkLab/APIPark" target="_blank" className="ml-[5px] h-[25px] relative">
<img src="https://img.shields.io/github/stars/APIParkLab/APIPark?style=social" className='absolute top-[6px]' width={75} alt="" />
<a
className="align-text-top ml-[5px] h-[25px] relative"
href="https://github.com/APIParkLab/APIPark"
target="_blank"
rel="noreferrer"
>
<img
src="https://img.shields.io/github/stars/APIParkLab/APIPark?style=social"
className="absolute top-[6px]"
width={75}
alt=""
/>
</a>
</div>
)}
@@ -870,5 +870,6 @@
"K8097d6be": "is an open-source AI Gateway and API Portal that unifies access to OpenAI, DeepSeek, and other AI models. With enterprise-grade security features and real-time monitoring, it helps teams safely manage and share their AI APIs through a unified gateway.",
"Kf1ce5b3": "✨ We'd love your support on Github! Leave us a star or share your feedback. ",
"K3af90490": "⚡ You can quickly open the API for everyone to use via the following methods:",
"K6b99dce8": "address"
"K6b99dce8": "address",
"Kce2fcdbf": "No Permission"
}
@@ -892,5 +892,6 @@
"K8097d6be": "OpenAIやDeepSeekなどのさまざまなAIモデルに迅速にアクセスできるオープンソースのワンストップAIゲートウェイおよびAPIポータルです。統一されたリクエスト形式を使用して、モデルの切り替えによるビジネスへの影響を回避し、企業レベルのAPIセキュリティ(認証/レート制限/センシティブワードフィルタリング)とリアルタイムの使用量監視を提供します。チーム内でのAPI共有やコラボレーションをサポートし、インターフェースのサブスクリプション認証を管理してAPIのセキュリティを確保します。",
"Kf1ce5b3": "✨ Githubでスターを付けていただくか、製品フィードバックをお寄せください。",
"K3af90490": "⚡ 以下の方法で、APIをすぐに公開して皆さんに利用してもらえます:",
"K6b99dce8": "Ollama アドレス"
"K6b99dce8": "Ollama アドレス",
"Kce2fcdbf": "権限がありません"
}
@@ -823,5 +823,6 @@
"K8097d6be": "是开源的一站式 AI 网关与 API 门户,可快速接入 OpenAI/DeepSeek 等各类 AI 模型,通过统一请求格式避免模型切换对业务造成影响,提供企业级 API 安全防护(鉴权/限流/敏感词过滤)与实时用量监控,支持团队内 API 共享协作,管理接口订阅授权并保证您的API安全。",
"Kf1ce5b3": "✨ 欢迎在 Github 为我们 Star 或提供产品反馈意见。",
"K3af90490": "⚡您可快速通过以下方式开放API供大家使用:",
"K6b99dce8": "Ollama 地址"
"K6b99dce8": "Ollama 地址",
"Kce2fcdbf": "暂无权限"
}
@@ -892,5 +892,6 @@
"K8097d6be": "是一個開源的一站式 AI 閘道和 API 入口網站,可快速接入 OpenAI/DeepSeek 等各類 AI 模型,通過統一的請求格式避免模型切換對業務造成影響,提供企業級 API 安全防護(鑑權/限流/敏感詞過濾)與實時用量監控,支持團隊內 API 共享協作,管理介面訂閱授權並保證您的 API 安全。",
"Kf1ce5b3": "✨ 歡迎在 Github 為我們 Star 或提供產品反饋意見。",
"K3af90490": "⚡ 您可以快速通過以下方式開放 API 供大家使用:",
"K6b99dce8": "Ollama 地址"
"K6b99dce8": "Ollama 地址",
"Kce2fcdbf": "暫無權限"
}
@@ -36,6 +36,10 @@ export const AIModelGuide = () => {
* rest 服务卡片点击事件
*/
const restCardClick = async () => {
const permission = checkAccess('system.workspace.service.edit', accessData)
if (!permission) {
return message.warning($t('暂无权限'))
}
modal.confirm({
title: $t('添加 Rest 服务'),
content: <RestAIDeploy ref={restAiDeployRef}></RestAIDeploy>,
@@ -58,6 +62,10 @@ export const AIModelGuide = () => {
* AI 模型配置弹窗
*/
const aiCardClick = () => {
const permission = checkAccess('system.devops.ai_provider.edit', accessData)
if (!permission) {
return message.warning($t('暂无权限'))
}
// 更新弹窗
const updateEntityData = (data: any) => {
entityData.current = data
@@ -130,6 +138,10 @@ export const AIModelGuide = () => {
* 本地部署 AI 并生成 API
*/
const localModelCardClick = async () => {
const permission = checkAccess('system.devops.ai_provider.edit', accessData)
if (!permission) {
return message.warning($t('暂无权限'))
}
if (!ollamaAddress) {
navigateTo('/aisetting?status=unconfigure')
return
@@ -156,6 +168,10 @@ export const AIModelGuide = () => {
}
const deployDeepSeek = async (e: any) => {
e.stopPropagation()
const permission = checkAccess('system.devops.ai_provider.edit', accessData)
if (!permission) {
return message.warning($t('暂无权限'))
}
if (!ollamaAddress) {
navigateTo('/aisetting?status=unconfigure')
return
@@ -87,10 +87,12 @@ const SystemConfig = forwardRef<SystemConfigHandle>((_, ref) => {
if (serviceId && configuredProvider.length > 0) {
const providerID = form.getFieldValue('provider')
const provider = configuredProvider?.find((item: any) => item.id === providerID)
if (provider?.type === 'local') {
getLocalModelList(false)
} else {
getOnlineModelList(provider?.id, false)
if (provider) {
if (provider?.type === 'local') {
getLocalModelList(false)
} else {
getOnlineModelList(provider?.id, false)
}
}
}
} else {
+3
View File
@@ -17,6 +17,7 @@ require (
github.com/influxdata/influxdb-client-go/v2 v2.14.0
github.com/nsqio/go-nsq v1.1.0
github.com/ollama/ollama v0.5.8
github.com/stretchr/testify v1.9.0
github.com/urfave/cli v1.22.16
golang.org/x/crypto v0.31.0
gopkg.in/yaml.v3 v3.0.1
@@ -31,6 +32,7 @@ require (
github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
@@ -59,6 +61,7 @@ require (
github.com/oapi-codegen/runtime v1.0.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/redis/go-redis/v9 v9.5.3 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+2
View File
@@ -23,6 +23,7 @@ type CreateService struct {
Model *string `json:"model"`
AsApp *bool `json:"as_app"`
AsServer *bool `json:"as_server"`
ModelMapping string `json:"model_mapping"`
}
type EditService struct {
@@ -36,6 +37,7 @@ type EditService struct {
Model *string `json:"model"`
ApprovalType *string `json:"approval_type"`
State *string `json:"state"`
ModelMapping string `json:"model_mapping"`
}
type CreateApp struct {
+12 -10
View File
@@ -104,6 +104,7 @@ type Service struct {
AsApp bool `json:"as_app"`
ServiceKind string `json:"service_kind"`
State string `json:"state"`
ModelMapping string `json:"model_mapping"`
}
type App struct {
@@ -191,16 +192,17 @@ type ServiceDoc struct {
}
type ExportService struct {
Id string `json:"id"`
Name string `json:"name"`
Prefix string `json:"prefix,omitempty"`
Description string `json:"description"`
Team string `json:"team"`
ServiceType string `json:"service_type"`
Catalogue string `json:"catalogue"`
Tags []string `json:"tags"`
Logo string `json:"logo"`
Doc string `json:"doc"`
Id string `json:"id"`
Name string `json:"name"`
Prefix string `json:"prefix,omitempty"`
Description string `json:"description"`
Team string `json:"team"`
ServiceType string `json:"service_type"`
Catalogue string `json:"catalogue"`
Tags []string `json:"tags"`
Logo string `json:"logo"`
Doc string `json:"doc"`
ModelMapping string `json:"model_mapping"`
}
type ExportApp struct {
+26 -17
View File
@@ -19,6 +19,7 @@ import (
"github.com/eolinker/ap-account/service/role"
application_authorization "github.com/APIParkLab/APIPark/service/application-authorization"
service_model_mapping "github.com/APIParkLab/APIPark/service/service-model-mapping"
api_doc "github.com/APIParkLab/APIPark/service/api-doc"
@@ -68,6 +69,8 @@ type imlServiceModule struct {
apiService api.IAPIService `autowired:""`
apiDocService api_doc.IAPIDocService `autowired:""`
transaction store.ITransaction `autowired:""`
serviceModelMappingService service_model_mapping.IServiceModelMappingService `autowired:""`
}
func (i *imlServiceModule) ExportAll(ctx context.Context) ([]*service_dto.ExportService, error) {
@@ -116,11 +119,9 @@ func (i *imlServiceModule) ExportAll(ctx context.Context) ([]*service_dto.Export
items = append(items, info)
}
return items, nil
}
func (i *imlServiceModule) searchMyServices(ctx context.Context, teamId string, keyword string) ([]*service.Service, error) {
userID := utils.UserId(ctx)
condition := make(map[string]interface{})
condition["as_server"] = true
@@ -140,7 +141,6 @@ func (i *imlServiceModule) searchMyServices(ctx context.Context, teamId string,
condition["team"] = teamIds
return i.serviceService.Search(ctx, keyword, condition, "create_at desc")
}
}
func (i *imlServiceModule) SearchMyServices(ctx context.Context, teamId string, keyword string) ([]*service_dto.ServiceItem, error) {
@@ -182,7 +182,6 @@ func (i *imlServiceModule) Simple(ctx context.Context) ([]*service_dto.SimpleSer
items := make([]*service_dto.SimpleServiceItem, 0, len(services))
for _, p := range services {
items = append(items, &service_dto.SimpleServiceItem{
Id: p.Id,
Name: p.Name,
@@ -195,14 +194,12 @@ func (i *imlServiceModule) Simple(ctx context.Context) ([]*service_dto.SimpleSer
func (i *imlServiceModule) MySimple(ctx context.Context) ([]*service_dto.SimpleServiceItem, error) {
services, err := i.searchMyServices(ctx, "", "")
if err != nil {
return nil, err
}
items := make([]*service_dto.SimpleServiceItem, 0, len(services))
for _, p := range services {
items = append(items, &service_dto.SimpleServiceItem{
Id: p.Id,
Name: p.Name,
@@ -247,6 +244,13 @@ func (i *imlServiceModule) Get(ctx context.Context, id string) (*service_dto.Ser
}
}
serviceModelMapping, err := i.serviceModelMappingService.Get(ctx, id)
if err != nil {
return nil, err
}
s.ModelMapping = serviceModelMapping.Content
log.Infof("get service cost %d ms", time.Since(now).Milliseconds())
return s, nil
}
@@ -318,7 +322,6 @@ func toServiceItem(model *service.Service) *service_dto.ServiceItem {
}
func (i *imlServiceModule) Create(ctx context.Context, teamID string, input *service_dto.CreateService) (*service_dto.Service, error) {
if input.Id == "" {
input.Id = uuid.New().String()
}
@@ -356,7 +359,6 @@ func (i *imlServiceModule) Create(ctx context.Context, teamID string, input *ser
return nil, fmt.Errorf("ai service: model can not be empty")
}
mo.AdditionalConfig["model"] = *input.Model
}
if input.AsApp == nil {
// 默认值为false
@@ -388,6 +390,14 @@ func (i *imlServiceModule) Create(ctx context.Context, teamID string, input *ser
}
}
}
err := i.serviceModelMappingService.Save(ctx, &service_model_mapping.Save{
Sid: input.Id,
Content: input.ModelMapping,
})
if err != nil {
return err
}
return i.serviceService.Create(ctx, mo)
})
if err != nil {
@@ -410,7 +420,6 @@ func (i *imlServiceModule) Edit(ctx context.Context, id string, input *service_d
if input.Model != nil {
info.AdditionalConfig["model"] = *input.Model
}
}
err = i.transaction.Transaction(ctx, func(ctx context.Context) error {
serviceType := (*service.ServiceType)(input.ServiceType)
@@ -457,9 +466,15 @@ func (i *imlServiceModule) Edit(ctx context.Context, id string, input *service_d
}
}
}
err = i.serviceModelMappingService.Save(ctx, &service_model_mapping.Save{
Sid: id,
Content: input.ModelMapping,
})
if err != nil {
return err
}
return nil
})
if err != nil {
return nil, err
}
@@ -523,7 +538,6 @@ type imlServiceDocModule struct {
func (i *imlServiceDocModule) ServiceDoc(ctx context.Context, pid string) (*serviceDto.ServiceDoc, error) {
_, err := i.serviceService.Check(ctx, pid, map[string]bool{"as_server": true})
if err != nil {
return nil, err
}
@@ -555,7 +569,6 @@ func (i *imlServiceDocModule) ServiceDoc(ctx context.Context, pid string) (*serv
func (i *imlServiceDocModule) SaveServiceDoc(ctx context.Context, pid string, input *serviceDto.SaveServiceDoc) error {
_, err := i.serviceService.Check(ctx, pid, map[string]bool{"as_server": true})
if err != nil {
return err
}
@@ -737,7 +750,6 @@ func (i *imlAppModule) Search(ctx context.Context, teamId string, keyword string
}
func (i *imlAppModule) CreateApp(ctx context.Context, teamID string, input *service_dto.CreateApp) (*service_dto.App, error) {
if input.Id == "" {
input.Id = uuid.New().String()
}
@@ -759,9 +771,7 @@ func (i *imlAppModule) CreateApp(ctx context.Context, teamID string, input *serv
}
err = i.transaction.Transaction(ctx, func(ctx context.Context) error {
return i.serviceService.Create(ctx, mo)
})
if err != nil {
return nil, err
@@ -770,7 +780,7 @@ func (i *imlAppModule) CreateApp(ctx context.Context, teamID string, input *serv
}
func (i *imlAppModule) UpdateApp(ctx context.Context, appId string, input *service_dto.UpdateApp) (*service_dto.App, error) {
//userId := utils.UserId(ctx)
// userId := utils.UserId(ctx)
info, err := i.serviceService.Get(ctx, appId)
if err != nil {
return nil, err
@@ -907,7 +917,6 @@ func (i *imlAppModule) MySimpleApps(ctx context.Context, keyword string) ([]*ser
}
items := make([]*service_dto.SimpleAppItem, 0, len(services))
for _, p := range services {
items = append(items, &service_dto.SimpleAppItem{
Id: p.Id,
Name: p.Name,
+2 -1
View File
@@ -3,9 +3,10 @@ package service_doc
import (
"context"
"errors"
"github.com/APIParkLab/APIPark/service/universally/commit"
"time"
"github.com/APIParkLab/APIPark/service/universally/commit"
"github.com/eolinker/go-common/utils"
"gorm.io/gorm"
+2 -1
View File
@@ -2,9 +2,10 @@ package service_doc
import (
"context"
"github.com/APIParkLab/APIPark/service/universally/commit"
"reflect"
"github.com/APIParkLab/APIPark/service/universally/commit"
"github.com/eolinker/go-common/autowire"
)
+67
View File
@@ -0,0 +1,67 @@
package service_model_mapping
import (
"context"
"errors"
"time"
"github.com/APIParkLab/APIPark/stores/service"
"github.com/eolinker/go-common/utils"
"gorm.io/gorm"
)
var _ IServiceModelMappingService = (*imlServiceModelMappingService)(nil)
type imlServiceModelMappingService struct {
store service.IServiceModelMappingStore `autowired:""`
}
func (i *imlServiceModelMappingService) Get(ctx context.Context, sid string) (*ModelMapping, error) {
entity, err := i.store.First(ctx, map[string]interface{}{"sid": sid})
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return &ModelMapping{
Sid: sid,
Content: "",
}, nil
}
return nil, err
}
return FromEntity(entity), nil
}
func FromEntity(e *service.ModelMapping) *ModelMapping {
content := ""
if e.Content != "" {
content = e.Content
}
return &ModelMapping{
ID: e.Id,
Sid: e.Sid,
Content: content,
CreateAt: e.CreateAt,
UpdateAt: e.UpdateAt,
}
}
func (i *imlServiceModelMappingService) Save(ctx context.Context, input *Save) error {
info, err := i.store.First(ctx, map[string]interface{}{"sid": input.Sid})
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
userID := utils.UserId(ctx)
if info != nil {
info.Content = input.Content
info.Updater = userID
info.UpdateAt = time.Now()
return i.store.Save(ctx, info)
}
return i.store.Insert(ctx, &service.ModelMapping{
Sid: input.Sid,
Content: input.Content,
CreateAt: time.Now(),
UpdateAt: time.Now(),
Creator: userID,
Updater: userID,
})
}
+20
View File
@@ -0,0 +1,20 @@
package service_model_mapping
import (
"time"
)
type ModelMapping struct {
ID int64 `json:"id"`
Sid string `json:"sid"`
Content string `json:"content"`
Creator string `json:"creator"`
Updater string `json:"updater"`
CreateAt time.Time `json:"create_at"`
UpdateAt time.Time `json:"update_at"`
}
type Save struct {
Sid string `json:"sid" validate:"required"`
Content string `json:"content" validate:"required"`
}
+19
View File
@@ -0,0 +1,19 @@
package service_model_mapping
import (
"context"
"reflect"
"github.com/eolinker/go-common/autowire"
)
type IServiceModelMappingService interface {
Get(ctx context.Context, sid string) (*ModelMapping, error)
Save(ctx context.Context, input *Save) error
}
func init() {
autowire.Auto[IServiceModelMappingService](func() reflect.Value {
return reflect.ValueOf(new(imlServiceModelMappingService))
})
}
+3 -3
View File
@@ -14,9 +14,7 @@ import (
"github.com/APIParkLab/APIPark/stores/service"
)
var (
_ IServiceService = (*imlServiceService)(nil)
)
var _ IServiceService = (*imlServiceService)(nil)
type imlServiceService struct {
store service.IServiceStore `autowired:""`
@@ -154,9 +152,11 @@ func (i *imlServiceService) OnComplete() {
func labelHandler(e *service.Service) []string {
return []string{e.Name, e.UUID, e.Description}
}
func uniquestHandler(i *Create) []map[string]interface{} {
return []map[string]interface{}{{"uuid": i.Id}}
}
func createEntityHandler(i *Create) *service.Service {
cfg, _ := json.Marshal(i.AdditionalConfig)
now := time.Now()
+4 -6
View File
@@ -4,15 +4,14 @@ import (
"context"
"errors"
"fmt"
"github.com/eolinker/go-common/auto"
"github.com/eolinker/go-common/store"
"github.com/eolinker/go-common/utils"
"gorm.io/gorm"
)
var (
_ IServiceDelete = (*imlServiceDelete[any])(nil)
)
var _ IServiceDelete = (*imlServiceDelete[any])(nil)
type IServiceDelete interface {
Delete(ctx context.Context, uuid string) error
@@ -26,10 +25,12 @@ func NewDelete[E any](store store.ISearchStore[E]) IServiceDelete {
assert(new(E))
return &imlServiceDelete[E]{store: store}
}
func NewSoftDelete[E any](s store.ISearchStore[E]) IServiceDelete {
assert(new(E))
return &imlServiceSoftDelete[E]{store: s}
}
func (p *imlServiceDelete[E]) Delete(ctx context.Context, uuid string) error {
return p.store.Transaction(ctx, func(ctx context.Context) error {
o, err := p.store.First(ctx, map[string]interface{}{"uuid": uuid})
@@ -46,7 +47,6 @@ func (p *imlServiceDelete[E]) Delete(ctx context.Context, uuid string) error {
}
return p.store.SetLabels(ctx, idValue(o))
})
}
type imlServiceSoftDelete[E any] struct {
@@ -66,7 +66,5 @@ func (p *imlServiceSoftDelete[E]) Delete(ctx context.Context, uuid string) error
auto.Auto("operator", operator, o)
return p.store.SoftDelete(ctx, map[string]interface{}{"uuid": uuid})
})
}
+22 -1
View File
@@ -1,6 +1,8 @@
package service
import "time"
import (
"time"
)
type Service struct {
Id int64 `gorm:"column:id;type:BIGINT(20);AUTO_INCREMENT;NOT NULL;comment:id;primary_key;comment:主键ID;"`
@@ -27,6 +29,7 @@ type Service struct {
func (p *Service) IdValue() int64 {
return p.Id
}
func (p *Service) TableName() string {
return "service"
}
@@ -87,3 +90,21 @@ func (d *Doc) IdValue() int64 {
func (d *Doc) TableName() string {
return "server_doc"
}
type ModelMapping struct {
Id int64 `gorm:"column:id;type:BIGINT(20);AUTO_INCREMENT;NOT NULL;comment:PRIMARY ID;primary_key"`
Sid string `gorm:"size:36;not null;column:sid;comment:service uuid;uniqueIndex:unique_sid;"`
Content string `gorm:"type:text;not null;column:content;comment:mapping json"`
Creator string `gorm:"type:varchar(36);not null;column:creator;comment:creator" aovalue:"creator"`
Updater string `gorm:"type:varchar(36);not null;column:updater;comment:updater" aovalue:"updater"`
CreateAt time.Time `gorm:"type:timestamp;NOT NULL;DEFAULT:CURRENT_TIMESTAMP;column:create_at;comment:create_at"`
UpdateAt time.Time `gorm:"type:timestamp;NOT NULL;DEFAULT:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;column:update_at;comment:update_at"`
}
func (m *ModelMapping) TableName() string {
return "service_model_mapping"
}
func (m *ModelMapping) IdValue() int64 {
return m.Id
}
+13 -1
View File
@@ -1,10 +1,11 @@
package service
import (
"reflect"
"github.com/eolinker/go-common/autowire"
"github.com/eolinker/go-common/store"
)
import "reflect"
type IServiceStore interface {
store.ISearchStore[Service]
@@ -37,6 +38,14 @@ type imlAuthorizationStore struct {
store.SearchStore[Authorization]
}
type IServiceModelMappingStore interface {
store.ISearchStore[ModelMapping]
}
type imlServiceModelMappingStore struct {
store.SearchStore[ModelMapping]
}
func init() {
autowire.Auto[IServiceStore](func() reflect.Value {
return reflect.ValueOf(new(imlServiceStore))
@@ -52,4 +61,7 @@ func init() {
return reflect.ValueOf(new(imlServiceDocStore))
})
autowire.Auto[IServiceModelMappingStore](func() reflect.Value {
return reflect.ValueOf(new(imlServiceModelMappingStore))
})
}