init push

This commit is contained in:
2026-05-21 19:52:45 +08:00
commit e3f75311ab
1280 changed files with 179173 additions and 0 deletions

View File

@@ -0,0 +1,115 @@
package fns
import (
"context"
"fmt"
"time"
"gorm.io/gorm"
"github.com/chaitin/panda-wiki/domain"
"github.com/chaitin/panda-wiki/log"
)
type MigrationCreateBotAuth struct {
Name string
logger *log.Logger
}
func NewMigrationCreateBotAuth(logger *log.Logger) *MigrationCreateBotAuth {
return &MigrationCreateBotAuth{
Name: "0002_create_bot_auth",
logger: logger,
}
}
func (m *MigrationCreateBotAuth) Execute(tx *gorm.DB) error {
ctx := context.Background()
// 获取所有机器人类型的应用
var apps []domain.App
if err := tx.WithContext(ctx).Where("type IN ?", []domain.AppType{
domain.AppTypeWidget,
domain.AppTypeDingTalkBot,
domain.AppTypeFeishuBot,
domain.AppTypeWechatBot,
domain.AppTypeWechatServiceBot,
domain.AppTypeDisCordBot,
domain.AppTypeWechatOfficialAccount,
}).Find(&apps).Error; err != nil {
return fmt.Errorf("failed to get apps: %w", err)
}
m.logger.Info("found apps for bot auth creation", log.Int("count", len(apps)))
for _, app := range apps {
sourceType := app.Type.ToSourceType()
if sourceType == "" {
m.logger.Warn("app type has no corresponding source type", log.String("app_id", app.ID), log.Any("app_type", uint8(app.Type)))
continue
}
// 检查是否需要创建认证记录(检查应用是否启用)
shouldCreateAuth := false
switch app.Type {
case domain.AppTypeWidget:
shouldCreateAuth = app.Settings.WidgetBotSettings.IsOpen
case domain.AppTypeDingTalkBot:
shouldCreateAuth = app.Settings.DingTalkBotIsEnabled != nil && *app.Settings.DingTalkBotIsEnabled
case domain.AppTypeFeishuBot:
shouldCreateAuth = app.Settings.FeishuBotIsEnabled != nil && *app.Settings.FeishuBotIsEnabled
case domain.AppTypeWechatBot:
shouldCreateAuth = app.Settings.WeChatAppIsEnabled != nil && *app.Settings.WeChatAppIsEnabled
case domain.AppTypeWechatServiceBot:
shouldCreateAuth = app.Settings.WeChatServiceIsEnabled != nil && *app.Settings.WeChatServiceIsEnabled
case domain.AppTypeDisCordBot:
shouldCreateAuth = app.Settings.DiscordBotIsEnabled != nil && *app.Settings.DiscordBotIsEnabled
case domain.AppTypeWechatOfficialAccount:
shouldCreateAuth = app.Settings.WechatOfficialAccountIsEnabled != nil && *app.Settings.WechatOfficialAccountIsEnabled
}
if !shouldCreateAuth {
m.logger.Debug("app is not enabled, skipping auth creation", log.String("app_id", app.ID), log.String("source_type", string(sourceType)))
continue
}
// 检查是否已存在该类型的认证记录
var existingAuthCount int64
if err := tx.WithContext(ctx).Model(&domain.Auth{}).
Where("kb_id = ? AND source_type = ?", app.KBID, string(sourceType)).
Count(&existingAuthCount).Error; err != nil {
return fmt.Errorf("failed to check existing auth for kb_id %s, source_type %s: %w", app.KBID, sourceType, err)
}
if existingAuthCount > 0 {
m.logger.Debug("auth already exists, skipping", log.String("kb_id", app.KBID), log.String("source_type", string(sourceType)))
continue
}
// 创建新的认证记录
auth := &domain.Auth{
KBID: app.KBID,
UnionID: fmt.Sprintf("bot_%s_%s", app.ID, sourceType),
SourceType: sourceType,
LastLoginTime: time.Now(),
UserInfo: domain.AuthUserInfo{
Username: sourceType.Name(),
},
}
if err := tx.WithContext(ctx).Create(auth).Error; err != nil {
return fmt.Errorf("failed to create auth for kb_id %s, source_type %s: %w", app.KBID, sourceType, err)
}
m.logger.Info("created bot auth",
log.String("kb_id", app.KBID),
log.String("app_id", app.ID),
log.String("source_type", string(sourceType)),
log.String("union_id", auth.UnionID),
log.Any("auth_id", auth.ID))
}
m.logger.Info("bot auth migration completed successfully")
return nil
}