package services import ( "context" "git.aiterp.net/rpdata/api/models" "git.aiterp.net/rpdata/api/models/changekeys" "git.aiterp.net/rpdata/api/repositories" "git.aiterp.net/rpdata/api/services/loaders" ) // ChannelService is an application service for dealing with channels. type ChannelService struct { channels repositories.ChannelRepository loader *loaders.ChannelLoader changeService *ChangeService authService *AuthService } func (s *ChannelService) Find(ctx context.Context, id string) (*models.Channel, error) { return s.loader.Load(id) } func (s *ChannelService) List(ctx context.Context, filter models.ChannelFilter) ([]*models.Channel, error) { if filter.LocationName != nil && filter.EventName != nil && filter.Logged != nil && filter.Limit == 0 && len(filter.Names) > 0 { channels, errs := s.loader.LoadAll(filter.Names) for _, err := range errs { if err != nil && err != repositories.ErrNotFound { return nil, err } } output := make([]*models.Channel, 0, len(channels)) for _, channel := range channels { if channel == nil { continue } output = append(output, channel) } return output, nil } return s.channels.List(ctx, filter) } func (s *ChannelService) Create(ctx context.Context, name string, logged, hub bool, eventName, locationName string) (*models.Channel, error) { err := s.authService.CheckPermission(ctx, "add", &models.Channel{}) if err != nil { return nil, err } channel, err := s.channels.Insert(ctx, models.Channel{ Name: name, Logged: logged, Hub: hub, EventName: eventName, LocationName: locationName, }) if err != nil { return nil, err } s.changeService.Submit(ctx, "Channel", "add", true, changekeys.Listed(channel), channel) return channel, nil } func (s *ChannelService) Ensure(ctx context.Context, name string) (*models.Channel, error) { channel, err := s.channels.Find(ctx, name) if err != nil { channel, err = s.channels.Insert(ctx, models.Channel{ Name: name, Logged: false, Hub: false, EventName: "", LocationName: "", }) if err != nil { return nil, err } s.changeService.Submit(ctx, "Channel", "add", true, changekeys.Listed(channel), channel) } return channel, nil } func (s *ChannelService) Update(ctx context.Context, name string, update models.ChannelUpdate) (*models.Channel, error) { channel, err := s.channels.Find(ctx, name) if err != nil { return nil, err } err = s.authService.CheckPermission(ctx, "edit", channel) if err != nil { return nil, err } channel, err = s.channels.Update(ctx, *channel, update) if err != nil { return nil, err } s.loader.Clear(channel.Name) s.changeService.Submit(ctx, "Channel", "edit", true, changekeys.Listed(channel), channel) return channel, nil } func (s *ChannelService) Delete(ctx context.Context, name string) (*models.Channel, error) { channel, err := s.channels.Find(ctx, name) if err != nil { return nil, err } err = s.authService.CheckPermission(ctx, "remove", channel) if err != nil { return nil, err } err = s.channels.Remove(ctx, *channel) if err != nil { return nil, err } s.changeService.Submit(ctx, "Channel", "remove", true, changekeys.Listed(channel), channel) s.loader.Clear(channel.Name) return channel, nil }