forked from ebhomengo/niki
95 lines
2.1 KiB
Go
95 lines
2.1 KiB
Go
package mysql
|
|
|
|
import (
|
|
"context"
|
|
"git.gocasts.ir/ebhomengo/niki/campaign/entity"
|
|
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
|
|
"git.gocasts.ir/ebhomengo/niki/repository/mysql"
|
|
"git.gocasts.ir/ebhomengo/niki/types"
|
|
)
|
|
|
|
type DB struct {
|
|
conn *mysql.DB
|
|
}
|
|
|
|
func New(db *mysql.DB) *DB {
|
|
return &DB{conn: db}
|
|
}
|
|
|
|
|
|
|
|
// CreateCampaign creates a new campaign
|
|
func (d *DB) CreateAndSave(ctx context.Context, campaign entity.Campaign) (types.ID, error) {
|
|
const Op = "repository.mysql.campaign.create"
|
|
|
|
tx, err := d.conn.Conn().BeginTx(ctx, nil)
|
|
if err != nil {
|
|
return 0, richerror.New(Op).WithErr(err)
|
|
}
|
|
defer tx.Rollback()
|
|
|
|
query := `INSERT INTO campaigns (title, description, goal_amount, raised_amount,
|
|
status, deadline_at ,admin_id , created_at )
|
|
VALUES (?, ?, ?, ?, ?, ?, ? , NOW() )`
|
|
|
|
result, err := tx.ExecContext(ctx, query,
|
|
campaign.Title,
|
|
campaign.Description,
|
|
campaign.GoalAmount,
|
|
campaign.RaisedAmount,
|
|
campaign.Status,
|
|
campaign.DeadlineAt,
|
|
campaign.AdminID,
|
|
campaign.CreatedAt,
|
|
|
|
|
|
)
|
|
if err != nil {
|
|
return 0, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
campaignID, err := result.LastInsertId()
|
|
if err != nil {
|
|
return 0, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
if err := tx.Commit(); err != nil {
|
|
return 0, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
return types.ID(campaignID), nil
|
|
}
|
|
|
|
|
|
|
|
// Create adds a new participant to a campaign
|
|
func (d *DB) CreateCampaignParticipants(ctx context.Context, participant entity.CampaignParticipant) (types.ID, error) {
|
|
const Op = "repository.mysql.campaign_participant.create"
|
|
|
|
query := `INSERT INTO campaign_participants (id,campaign_id, user_id, amount , created_at)
|
|
VALUES (?, ?, ? , ? , NOW())`
|
|
|
|
result, err := d.conn.ExecContext(ctx, query,
|
|
participant.ID,
|
|
participant.CampaignID,
|
|
participant.UserID,
|
|
participant.Amount,
|
|
participant.CreatedAt
|
|
)
|
|
if err != nil {
|
|
return 0, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
return 0, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
return types.ID(id), nil
|
|
}
|
|
|
|
|
|
|
|
|
|
|