100 lines
3.0 KiB
Go
100 lines
3.0 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"github.com/gochat/gochat/internal/model"
|
|
"github.com/gochat/gochat/internal/repository"
|
|
applogger "github.com/gochat/gochat/pkg/logger"
|
|
pkgvalidator "github.com/gochat/gochat/pkg/validator"
|
|
)
|
|
|
|
// InboxLimitService implements business logic for inbox limit management.
|
|
// Reference: Chatwoot app/controllers/api/v1/accounts/inboxes/inbox_limits_controller.rb
|
|
// Inbox limits are create/update/destroy only (no index or show in Chatwoot).
|
|
type InboxLimitService struct {
|
|
repo *repository.InboxLimitRepo
|
|
}
|
|
|
|
// NewInboxLimitService creates a new InboxLimit service.
|
|
func NewInboxLimitService(repo *repository.InboxLimitRepo) *InboxLimitService {
|
|
return &InboxLimitService{repo: repo}
|
|
}
|
|
|
|
// CreateInboxLimitRequest is the DTO for creating an inbox limit.
|
|
// Reference: Chatwoot InboxLimitsController#create — params: {type, value}
|
|
type CreateInboxLimitRequest struct {
|
|
Type string `json:"type" validate:"required,min=1"`
|
|
Value int `json:"value" validate:"required,min=1"`
|
|
}
|
|
|
|
// UpdateInboxLimitRequest is the DTO for updating an inbox limit.
|
|
// Reference: Chatwoot InboxLimitsController#update — params: {type, value}
|
|
type UpdateInboxLimitRequest struct {
|
|
Type string `json:"type,omitempty" validate:"omitempty,min=1"`
|
|
Value int `json:"value,omitempty" validate:"omitempty,min=1"`
|
|
}
|
|
|
|
// Create creates a new inbox limit for an inbox.
|
|
// Reference: Chatwoot InboxLimitsController#create
|
|
func (s *InboxLimitService) Create(ctx context.Context, inboxID uint, req CreateInboxLimitRequest) (*model.InboxLimit, error) {
|
|
if err := pkgvalidator.ValidateStruct(req); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
limit := &model.InboxLimit{
|
|
InboxID: inboxID,
|
|
Type: req.Type,
|
|
Value: req.Value,
|
|
}
|
|
if err := s.repo.Create(ctx, limit); err != nil {
|
|
return nil, err
|
|
}
|
|
applogger.L().Infof("Inbox limit created for inbox %d, type=%s, value=%d", inboxID, req.Type, req.Value)
|
|
return limit, nil
|
|
}
|
|
|
|
// Update modifies an existing inbox limit.
|
|
// Reference: Chatwoot InboxLimitsController#update
|
|
func (s *InboxLimitService) Update(ctx context.Context, id uint, req UpdateInboxLimitRequest) (*model.InboxLimit, error) {
|
|
existing, err := s.repo.FindByID(ctx, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if req.Type != "" {
|
|
existing.Type = req.Type
|
|
}
|
|
if req.Value != 0 {
|
|
existing.Value = req.Value
|
|
}
|
|
|
|
if err := s.repo.Update(ctx, existing); err != nil {
|
|
return nil, err
|
|
}
|
|
applogger.L().Infof("Inbox limit updated, id=%d", id)
|
|
return existing, nil
|
|
}
|
|
|
|
// Delete removes an inbox limit by ID.
|
|
// Reference: Chatwoot InboxLimitsController#destroy
|
|
func (s *InboxLimitService) Delete(ctx context.Context, id uint) error {
|
|
// Verify existence before delete
|
|
existing, err := s.repo.FindByID(ctx, id)
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.New("inbox limit not found")
|
|
}
|
|
return err
|
|
}
|
|
_ = existing // confirmed exists
|
|
|
|
if err := s.repo.Delete(ctx, id); err != nil {
|
|
return err
|
|
}
|
|
applogger.L().Infof("Inbox limit deleted, id=%d", id)
|
|
return nil
|
|
} |