Skip to content

Commit

Permalink
Merge pull request #22 from RianIhsan/feature/get-all-transaction-for…
Browse files Browse the repository at this point in the history
…-admin

feature:get all transaction for admin
  • Loading branch information
RianIhsan authored Oct 30, 2023
2 parents df629ee + 6890c55 commit a10b421
Show file tree
Hide file tree
Showing 6 changed files with 177 additions and 0 deletions.
7 changes: 7 additions & 0 deletions .idea/dataSources.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 43 additions & 0 deletions admin/formatter.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package admin

import (
"github.com/RianIhsan/raise-unity/transaction"
"github.com/RianIhsan/raise-unity/user"
"time"
)
Expand Down Expand Up @@ -40,3 +41,45 @@ func FormatterUsers(users []user.User) []UserFormatter {

return usersFormatter
}

type TransactionFormatter struct {
ID int `json:"id"`
UserID int `json:"user_id"`
CampaignID int `json:"campaign_id"`
Amount int `json:"amount"`
Status string `json:"status"`
Code string `json:"code"`
PaymentURL string `json:"payment_url"`
User string `json:"user"`
Campaign string `json:"campaign_name"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}

func FormatTransaction(transaction transaction.Transaction) TransactionFormatter {
transactionFormatter := TransactionFormatter{}
transactionFormatter.ID = transaction.ID
transactionFormatter.UserID = transaction.UserID
transactionFormatter.CampaignID = transaction.CampaignID
transactionFormatter.Amount = transaction.Amount
transactionFormatter.Status = transaction.Status
transactionFormatter.Code = transaction.Code
transactionFormatter.PaymentURL = transaction.PaymentURL
transactionFormatter.User = transaction.User.Name
transactionFormatter.Campaign = transaction.Campaign.Name
transactionFormatter.CreatedAt = transaction.CreatedAt
transactionFormatter.UpdatedAt = transaction.UpdatedAt

return transactionFormatter
}

func FormatterTransactions(transaction []transaction.Transaction) []TransactionFormatter {
var transactionsFormatter []TransactionFormatter

for _, tr := range transaction {
formatTransaction := FormatTransaction(tr)
transactionsFormatter = append(transactionsFormatter, formatTransaction)
}

return transactionsFormatter
}
44 changes: 44 additions & 0 deletions admin/repository.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package admin

import (
"github.com/RianIhsan/raise-unity/transaction"
"github.com/RianIhsan/raise-unity/user"
"gorm.io/gorm"
)
Expand All @@ -9,6 +10,10 @@ type Repository interface {
GetTotalUsers() (int64, error)
GetPaginatedUsers(offset, limit int) ([]user.User, error)
SearchUserByName(name string) ([]user.User, error)
GetTotalTransactions() (int64, error)
GetPaginatedTransactions(offset, limit int) ([]transaction.Transaction, error)
SearchTransactionByUsername(name string) ([]transaction.Transaction, error)
GetTotalTransactionsByUsername(name string) (int64, error)
}

type repository struct {
Expand Down Expand Up @@ -45,3 +50,42 @@ func (r *repository) SearchUserByName(name string) ([]user.User, error) {
}
return users, err
}

func (r *repository) GetTotalTransactions() (int64, error) {
var total int64
if err := r.db.Model(&transaction.Transaction{}).Count(&total).Error; err != nil {
return 0, err
}
return total, nil
}

func (r *repository) GetTotalTransactionsByUsername(name string) (int64, error) {
var userTransaction []transaction.Transaction
var total int64
if err := r.db.Preload("User").
Preload("Campaign").
Joins("JOIN users ON transactions.user_id = users.id").
Where("users.name LIKE ?", "%"+name+"%").
Count(&total).
Find(&userTransaction).Error; err != nil {
return 0, err
}
return total, nil
}
func (r *repository) GetPaginatedTransactions(offset, limit int) ([]transaction.Transaction, error) {
var transactions []transaction.Transaction
err := r.db.Offset(offset).Limit(limit).Preload("User").Preload("Campaign").Find(&transactions).Error
if err != nil {
return transactions, err
}
return transactions, nil
}

func (r *repository) SearchTransactionByUsername(name string) ([]transaction.Transaction, error) {
var userTransaction []transaction.Transaction
err := r.db.Preload("User").Preload("Campaign").Joins("JOIN users ON transactions.user_id = users.id").Where("users.name LIKE ?", "%"+name+"%").Find(&userTransaction).Error
if err != nil {
return userTransaction, err
}
return userTransaction, nil
}
38 changes: 38 additions & 0 deletions admin/service.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package admin

import (
"github.com/RianIhsan/raise-unity/transaction"
"github.com/RianIhsan/raise-unity/user"
"math"
)

type Service interface {
GetUsersPagination(page, pageSize int) ([]user.User, int, int, int, int, error)
SearchUserByName(name string) ([]user.User, error)
GetTransactionsPagination(page, pageSize int) ([]transaction.Transaction, int, int, int, int, error)
SearchTransactionByUsername(name string) ([]transaction.Transaction, error)
}

type service struct {
Expand Down Expand Up @@ -52,3 +55,38 @@ func (s *service) SearchUserByName(name string) ([]user.User, error) {
}
return userByName, nil
}

func (s *service) GetTransactionsPagination(page, pageSize int) ([]transaction.Transaction, int, int, int, int, error) {
totalTransactions, err := s.repository.GetTotalTransactions()
if err != nil {
return nil, 0, 0, 0, 0, err
}
totalPages := int(math.Ceil(float64(totalTransactions) / float64(pageSize)))
if page < 1 {
page = 1
}
if page > totalPages {
page = totalPages
}
offset := (page - 1) * pageSize
transactions, err := s.repository.GetPaginatedTransactions(offset, pageSize)
if err != nil {
return nil, 0, 0, 0, 0, err
}
var nextPage, prevPage int
if page < totalPages {
nextPage = page + 1
}
if page > 1 {
prevPage = page - 1
}
return transactions, totalPages, page, nextPage, prevPage, nil
}

func (s *service) SearchTransactionByUsername(name string) ([]transaction.Transaction, error) {
userTransaction, err := s.repository.SearchTransactionByUsername(name)
if err != nil {
return userTransaction, err
}
return userTransaction, nil
}
44 changes: 44 additions & 0 deletions handler/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"github.com/RianIhsan/raise-unity/admin"
"github.com/RianIhsan/raise-unity/auth"
"github.com/RianIhsan/raise-unity/helper"
"github.com/RianIhsan/raise-unity/transaction"
"github.com/RianIhsan/raise-unity/user"
"github.com/gin-gonic/gin"
"net/http"
Expand Down Expand Up @@ -66,3 +67,46 @@ func (h *adminHandler) GetAllUsers(c *gin.Context) {
response := helper.ResponseWithPaginationAndNextPrev("List of users", admin.FormatterUsers(nonAdminUsers), currentPage, totalPages, nextPage, prevPage)
c.JSON(http.StatusOK, response)
}

func (h *adminHandler) GetAllUsersTransactions(c *gin.Context) {
currentUser := c.MustGet("CurrentUser").(user.User)
if currentUser.Role != "admin" {
response := helper.GeneralResponse("Access denied")
c.JSON(http.StatusUnauthorized, response)
return
}
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))

var transactions []transaction.Transaction
var totalPages, currentPage, nextPage, prevPage int
var err error

searchTransactionByUsername := c.Query("user_name")
if searchTransactionByUsername != "" {
transactions, err = h.service.SearchTransactionByUsername(searchTransactionByUsername)
} else {
transactions, totalPages, currentPage, nextPage, prevPage, err = h.service.GetTransactionsPagination(page, pageSize)
}
if err != nil {
response := helper.ErrorResponse("Error to get transactions", err)
c.JSON(http.StatusBadRequest, response)
return
}

if totalPages > 1 {
if currentPage < totalPages {
nextPage = currentPage + 1
} else {
nextPage = -1
}
if currentPage > 1 {
prevPage = currentPage - 1
} else {
prevPage = -1
}
}

response := helper.ResponseWithPaginationAndNextPrev("List of users", admin.FormatterTransactions(transactions), currentPage, totalPages, nextPage, prevPage)
c.JSON(http.StatusOK, response)
}
1 change: 1 addition & 0 deletions routes/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,5 @@ func SetupRoute(router *gin.Engine) {
api.POST("/transactions/notification", transactionHandler.GetNotification)

api.GET("/users", middleware.AuthMiddleware(authService, userService), adminHandler.GetAllUsers)
api.GET("/users/transactions", middleware.AuthMiddleware(authService, userService), adminHandler.GetAllUsersTransactions)
}

0 comments on commit a10b421

Please sign in to comment.