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

28
backend/cmd/api/main.go Normal file
View File

@@ -0,0 +1,28 @@
package main
import (
"fmt"
"github.com/chaitin/panda-wiki/setup"
)
// @title panda-wiki API
// @version 1.0
// @description panda-wiki API documentation
// @BasePath /
// @securityDefinitions.apikey bearerAuth
// @in header
// @name Authorization
// @description Type "Bearer" + a space + your token to authorize
func main() {
app, err := createApp()
if err != nil {
panic(err)
}
if err := setup.CheckInitCert(); err != nil {
panic(err)
}
port := app.Config.HTTP.Port
app.Logger.Info(fmt.Sprintf("Starting server on port %d", port))
app.HTTPServer.Echo.Logger.Fatal(app.HTTPServer.Echo.Start(fmt.Sprintf(":%d", port)))
}

39
backend/cmd/api/wire.go Normal file
View File

@@ -0,0 +1,39 @@
//go:build wireinject
package main
import (
"github.com/google/wire"
"github.com/chaitin/panda-wiki/config"
share "github.com/chaitin/panda-wiki/handler/share"
v1 "github.com/chaitin/panda-wiki/handler/v1"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/server/http"
"github.com/chaitin/panda-wiki/telemetry"
)
func createApp() (*App, error) {
wire.Build(
wire.Struct(new(App), "*"),
wire.NewSet(
config.ProviderSet,
log.ProviderSet,
telemetry.ProviderSet,
http.ProviderSet,
v1.ProviderSet,
share.ProviderSet,
),
)
return &App{}, nil
}
type App struct {
HTTPServer *http.HTTPServer
Handlers *v1.APIHandlers
ShareHandlers *share.ShareHandler
Config *config.Config
Logger *log.Logger
Telemetry *telemetry.Client
}

219
backend/cmd/api/wire_gen.go Normal file
View File

