Files
kandev/apps/backend/internal/notifications/controller/controller.go
T
2026-07-24 16:39:43 +01:00

105 lines
3.1 KiB
Go

package controller
import (
"context"
"strings"
"github.com/kandev/kandev/internal/notifications/dto"
"github.com/kandev/kandev/internal/notifications/models"
"github.com/kandev/kandev/internal/notifications/service"
userstore "github.com/kandev/kandev/internal/user/store"
)
type Controller struct {
service *service.Service
}
func NewController(svc *service.Service) *Controller {
return &Controller{service: svc}
}
func (c *Controller) ListProviders(ctx context.Context) (dto.NotificationProvidersResponse, error) {
userID := userstore.DefaultUserID
providers, subscriptions, err := c.service.ListProviders(ctx, userID)
if err != nil {
return dto.NotificationProvidersResponse{}, err
}
result := make([]dto.NotificationProviderDTO, 0, len(providers))
for _, provider := range providers {
events := subscriptions[provider.ID]
result = append(result, dto.FromProvider(provider, events))
}
return dto.NotificationProvidersResponse{
Providers: result,
AppriseAvailable: c.service.AppriseAvailable(),
Events: c.service.AvailableEvents(),
}, nil
}
func (c *Controller) CreateProvider(ctx context.Context, req dto.UpsertProviderRequest) (dto.NotificationProviderDTO, error) {
userID := userstore.DefaultUserID
name := strings.TrimSpace(req.Name)
if name == "" {
name = defaultNameForType(req.Type)
}
enabled := true
if req.Enabled != nil {
enabled = *req.Enabled
}
providerType := models.ProviderType(req.Type)
config := req.Config
events := []string{service.EventTaskSessionClarificationAsked}
if req.Events != nil {
events = *req.Events
}
provider, err := c.service.CreateProvider(ctx, userID, name, providerType, config, enabled, events)
if err != nil {
return dto.NotificationProviderDTO{}, err
}
return dto.FromProvider(provider, events), nil
}
func (c *Controller) UpdateProvider(ctx context.Context, providerID string, req dto.UpdateProviderRequest) (dto.NotificationProviderDTO, error) {
var providerType *models.ProviderType
if req.Type != nil {
t := models.ProviderType(*req.Type)
providerType = &t
}
updates := service.ProviderUpdate{
Name: req.Name,
Enabled: req.Enabled,
Type: providerType,
Config: req.Config,
Events: req.Events,
}
provider, err := c.service.UpdateProvider(ctx, providerID, updates)
if err != nil {
return dto.NotificationProviderDTO{}, err
}
userID := userstore.DefaultUserID
_, subscriptions, err := c.service.ListProviders(ctx, userID)
if err != nil {
return dto.NotificationProviderDTO{}, err
}
return dto.FromProvider(provider, subscriptions[provider.ID]), nil
}
func (c *Controller) DeleteProvider(ctx context.Context, providerID string) error {
return c.service.DeleteProvider(ctx, providerID)
}
func (c *Controller) TestProvider(ctx context.Context, providerID string) error {
return c.service.TestProvider(ctx, providerID)
}
func defaultNameForType(providerType string) string {
switch providerType {
case string(models.ProviderTypeApprise):
return "Apprise"
case string(models.ProviderTypeSystem):
return "System Notifications"
default:
return "Notifications"
}
}