package service import ( "context" "fmt" "opencatd-open/internal/channel" "opencatd-open/internal/dao" "opencatd-open/internal/store" "opencatd-open/internal/pkg/crypto" ) type ChannelServiceImpl struct { channelDAO *dao.ChannelDAO channelSvc *channel.Service } func NewChannelService(channelDAO *dao.ChannelDAO, channelSvc *channel.Service) *ChannelServiceImpl { return &ChannelServiceImpl{ channelDAO: channelDAO, channelSvc: channelSvc, } } func (s *ChannelServiceImpl) Create(ctx context.Context, ch *store.Channel) error { return s.channelDAO.Create(ch) } func (s *ChannelServiceImpl) GetByID(ctx context.Context, id uint64) (*store.Channel, error) { return s.channelDAO.GetByID(id) } func (s *ChannelServiceImpl) List(ctx context.Context, limit, offset int) ([]*store.Channel, int64, error) { return s.channelDAO.List(limit, offset) } func (s *ChannelServiceImpl) ListEnabled(ctx context.Context) ([]*store.Channel, error) { return s.channelDAO.ListEnabled() } func (s *ChannelServiceImpl) Update(ctx context.Context, ch *store.Channel) error { return s.channelDAO.Update(ch) } func (s *ChannelServiceImpl) Delete(ctx context.Context, id uint64) error { return s.channelDAO.Delete(id) } // GetAPIKey decrypts the channel's API key func (s *ChannelServiceImpl) GetAPIKey(ctx context.Context, channelID uint64) (string, error) { ch, err := s.channelDAO.GetByID(channelID) if err != nil { return "", err } return crypto.Decrypt(ch.APIKeyEnc) } // SelectForModel selects the best channel for a model func (s *ChannelServiceImpl) SelectForModel(ctx context.Context, modelName string) (*store.Channel, error) { cands := s.channelSvc.Candidates(modelName) picked := s.channelSvc.Pick(cands) if picked == nil { return nil, fmt.Errorf("no enabled channels for model: %s", modelName) } return picked.Channel, nil } // BindModels binds models to a channel func (s *ChannelServiceImpl) BindModels(ctx context.Context, channelID uint64, bindings []store.ChannelModelBinding) error { return s.channelDAO.BindModels(channelID, bindings) } // GetChannelModels returns models bound to a channel func (s *ChannelServiceImpl) GetChannelModels(ctx context.Context, channelID uint64) ([]store.ChannelModelBinding, error) { return s.channelDAO.GetChannelModels(channelID) } // GetModelChannels returns channels for a model func (s *ChannelServiceImpl) GetModelChannels(ctx context.Context, modelName string) ([]*store.Channel, error) { return s.channelDAO.GetEnabledChannelsByModel(modelName) } // RecordSuccess records a successful request func (s *ChannelServiceImpl) RecordSuccess(channelID uint64) { s.channelSvc.RecordSuccess(channelID) } // RecordFailure records a failed request func (s *ChannelServiceImpl) RecordFailure(channelID uint64) { s.channelSvc.RecordFailure(channelID) }