@@ -0,0 +1,219 @@
// Code generated by Wire. DO NOT EDIT.
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
import (
"github.com/chaitin/panda-wiki/config"
"github.com/chaitin/panda-wiki/handler"
"github.com/chaitin/panda-wiki/handler/share"
"github.com/chaitin/panda-wiki/handler/v1"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/middleware"
"github.com/chaitin/panda-wiki/mq"
"github.com/chaitin/panda-wiki/pkg/captcha"
cache2 "github.com/chaitin/panda-wiki/repo/cache"
ipdb2 "github.com/chaitin/panda-wiki/repo/ipdb"
mq2 "github.com/chaitin/panda-wiki/repo/mq"
pg2 "github.com/chaitin/panda-wiki/repo/pg"
"github.com/chaitin/panda-wiki/server/http"
"github.com/chaitin/panda-wiki/store/cache"
"github.com/chaitin/panda-wiki/store/ipdb"
"github.com/chaitin/panda-wiki/store/pg"
"github.com/chaitin/panda-wiki/store/rag"
"github.com/chaitin/panda-wiki/store/s3"
"github.com/chaitin/panda-wiki/telemetry"
"github.com/chaitin/panda-wiki/usecase"
)
// Injectors from wire.go:
func createApp() (*App, error) {
configConfig, err := config.NewConfig()
if err != nil {
return nil, err
}
logger := log.NewLogger(configConfig)
readOnlyMiddleware := middleware.NewReadonlyMiddleware(logger)
cacheCache, err := cache.NewCache(configConfig)
if err != nil {
return nil, err
}
sessionMiddleware, err := middleware.NewSessionMiddleware(logger, configConfig, cacheCache)
if err != nil {
return nil, err
}
echo := http.NewEcho(logger, configConfig, readOnlyMiddleware, sessionMiddleware)
httpServer := &http.HTTPServer{
Echo: echo,
}
db, err := pg.NewDB(configConfig)
if err != nil {
return nil, err
}
userAccessRepository := pg2.NewUserAccessRepository(db, logger)
apiTokenRepo := pg2.NewAPITokenRepo(db, logger, cacheCache)
authMiddleware, err := middleware.NewAuthMiddleware(configConfig, logger, userAccessRepository, apiTokenRepo)
if err != nil {
return nil, err
}
ragService, err := rag.NewRAGService(configConfig, logger)
if err != nil {
return nil, err
}
knowledgeBaseRepository := pg2.NewKnowledgeBaseRepository(db, configConfig, logger, ragService)
nodeRepository := pg2.NewNodeRepository(db, logger)
navRepository := pg2.NewNavRepository(db, logger)
mqProducer, err := mq.NewMQProducer(configConfig, logger)
if err != nil {
return nil, err
}
ragRepository := mq2.NewRAGRepository(mqProducer)
userRepository := pg2.NewUserRepository(db, logger)
kbRepo := cache2.NewKBRepo(cacheCache)
knowledgeBaseUsecase, err := usecase.NewKnowledgeBaseUsecase(knowledgeBaseRepository, nodeRepository, navRepository, ragRepository, userRepository, ragService, kbRepo, logger, configConfig)
if err != nil {
return nil, err
}
shareAuthMiddleware := middleware.NewShareAuthMiddleware(logger, knowledgeBaseUsecase)
captchaCaptcha := captcha.NewCaptcha()
baseHandler := handler.NewBaseHandler(echo, logger, configConfig, authMiddleware, shareAuthMiddleware, captchaCaptcha)
userUsecase, err := usecase.NewUserUsecase(userRepository, logger, configConfig)
if err != nil {
return nil, err
}
userHandler := v1.NewUserHandler(echo, baseHandler, logger, userUsecase, authMiddleware, configConfig, cacheCache)
conversationRepository := pg2.NewConversationRepository(db, logger)
modelRepository := pg2.NewModelRepository(db, logger)
promptRepo := pg2.NewPromptRepo(db, logger)
llmUsecase := usecase.NewLLMUsecase(configConfig, ragService, conversationRepository, knowledgeBaseRepository, nodeRepository, modelRepository, promptRepo, logger)
knowledgeBaseHandler := v1.NewKnowledgeBaseHandler(baseHandler, echo, knowledgeBaseUsecase, llmUsecase, authMiddleware, logger)
appRepository := pg2.NewAppRepository(db, logger)
minioClient, err := s3.NewMinioClient(configConfig)
if err != nil {
return nil, err
}
authRepo := pg2.NewAuthRepo(db, logger, cacheCache)
systemSettingRepo := pg2.NewSystemSettingRepo(db, logger)
modelUsecase := usecase.NewModelUsecase(modelRepository, nodeRepository, ragRepository, ragService, logger, configConfig, knowledgeBaseRepository, systemSettingRepo)
nodeUsecase := usecase.NewNodeUsecase(nodeRepository, navRepository, appRepository, ragRepository, userRepository, knowledgeBaseRepository, llmUsecase, ragService, logger, minioClient, modelRepository, authRepo, modelUsecase)
nodeHandler := v1.NewNodeHandler(baseHandler, echo, nodeUsecase, authMiddleware, logger)
geoRepo := cache2.NewGeoCache(cacheCache, db, logger)
ipdbIPDB, err := ipdb.NewIPDB(configConfig, logger)
if err != nil {
return nil, err
}
ipAddressRepo := ipdb2.NewIPAddressRepo(ipdbIPDB, logger)
conversationUsecase := usecase.NewConversationUsecase(conversationRepository, nodeRepository, geoRepo, logger, ipAddressRepo, authRepo)
blockWordRepo := pg2.NewBlockWordRepo(db, logger)
chatUsecase, err := usecase.NewChatUsecase(llmUsecase, knowledgeBaseRepository, conversationUsecase, modelUsecase, appRepository, blockWordRepo, nodeRepository, authRepo, logger)
if err != nil {
return nil, err
}
appUsecase := usecase.NewAppUsecase(appRepository, authRepo, navRepository, nodeRepository, knowledgeBaseRepository, nodeUsecase, logger, configConfig, chatUsecase, cacheCache)
appHandler := v1.NewAppHandler(echo, baseHandler, logger, authMiddleware, appUsecase, modelUsecase, conversationUsecase, configConfig)
fileUsecase := usecase.NewFileUsecase(logger, minioClient, configConfig, systemSettingRepo)
fileHandler := v1.NewFileHandler(echo, baseHandler, logger, authMiddleware, minioClient, configConfig, fileUsecase)
modelHandler := v1.NewModelHandler(echo, baseHandler, logger, authMiddleware, modelUsecase, llmUsecase)
conversationHandler := v1.NewConversationHandler(echo, baseHandler, logger, authMiddleware, conversationUsecase)
mqConsumer, err := mq.NewMQConsumer(configConfig, logger)
if err != nil {
return nil, err
}
crawlerUsecase, err := usecase.NewCrawlerUsecase(logger, mqConsumer, cacheCache)
if err != nil {
return nil, err
}
crawlerHandler := v1.NewCrawlerHandler(echo, baseHandler, authMiddleware, logger, configConfig, crawlerUsecase, fileUsecase)
creationUsecase := usecase.NewCreationUsecase(logger, llmUsecase, modelUsecase)
creationHandler := v1.NewCreationHandler(echo, baseHandler, logger, creationUsecase)
statRepository := pg2.NewStatRepository(db, cacheCache)
statUseCase := usecase.NewStatUseCase(statRepository, nodeRepository, conversationRepository, appRepository, ipAddressRepo, geoRepo, authRepo, knowledgeBaseRepository, logger)
statHandler := v1.NewStatHandler(baseHandler, echo, statUseCase, logger, authMiddleware)
commentRepository := pg2.NewCommentRepository(db, logger)
commentUsecase := usecase.NewCommentUsecase(commentRepository, logger, nodeRepository, ipAddressRepo, authRepo)
commentHandler := v1.NewCommentHandler(echo, baseHandler, logger, authMiddleware, commentUsecase)
authUsecase, err := usecase.NewAuthUsecase(authRepo, logger, knowledgeBaseRepository, cacheCache)
if err != nil {
return nil, err
}
authV1Handler := v1.NewAuthV1Handler(echo, baseHandler, logger, authUsecase)
navUsecase := usecase.NewNavUsecase(navRepository, nodeRepository, ragRepository, logger)
navHandler := v1.NewNavHandler(baseHandler, echo, navUsecase, authMiddleware, logger)
apiHandlers := &v1.APIHandlers{
UserHandler: userHandler,
KnowledgeBaseHandler: knowledgeBaseHandler,
NodeHandler: nodeHandler,
AppHandler: appHandler,
FileHandler: fileHandler,
ModelHandler: modelHandler,
ConversationHandler: conversationHandler,
CrawlerHandler: crawlerHandler,
CreationHandler: creationHandler,
StatHandler: statHandler,
CommentHandler: commentHandler,
AuthV1Handler: authV1Handler,
NavHandler: navHandler,
}
shareNodeHandler := share.NewShareNodeHandler(baseHandler, echo, nodeUsecase, logger)
shareNavHandler := share.NewShareNavHandler(baseHandler, echo, navUsecase, logger)
shareAppHandler := share.NewShareAppHandler(echo, baseHandler, logger, appUsecase)
shareChatHandler := share.NewShareChatHandler(echo, baseHandler, logger, appUsecase, chatUsecase, authUsecase, conversationUsecase, modelUsecase)
sitemapUsecase := usecase.NewSitemapUsecase(nodeRepository, knowledgeBaseRepository, logger)
shareSitemapHandler := share.NewShareSitemapHandler(echo, baseHandler, sitemapUsecase, appUsecase, logger)
shareStatHandler := share.NewShareStatHandler(baseHandler, echo, statUseCase, logger)
shareCommentHandler := share.NewShareCommentHandler(echo, baseHandler, logger, commentUsecase, appUsecase)
shareAuthHandler := share.NewShareAuthHandler(echo, baseHandler, logger, knowledgeBaseUsecase, authUsecase)
shareConversationHandler := share.NewShareConversationHandler(baseHandler, echo, conversationUsecase, logger)
wechatRepository := pg2.NewWechatRepository(db, logger)
wechatServiceUsecase := usecase.NewWechatUsecase(logger, appUsecase, chatUsecase, wechatRepository, authRepo)
wecomUsecase := usecase.NewWecomUsecase(logger, cacheCache, appUsecase, chatUsecase, authRepo)
wechatAppUsecase := usecase.NewWechatAppUsecase(logger, appUsecase, chatUsecase, wechatRepository, authRepo, appRepository)
shareWechatHandler := share.NewShareWechatHandler(echo, baseHandler, logger, appUsecase, conversationUsecase, wechatServiceUsecase, wecomUsecase, wechatAppUsecase)
shareCaptchaHandler := share.NewShareCaptchaHandler(baseHandler, echo, logger)
openapiV1Handler := share.NewOpenapiV1Handler(echo, baseHandler, logger, authUsecase, appUsecase)
shareCommonHandler := share.NewShareCommonHandler(echo, baseHandler, logger, fileUsecase)
shareHandler := &share.ShareHandler{
ShareNodeHandler: shareNodeHandler,
ShareNavHandler: shareNavHandler,
ShareAppHandler: shareAppHandler,
ShareChatHandler: shareChatHandler,
ShareSitemapHandler: shareSitemapHandler,
ShareStatHandler: shareStatHandler,
ShareCommentHandler: shareCommentHandler,
ShareAuthHandler: shareAuthHandler,
ShareConversationHandler: shareConversationHandler,
ShareWechatHandler: shareWechatHandler,
ShareCaptchaHandler: shareCaptchaHandler,
OpenapiV1Handler: openapiV1Handler,
ShareCommonHandler: shareCommonHandler,
}
mcpRepository := pg2.NewMCPRepository(db, logger)
client, err := telemetry.NewClient(logger, knowledgeBaseRepository, modelUsecase, userUsecase, nodeRepository, conversationRepository, mcpRepository, configConfig)
if err != nil {
return nil, err
}
app := &App{
HTTPServer: httpServer,
Handlers: apiHandlers,
ShareHandlers: shareHandler,
Config: configConfig,
Logger: logger,
Telemetry: client,
}
return app, nil
}
// wire.go:
type App struct {
HTTPServer *http.HTTPServer
Handlers *v1.APIHandlers
ShareHandlers *share.ShareHandler
Config *config.Config
Logger *log.Logger
Telemetry *telemetry.Client
}

