Skip to content

Commit b81c7ec

Browse files
committed
feat: filter paid and unpaid transaction
1 parent 906299f commit b81c7ec

File tree

13 files changed

+136
-23
lines changed

13 files changed

+136
-23
lines changed

apps/api/data/mysql/transactions/repository.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ func (repo Repository) BeginTransaction(ctx context.Context, callback func(ctxWi
2222
return utils.BeginDbTransaction(ctx, repo.db, callback)
2323
}
2424

25-
func (repo Repository) GetTransactionList(ctx context.Context, query string, sortBy string, order string, skip int, limit int) ([]transactions.Transaction, error) {
25+
func (repo Repository) GetTransactionList(ctx context.Context, query string, sortBy string, order string, skip int, limit int, paymentStatus transactions.PaymentStatus) ([]transactions.Transaction, error) {
2626
db := utils.GetDbFromCtx(ctx, repo.db)
2727

28-
var transactions []transactions.Transaction
28+
var transactionResults []transactions.Transaction
2929
result := db.Table("transactions").Where("deleted_at is NULL").Preload("TransactionItems").Preload("Wallet")
3030

3131
if sortBy != "" && order != "" {
@@ -44,12 +44,19 @@ func (repo Repository) GetTransactionList(ctx context.Context, query string, sor
4444
result = result.Limit(limit)
4545
}
4646

47-
result = result.Find(&transactions)
47+
switch paymentStatus {
48+
case transactions.Paid:
49+
result = result.Where("paid_at IS NOT NULL")
50+
case transactions.Unpaid:
51+
result = result.Where("paid_at IS NULL")
52+
}
53+
54+
result = result.Find(&transactionResults)
4855

49-
return transactions, result.Error
56+
return transactionResults, result.Error
5057
}
5158

52-
func (repo Repository) GetTransactionListTotal(ctx context.Context, query string) (int64, error) {
59+
func (repo Repository) GetTransactionListTotal(ctx context.Context, query string, paymentStatus transactions.PaymentStatus) (int64, error) {
5360
db := utils.GetDbFromCtx(ctx, repo.db)
5461
var count int64
5562
result := db.Table("transactions").Where("deleted_at", nil)
@@ -58,6 +65,13 @@ func (repo Repository) GetTransactionListTotal(ctx context.Context, query string
5865
result = result.Where("name LIKE ?", "%"+query+"%")
5966
}
6067

68+
switch paymentStatus {
69+
case transactions.Paid:
70+
result = result.Where("paid_at IS NOT NULL")
71+
case transactions.Unpaid:
72+
result = result.Where("paid_at IS NULL")
73+
}
74+
6175
result = result.Count(&count)
6276

6377
return count, result.Error

apps/api/domain/transactions/entity.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,11 @@ type TransactionItemRequest struct {
4848
type TransactionPayRequest struct {
4949
WalletId int64 `json:"walletId"`
5050
}
51+
52+
type PaymentStatus int
53+
54+
const (
55+
Paid PaymentStatus = iota
56+
Unpaid
57+
All
58+
)

apps/api/domain/transactions/repository.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import (
77

88
type Repository interface {
99
BeginTransaction(ctx context.Context, callback func(ctxWithTx context.Context) error) error
10-
GetTransactionList(ctx context.Context, query string, sortBy string, order string, skip int, limit int) ([]Transaction, error)
11-
GetTransactionListTotal(ctx context.Context, query string) (int64, error)
10+
GetTransactionList(ctx context.Context, query string, sortBy string, order string, skip int, limit int, paymentStatus PaymentStatus) ([]Transaction, error)
11+
GetTransactionListTotal(ctx context.Context, query string, paymentStatus PaymentStatus) (int64, error)
1212
GetTransactionById(ctx context.Context, id int64) (Transaction, error)
1313
CreateTransaction(ctx context.Context, transaction *Transaction) error
1414
UpdateTransactionById(ctx context.Context, transaction *Transaction, id int64) error

apps/api/domain/transactions/usecase.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ func NewUsecase(repository Repository, productRepository products.Repository, wa
2525
}
2626
}
2727

28-
func (usecase Usecase) GetTransactionList(ctx context.Context, query string, sortBy string, order string, skip int, limit int) ([]Transaction, int64, error) {
29-
transactions, err := usecase.repository.GetTransactionList(ctx, query, sortBy, order, skip, limit)
28+
func (usecase Usecase) GetTransactionList(ctx context.Context, query string, sortBy string, order string, skip int, limit int, paymentStatus PaymentStatus) ([]Transaction, int64, error) {
29+
transactions, err := usecase.repository.GetTransactionList(ctx, query, sortBy, order, skip, limit, paymentStatus)
3030
if err != nil {
3131
return []Transaction{}, 0, err
3232
}
3333

34-
total, err := usecase.repository.GetTransactionListTotal(ctx, query)
34+
total, err := usecase.repository.GetTransactionListTotal(ctx, query, paymentStatus)
3535
if err != nil {
3636
return []Transaction{}, 0, err
3737
}

apps/api/presentation/http/transactions/handler.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func (handler Handler) GetTransactionList(w http.ResponseWriter, r *http.Request
2222
query := base.GetQuery(r)
2323
sortBy := base.GetSortBy(r)
2424
order := base.GetOrder(r)
25+
paymentStatus := GetPaymentStatus(r)
2526

2627
skip, err := base.GetSkip(r)
2728
if err != nil {
@@ -35,7 +36,7 @@ func (handler Handler) GetTransactionList(w http.ResponseWriter, r *http.Request
3536
return
3637
}
3738

38-
transactions, total, err := handler.usecase.GetTransactionList(ctx, query, sortBy, order, skip, limit)
39+
transactions, total, err := handler.usecase.GetTransactionList(ctx, query, sortBy, order, skip, limit, paymentStatus)
3940
if err != nil {
4041
base.WriteError(w, apiContract.Error{Code: apiContract.SERVER_ERROR, Message: err.Error()})
4142
return
@@ -160,7 +161,7 @@ func (handler Handler) GetTransactionStatistics(w http.ResponseWriter, r *http.R
160161

161162
apiTransactionStatistics := []apiContract.TransactionStatistic{}
162163
for _, transactionStatistic := range transactionStatistics {
163-
apiTransactionStatistics = append(apiTransactionStatistics, toApiTransactionStatistic(transactionStatistic))
164+
apiTransactionStatistics = append(apiTransactionStatistics, ToApiTransactionStatistic(transactionStatistic))
164165
}
165166

166167
json.NewEncoder(w).Encode(apiContract.TransactionStatistics200Response{Data: apiTransactionStatistics})

apps/api/presentation/http/transactions/transformer.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,20 @@ func GetTransactionPayRequest(r *http.Request) (apiContract.TransactionPayReques
3030
return transactionPayRequest, err
3131
}
3232

33+
func GetPaymentStatus(r *http.Request) transactions.PaymentStatus {
34+
paymentStatusQuery := r.URL.Query().Get("paymentStatus")
35+
switch paymentStatusQuery {
36+
case "paid":
37+
return transactions.Paid
38+
case "unpaid":
39+
return transactions.Unpaid
40+
case "all":
41+
return transactions.All
42+
default:
43+
return transactions.All
44+
}
45+
}
46+
3347
func ToApiTransaction(transaction transactions.Transaction) apiContract.Transaction {
3448
apiTransactionItems := []apiContract.TransactionItem{}
3549
for _, item := range transaction.TransactionItems {
@@ -79,7 +93,7 @@ func ToTransactionPayRequest(transactionPayRequest apiContract.TransactionPayReq
7993
}
8094
}
8195

82-
func toApiTransactionStatistic(transactionStatistic transactions.TransactionStatistic) apiContract.TransactionStatistic {
96+
func ToApiTransactionStatistic(transactionStatistic transactions.TransactionStatistic) apiContract.TransactionStatistic {
8397
return apiContract.TransactionStatistic{
8498
Date: transactionStatistic.Date,
8599
Total: transactionStatistic.Total,

libs/api-contract/src/api.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,7 @@ paths:
767767
- $ref: '#/components/parameters/Order'
768768
- $ref: '#/components/parameters/Limit'
769769
- $ref: '#/components/parameters/Skip'
770+
- $ref: '#/components/parameters/PaymentStatus'
770771
responses:
771772
'200':
772773
description: success response
@@ -1685,3 +1686,9 @@ components:
16851686
schema:
16861687
type: integer
16871688
format: int64
1689+
PaymentStatus:
1690+
name: paymentStatus
1691+
in: query
1692+
schema:
1693+
type: string
1694+
enum: [paid, unpaid, all]

libs/ui/src/data/api/transaction.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
transactionStatistics,
1717
TransactionStatistic as ApiTransactionStatistic,
1818
TransactionStatistics200,
19+
TransactionListQueryParams,
1920
} from '../../../../api-contract/src';
2021
import {
2122
Transaction,
@@ -33,13 +34,15 @@ export class OpenAPITransactionRepository implements TransactionRepository {
3334
orderBy: 'desc',
3435
query: '',
3536
sortBy: 'created_at',
37+
paymentStatus: 'all',
3638
};
3739

3840
transactionByIdServerParams: number | null = null;
3941

4042
constructor(client: QueryClient) {
4143
this.client = client;
4244
}
45+
4346
getTransactionListServerParams: TransactionRepository['getTransactionListServerParams'] =
4447
() => this.transactionListServerParams;
4548

@@ -164,13 +167,15 @@ export class OpenAPITransactionRepository implements TransactionRepository {
164167
page,
165168
query,
166169
sortBy,
170+
paymentStatus,
167171
}) => {
168-
const params = {
172+
const params: TransactionListQueryParams = {
169173
query,
170174
skip: (page - 1) * itemPerPage,
171175
limit: itemPerPage,
172176
order: orderBy,
173177
sortBy,
178+
paymentStatus,
174179
};
175180
return this.client
176181
.fetchQuery({

libs/ui/src/domain/entities/Transaction.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,5 @@ export type TransactionForm = {
2929
name: string;
3030
transactionItems: TransactionItemForm[];
3131
};
32+
33+
export type PaymentStatus = 'paid' | 'unpaid' | 'all';

libs/ui/src/domain/repositories/transaction.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
PaymentStatus,
23
Transaction,
34
TransactionForm,
45
TransactionStatistic,
@@ -10,6 +11,7 @@ export type TransactionListParams = {
1011
query: string;
1112
sortBy: 'created_at';
1213
orderBy: 'asc' | 'desc';
14+
paymentStatus: PaymentStatus;
1315
};
1416

1517
export interface TransactionRepository {

0 commit comments

Comments
 (0)