forked from ebhomengo/niki
72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"git.gocasts.ir/ebhomengo/niki/domain/campaign/entity"
|
|
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
|
|
"git.gocasts.ir/ebhomengo/niki/types"
|
|
"time"
|
|
)
|
|
|
|
// CreateCampaign handles creation of a new campaign.
|
|
func (s *CampaignService) CreateCampaign(ctx context.Context, req entity.Campaign) (types.ID, error) {
|
|
const op = "service.campaign.create_campaign"
|
|
|
|
if err := validateCreateCampaignRequest(req); err != nil {
|
|
return 0, richerror.New(op).WithErr(err)
|
|
}
|
|
|
|
campaign := entity.Campaign{
|
|
Title: req.Title,
|
|
Description: req.Description,
|
|
GoalAmount: req.GoalAmount,
|
|
RaisedAmount: 0,
|
|
Status: req.Status,
|
|
DeadlineAt: req.DeadlineAt,
|
|
AdminID: req.AdminID,
|
|
CreatedAt: time.Now(),
|
|
}
|
|
|
|
id, err := s.repo.Create(ctx, campaign)
|
|
if err != nil {
|
|
return 0, richerror.New(op).WithErr(err)
|
|
}
|
|
|
|
return id, nil
|
|
}
|
|
|
|
func validateCreateCampaignRequest(req entity.Campaign) error {
|
|
if req.Title == "" {
|
|
return errRequired("title")
|
|
}
|
|
if req.GoalAmount <= 0 {
|
|
return errInvalid("goal_amount must be greater than 0")
|
|
}
|
|
if req.AdminID == 0 {
|
|
return errRequired("admin_id")
|
|
}
|
|
|
|
validStatuses := map[string]bool{
|
|
"draft": true,
|
|
"active": true,
|
|
"completed": true,
|
|
"cancelled": true,
|
|
"paused": true,
|
|
}
|
|
if !validStatuses[string(req.Status)] {
|
|
return errInvalid("invalid status provided")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// --- Helpers ---
|
|
func errRequired(field string) error {
|
|
return fmt.Errorf("%s is required", field)
|
|
}
|
|
|
|
func errInvalid(msg string) error {
|
|
return fmt.Errorf(msg)
|
|
}
|