View File

@@ -0,0 +1,18 @@
package main
import (
"context"
)
func main() {
app, err := createApp()
if err != nil {
panic(err)
}
if err := app.MQConsumer.StartConsumerHandlers(context.Background()); err != nil {
panic(err)
}
if err := app.MQConsumer.Close(); err != nil {
panic(err)
}
}

View File

@@ -0,0 +1,31 @@
//go:build wireinject
package main
import (
"github.com/google/wire"
"github.com/chaitin/panda-wiki/config"
handler "github.com/chaitin/panda-wiki/handler/mq"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/mq"
)
func createApp() (*App, error) {
wire.Build(
wire.Struct(new(App), "*"),
wire.NewSet(
config.ProviderSet,
log.ProviderSet,
handler.ProviderSet,
),
)
return &App{}, nil
}
type App struct {
MQConsumer mq.MQConsumer
Config *config.Config
MQHandlers *handler.MQHandlers
StatCronHandler *handler.CronHandler
}

View File

@@ -0,0 +1,113 @@
// Code generated by Wire. DO NOT EDIT.
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
import (
"github.com/chaitin/panda-wiki/config"
mq3 "github.com/chaitin/panda-wiki/handler/mq"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/mq"
cache2 "github.com/chaitin/panda-wiki/repo/cache"
ipdb2 "github.com/chaitin/panda-wiki/repo/ipdb"
mq2 "github.com/chaitin/panda-wiki/repo/mq"
pg2 "github.com/chaitin/panda-wiki/repo/pg"
"github.com/chaitin/panda-wiki/store/cache"
"github.com/chaitin/panda-wiki/store/ipdb"
"github.com/chaitin/panda-wiki/store/pg"
"github.com/chaitin/panda-wiki/store/rag"
"github.com/chaitin/panda-wiki/store/s3"
"github.com/chaitin/panda-wiki/usecase"
)
// Injectors from wire.go:
func createApp() (*App, error) {
configConfig, err := config.NewConfig()
if err != nil {
return nil, err
}
logger := log.NewLogger(configConfig)
mqConsumer, err := mq.NewMQConsumer(configConfig, logger)
if err != nil {
return nil, err
}
ragService, err := rag.NewRAGService(configConfig, logger)
if err != nil {
return nil, err
}
db, err := pg.NewDB(configConfig)
if err != nil {
return nil, err
}
nodeRepository := pg2.NewNodeRepository(db, logger)
knowledgeBaseRepository := pg2.NewKnowledgeBaseRepository(db, configConfig, logger, ragService)
conversationRepository := pg2.NewConversationRepository(db, logger)
modelRepository := pg2.NewModelRepository(db, logger)
promptRepo := pg2.NewPromptRepo(db, logger)
llmUsecase := usecase.NewLLMUsecase(configConfig, ragService, conversationRepository, knowledgeBaseRepository, nodeRepository, modelRepository, promptRepo, logger)
mqProducer, err := mq.NewMQProducer(configConfig, logger)
if err != nil {
return nil, err
}
ragRepository := mq2.NewRAGRepository(mqProducer)
systemSettingRepo := pg2.NewSystemSettingRepo(db, logger)
modelUsecase := usecase.NewModelUsecase(modelRepository, nodeRepository, ragRepository, ragService, logger, configConfig, knowledgeBaseRepository, systemSettingRepo)
ragmqHandler, err := mq3.NewRAGMQHandler(mqConsumer, logger, ragService, nodeRepository, knowledgeBaseRepository, llmUsecase, modelUsecase)
if err != nil {
return nil, err
}
ragDocUpdateHandler, err := mq3.NewRagDocUpdateHandler(mqConsumer, logger, nodeRepository)
if err != nil {
return nil, err
}
cacheCache, err := cache.NewCache(configConfig)
if err != nil {
return nil, err
}
statRepository := pg2.NewStatRepository(db, cacheCache)
appRepository := pg2.NewAppRepository(db, logger)
ipdbIPDB, err := ipdb.NewIPDB(configConfig, logger)
if err != nil {
return nil, err
}
ipAddressRepo := ipdb2.NewIPAddressRepo(ipdbIPDB, logger)
geoRepo := cache2.NewGeoCache(cacheCache, db, logger)
authRepo := pg2.NewAuthRepo(db, logger, cacheCache)
statUseCase := usecase.NewStatUseCase(statRepository, nodeRepository, conversationRepository, appRepository, ipAddressRepo, geoRepo, authRepo, knowledgeBaseRepository, logger)
navRepository := pg2.NewNavRepository(db, logger)
userRepository := pg2.NewUserRepository(db, logger)
minioClient, err := s3.NewMinioClient(configConfig)
if err != nil {
return nil, err
}
nodeUsecase := usecase.NewNodeUsecase(nodeRepository, navRepository, appRepository, ragRepository, userRepository, knowledgeBaseRepository, llmUsecase, ragService, logger, minioClient, modelRepository, authRepo, modelUsecase)
cronHandler, err := mq3.NewCronHandler(logger, statRepository, nodeRepository, statUseCase, nodeUsecase)
if err != nil {
return nil, err
}
mqHandlers := &mq3.MQHandlers{
RAGMQHandler: ragmqHandler,
RagDocUpdateHandler: ragDocUpdateHandler,
StatCronHandler: cronHandler,
}
app := &App{
MQConsumer: mqConsumer,
Config: configConfig,
MQHandlers: mqHandlers,
StatCronHandler: cronHandler,
}
return app, nil
}
// wire.go:
type App struct {
MQConsumer mq.MQConsumer
Config *config.Config
MQHandlers *mq3.MQHandlers
StatCronHandler *mq3.CronHandler
}

