package service import ( "bugulma/backend/internal/domain" "context" "fmt" "github.com/google/uuid" ) // ProposalService handles business logic for proposals type ProposalService struct { repo domain.ProposalRepository } // NewProposalService creates a new proposal service func NewProposalService(repo domain.ProposalRepository) *ProposalService { return &ProposalService{repo: repo} } // CreateProposalRequest represents the request to create a proposal type CreateProposalRequest struct { FromOrgID string ToOrgID string ResourceID string ResourceType domain.ResourceDirection ResourceName string Message string } // Create creates a new proposal func (s *ProposalService) Create(ctx context.Context, req CreateProposalRequest) (*domain.Proposal, error) { proposal := &domain.Proposal{ ID: uuid.New().String(), FromOrgID: req.FromOrgID, ToOrgID: req.ToOrgID, ResourceID: req.ResourceID, ResourceType: req.ResourceType, ResourceName: req.ResourceName, Message: req.Message, Status: domain.ProposalStatusPending, } err := s.repo.Create(ctx, proposal) if err != nil { return nil, fmt.Errorf("failed to create proposal: %w", err) } return proposal, nil } // GetByID retrieves a proposal by ID func (s *ProposalService) GetByID(ctx context.Context, id string) (*domain.Proposal, error) { return s.repo.GetByID(ctx, id) } // GetAll retrieves all proposals func (s *ProposalService) GetAll(ctx context.Context) ([]*domain.Proposal, error) { return s.repo.GetAll(ctx) } // GetByOrganizationID retrieves proposals for an organization func (s *ProposalService) GetByOrganizationID(ctx context.Context, orgID string) ([]*domain.Proposal, error) { return s.repo.GetByOrganizationID(ctx, orgID) } // UpdateStatus updates the status of a proposal func (s *ProposalService) UpdateStatus(ctx context.Context, id string, status domain.ProposalStatus) error { return s.repo.UpdateStatus(ctx, id, status) } // Delete deletes a proposal func (s *ProposalService) Delete(ctx context.Context, id string) error { return s.repo.Delete(ctx, id) }