feat(grpc): add gRPC server infrastructure and schedule sync service

Add gRPC server support with configurable TLS, environment-based settings, and Wire injection. Implement schedule synchronization service with task runner integration for external course data fetching.

- Add gRPC configuration with env var overrides (APP_GRPC_ENABLED, APP_GRPC_PORT, etc.)
- Create gRPC server infrastructure with runner task management
- Implement ScheduleSyncService for course data synchronization
- Add sync endpoint to schedule handler for external system integration
- Update repository with context-aware batch delete operation
- Wire all dependencies including zap logger for structured logging
This commit is contained in:
2026-03-13 20:40:20 +08:00
parent cf36b1350d
commit c561a0bb0c
20 changed files with 3241 additions and 5 deletions

25
internal/wire/grpc.go Normal file
View File

@@ -0,0 +1,25 @@
package wire
import (
"carrot_bbs/internal/config"
"carrot_bbs/internal/grpc/runner"
"github.com/google/wire"
"go.uber.org/zap"
)
// GRPCSet gRPC 相关的 Provider Set
var GRPCSet = wire.NewSet(
ProvideGRPCServer,
ProvideTaskManager,
)
// ProvideGRPCServer 提供 gRPC 服务器
func ProvideGRPCServer(cfg *config.Config, logger *zap.Logger) *runner.Server {
return runner.NewServer(&cfg.GRPC, logger)
}
// ProvideTaskManager 提供 TaskManager
func ProvideTaskManager(server *runner.Server) *runner.TaskManager {
return server.GetTaskManager()
}

View File

@@ -22,7 +22,6 @@ var HandlerSet = wire.NewSet(
handler.NewPushHandler,
handler.NewStickerHandler,
handler.NewVoteHandler,
handler.NewScheduleHandler,
// 需要特殊处理的 Handler
ProvidePostHandler,
@@ -30,6 +29,7 @@ var HandlerSet = wire.NewSet(
ProvideSystemMessageHandler,
ProvideGroupHandler,
ProvideGorseHandler,
ProvideScheduleHandler,
)
// ProvidePostHandler 提供帖子处理器
@@ -72,3 +72,11 @@ func ProvideGroupHandler(
func ProvideGorseHandler(cfg *config.Config, db *gorm.DB) *handler.GorseHandler {
return handler.NewGorseHandler(cfg.Gorse, db)
}
// ProvideScheduleHandler 提供课表处理器
func ProvideScheduleHandler(
scheduleService service.ScheduleService,
scheduleSyncService service.ScheduleSyncService,
) *handler.ScheduleHandler {
return handler.NewScheduleHandler(scheduleService, scheduleSyncService)
}

View File

@@ -16,6 +16,7 @@ import (
"carrot_bbs/internal/repository"
"github.com/google/wire"
"go.uber.org/zap"
"gorm.io/gorm"
)
@@ -24,6 +25,9 @@ var InfrastructureSet = wire.NewSet(
// 配置
ProvideConfig,
// 日志
ProvideLogger,
// 数据库
ProvideDB,
@@ -119,3 +123,12 @@ func ProvideS3Client(cfg *config.Config) (*s3.Client, error) {
func ProvideTransactionManager(db *gorm.DB) repository.TransactionManager {
return repository.NewTransactionManager(db)
}
// ProvideLogger 提供 Zap Logger
func ProvideLogger() *zap.Logger {
logger, err := zap.NewProduction()
if err != nil {
log.Fatalf("Failed to create logger: %v", err)
}
return logger
}

View File

@@ -8,4 +8,5 @@ var AllSet = wire.NewSet(
RepositorySet,
ServiceSet,
HandlerSet,
GRPCSet,
)

View File

@@ -3,6 +3,7 @@ package wire
import (
"carrot_bbs/internal/cache"
"carrot_bbs/internal/config"
"carrot_bbs/internal/grpc/runner"
"carrot_bbs/internal/pkg/email"
"carrot_bbs/internal/pkg/gorse"
"carrot_bbs/internal/pkg/openai"
@@ -12,6 +13,7 @@ import (
"carrot_bbs/internal/service"
"github.com/google/wire"
"go.uber.org/zap"
"gorm.io/gorm"
)
@@ -36,6 +38,7 @@ var ServiceSet = wire.NewSet(
ProvideVoteService,
ProvideChatService,
ProvideScheduleService,
ProvideScheduleSyncService,
ProvideGroupService,
ProvideUploadService,
)
@@ -168,6 +171,15 @@ func ProvideScheduleService(
return service.NewScheduleService(scheduleRepo)
}
// ProvideScheduleSyncService 提供课表同步服务
func ProvideScheduleSyncService(
taskManager *runner.TaskManager,
scheduleRepo repository.ScheduleRepository,
logger *zap.Logger,
) service.ScheduleSyncService {
return service.NewScheduleSyncService(taskManager, scheduleRepo, logger)
}
// ProvideGroupService 提供群组服务
func ProvideGroupService(
db *gorm.DB,