View File

@@ -0,0 +1,11 @@
package main
func main() {
app, err := createApp()
if err != nil {
panic(err)
}
if err := app.MigrationManager.Execute(); err != nil {
panic(err)
}
}

View File

@@ -0,0 +1,28 @@
//go:build wireinject
package main
import (
"github.com/google/wire"
"github.com/chaitin/panda-wiki/config"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/migration"
)
func createApp() (*App, error) {
wire.Build(
wire.Struct(new(App), "*"),
wire.NewSet(
config.ProviderSet,
log.ProviderSet,
migration.ProviderSet,
),
)
return &App{}, nil
}
type App struct {
Config *config.Config
MigrationManager *migration.Manager
}

View File

@@ -0,0 +1,100 @@
// Code generated by Wire. DO NOT EDIT.
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
import (
"github.com/chaitin/panda-wiki/config"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/migration"
"github.com/chaitin/panda-wiki/migration/fns"
"github.com/chaitin/panda-wiki/mq"
cache2 "github.com/chaitin/panda-wiki/repo/cache"
mq2 "github.com/chaitin/panda-wiki/repo/mq"
pg2 "github.com/chaitin/panda-wiki/repo/pg"
"github.com/chaitin/panda-wiki/store/cache"
"github.com/chaitin/panda-wiki/store/pg"
"github.com/chaitin/panda-wiki/store/rag"
"github.com/chaitin/panda-wiki/store/s3"
"github.com/chaitin/panda-wiki/usecase"
)
// Injectors from wire.go:
func createApp() (*App, error) {
configConfig, err := config.NewConfig()
if err != nil {
return nil, err
}
db, err := pg.NewDB(configConfig)
if err != nil {
return nil, err
}
logger := log.NewLogger(configConfig)
nodeRepository := pg2.NewNodeRepository(db, logger)
navRepository := pg2.NewNavRepository(db, logger)
appRepository := pg2.NewAppRepository(db, logger)
mqProducer, err := mq.NewMQProducer(configConfig, logger)
if err != nil {
return nil, err
}
ragRepository := mq2.NewRAGRepository(mqProducer)
userRepository := pg2.NewUserRepository(db, logger)
ragService, err := rag.NewRAGService(configConfig, logger)
if err != nil {
return nil, err
}
knowledgeBaseRepository := pg2.NewKnowledgeBaseRepository(db, configConfig, logger, ragService)
conversationRepository := pg2.NewConversationRepository(db, logger)
modelRepository := pg2.NewModelRepository(db, logger)
promptRepo := pg2.NewPromptRepo(db, logger)
llmUsecase := usecase.NewLLMUsecase(configConfig, ragService, conversationRepository, knowledgeBaseRepository, nodeRepository, modelRepository, promptRepo, logger)
minioClient, err := s3.NewMinioClient(configConfig)
if err != nil {
return nil, err
}
cacheCache, err := cache.NewCache(configConfig)
if err != nil {
return nil, err
}
authRepo := pg2.NewAuthRepo(db, logger, cacheCache)
systemSettingRepo := pg2.NewSystemSettingRepo(db, logger)
modelUsecase := usecase.NewModelUsecase(modelRepository, nodeRepository, ragRepository, ragService, logger, configConfig, knowledgeBaseRepository, systemSettingRepo)
nodeUsecase := usecase.NewNodeUsecase(nodeRepository, navRepository, appRepository, ragRepository, userRepository, knowledgeBaseRepository, llmUsecase, ragService, logger, minioClient, modelRepository, authRepo, modelUsecase)
kbRepo := cache2.NewKBRepo(cacheCache)
knowledgeBaseUsecase, err := usecase.NewKnowledgeBaseUsecase(knowledgeBaseRepository, nodeRepository, navRepository, ragRepository, userRepository, ragService, kbRepo, logger, configConfig)
if err != nil {
return nil, err
}
migrationNodeVersion := fns.NewMigrationNodeVersion(logger, nodeUsecase, knowledgeBaseUsecase, ragRepository)
migrationCreateBotAuth := fns.NewMigrationCreateBotAuth(logger)
migrationFixGroupIds := fns.NewMigrationFixGroupIds(logger, ragRepository)
migrationUpdateNodeStatusUnreleased := fns.NewMigrationUpdateNodeStatusUnreleased(logger)
migrationCreateFirstNavs := fns.NewMigrationCreateFirstNavs(logger)
migrationFuncs := &migration.MigrationFuncs{
NodeMigration: migrationNodeVersion,
BotAuthMigration: migrationCreateBotAuth,
FixGroupIdsMigration: migrationFixGroupIds,
UpdateNodeStatusUnreleasedMigration: migrationUpdateNodeStatusUnreleased,
CreateFirstNavs: migrationCreateFirstNavs,
}
manager, err := migration.NewManager(db, logger, migrationFuncs)
if err != nil {
return nil, err
}
app := &App{
Config: configConfig,
MigrationManager: manager,
}
return app, nil
}
// wire.go:
type App struct {
Config *config.Config
MigrationManager *migration.Manager
}