Skip to content

Commit

Permalink
Merge pull request #18 from RianIhsan/feature/midtrans-notification
Browse files Browse the repository at this point in the history
feature:midtrans notification
  • Loading branch information
RianIhsan authored Oct 28, 2023
2 parents 0fdbbff + 4591394 commit f5c8077
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 1 deletion.
2 changes: 2 additions & 0 deletions campaign/formatter.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ type CampaignDetailsFormatter struct {
CampaignImages string `json:"campaign_images" gorm:"foreignKey:CampaignID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
GoalAmount int `json:"goal_amount"`
CurrentAmount int `json:"current_amount"`
BackerCount int `json:"backer_count"`
UserID int `json:"user_id"`
Perks []string `json:"perks"`
User CampaignUserFormatter `json:"user"`
Expand All @@ -70,6 +71,7 @@ func FormatCampaignDetails(campaign Campaign) CampaignDetailsFormatter {
campaignDetailsFormatter.Description = campaign.Description
campaignDetailsFormatter.GoalAmount = campaign.GoalAmount
campaignDetailsFormatter.CurrentAmount = campaign.CurrentAmount
campaignDetailsFormatter.BackerCount = campaign.BackerCount
campaignDetailsFormatter.UserID = campaign.UserID
campaignDetailsFormatter.CampaignImages = ""

Expand Down
20 changes: 20 additions & 0 deletions handler/transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,23 @@ func (h *transactionHandler) CreateTransaction(c *gin.Context) {
c.JSON(http.StatusOK, response)

}

func (h transactionHandler) GetNotification(c *gin.Context) {
var input transaction.TransactionNotifyInput
err := c.ShouldBindJSON(&input)
if err != nil {
response := helper.ErrorResponse("Failed to process notification", err)
c.JSON(http.StatusBadRequest, response)
return
}

err = h.service.ProsesPayment(input)
if err != nil {
response := helper.ErrorResponse("Failed to process notification", err)
c.JSON(http.StatusBadRequest, response)
return
}

c.JSON(http.StatusOK, input)

}
1 change: 1 addition & 0 deletions routes/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,5 @@ func SetupRoute(router *gin.Engine) {
api.GET("/campaigns/:id/transactions", middleware.AuthMiddleware(authService, userService), transactionHandler.GetCampaignTransactions)
api.GET("/transactions", middleware.AuthMiddleware(authService, userService), transactionHandler.GetUserTransactions)
api.POST("/transactions", middleware.AuthMiddleware(authService, userService), transactionHandler.CreateTransaction)
api.POST("/transactions/notification", transactionHandler.GetNotification)
}
7 changes: 7 additions & 0 deletions transaction/input.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,10 @@ type CreateTransactionInput struct {
CampaignID int `json:"campaign_id" binding:"required"`
User user.User
}

type TransactionNotifyInput struct {
TransactionStatus string `json:"transaction_status"`
OrderID string `json:"order_id"`
PaymentType string `json:"payment-type"`
FraudStatus string `json:"fraud_status"`
}
11 changes: 11 additions & 0 deletions transaction/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ type Repository interface {
GetByUserID(userID int) ([]Transaction, error)
Save(transaction Transaction) (Transaction, error)
Update(transaction Transaction) (Transaction, error)
GetByCode(Code string) (Transaction, error)
}

func NewRepository(db *gorm.DB) *repository {
Expand Down Expand Up @@ -52,3 +53,13 @@ func (r *repository) Update(transaction Transaction) (Transaction, error) {
}
return transaction, nil
}

func (r *repository) GetByCode(Code string) (Transaction, error) {
var transaction Transaction
err := r.db.Where("code = ?", Code).Find(&transaction).Error
if err != nil {
return transaction, err
}

return transaction, nil
}
40 changes: 39 additions & 1 deletion transaction/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type Service interface {
GetTransactionByCampaignID(input GetCampaignTransactionInput) ([]Transaction, error)
GetTransactionByUserID(userID int) ([]Transaction, error)
CreateTransaction(input CreateTransactionInput) (Transaction, error)
ProsesPayment(input TransactionNotifyInput) error
}

func NewService(repository Repository, campaignRepository campaign.Repository, paymentService payment.Service) *service {
Expand Down Expand Up @@ -55,7 +56,6 @@ func (s *service) CreateTransaction(input CreateTransactionInput) (Transaction,
transaction.UserID = input.User.ID
transaction.Status = "pending"

//Mapping struct transaction to transaction
Random := helper.GenerateRandomOTP(5)
atoi, err := strconv.Atoi(Random)
if err != nil {
Expand All @@ -80,3 +80,41 @@ func (s *service) CreateTransaction(input CreateTransactionInput) (Transaction,

return newTransaction, nil
}

func (s *service) ProsesPayment(input TransactionNotifyInput) error {
code := input.OrderID

transaction, err := s.repository.GetByCode(code)
if err != nil {
return err
}
if input.PaymentType == "credit_card" && input.TransactionStatus == "capture" && input.FraudStatus == "accept" {
transaction.Status = "paid"
} else if input.TransactionStatus == "settlement" {
transaction.Status = "paid"
} else if input.TransactionStatus == "deny" || input.TransactionStatus == "expire" || input.TransactionStatus == "cancel" {
transaction.Status = "cancelled"
}

updatedTransaction, err := s.repository.Update(transaction)
if err != nil {
return err
}

campaign, err := s.campaignRepository.FindByID(updatedTransaction.CampaignID)
if err != nil {
return err
}

if updatedTransaction.Status == "paid" {
campaign.BackerCount = campaign.BackerCount + 1
campaign.CurrentAmount = campaign.CurrentAmount + updatedTransaction.Amount

_, err := s.campaignRepository.Update(campaign)
if err != nil {
return err
}
}

return nil
}

0 comments on commit f5c8077

Please sign in to comment.