feat: add expense repo type conversion
This commit is contained in:
		
							
								
								
									
										85
									
								
								internal/howmuch/adapter/repo/expense.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								internal/howmuch/adapter/repo/expense.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,85 @@
 | 
				
			|||||||
 | 
					package repo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"git.vinchent.xyz/vinchent/howmuch/internal/howmuch/adapter/repo/sqlc"
 | 
				
			||||||
 | 
						"git.vinchent.xyz/vinchent/howmuch/internal/howmuch/model"
 | 
				
			||||||
 | 
						"git.vinchent.xyz/vinchent/howmuch/internal/pkg/log"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func convToPayments(raw json.RawMessage) ([]model.Payment, error) {
 | 
				
			||||||
 | 
						var paymentsRetrieved []model.PaymentRetrieved
 | 
				
			||||||
 | 
						err := json.Unmarshal(raw, &paymentsRetrieved)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							// Unexpected
 | 
				
			||||||
 | 
							log.ErrorLog("json unmarshal error", "err", err)
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var payments []model.Payment
 | 
				
			||||||
 | 
						for _, p := range paymentsRetrieved {
 | 
				
			||||||
 | 
							payment := model.Payment{
 | 
				
			||||||
 | 
								PayerID:        p.PayerID,
 | 
				
			||||||
 | 
								PayerFirstName: p.PayerFirstName,
 | 
				
			||||||
 | 
								PayerLastName:  p.PayerLastName,
 | 
				
			||||||
 | 
								Amount:         model.MakeMoney(p.Amount, model.Currency(p.Currency)),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							payments = append(payments, payment)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return payments, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func convToBenefits(raw json.RawMessage) ([]model.Benefit, error) {
 | 
				
			||||||
 | 
						var benefitsRetrieved []model.BenefitRetrieved
 | 
				
			||||||
 | 
						err := json.Unmarshal(raw, &benefitsRetrieved)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							// Unexpected
 | 
				
			||||||
 | 
							log.ErrorLog("json unmarshal error", "err", err)
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var benefits []model.Benefit
 | 
				
			||||||
 | 
						for _, b := range benefitsRetrieved {
 | 
				
			||||||
 | 
							benefit := model.Benefit{
 | 
				
			||||||
 | 
								RecipientID:        b.RecipientID,
 | 
				
			||||||
 | 
								RecipientFirstName: b.RecipientFirstName,
 | 
				
			||||||
 | 
								RecipientLastName:  b.RecipientLastName,
 | 
				
			||||||
 | 
								Amount:             model.MakeMoney(b.Amount, model.Currency(b.Currency)),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							benefits = append(benefits, benefit)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return benefits, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func convToExpenseRetrieved(expenseDTO *sqlc.GetExpenseByIDRow) (*model.ExpenseRetrieved, error) {
 | 
				
			||||||
 | 
						payments, err := convToPayments(expenseDTO.Payments)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							// Unexpected
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						benefits, err := convToBenefits(expenseDTO.Benefits)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							// Unexpected
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expenseRetrieved := &model.ExpenseRetrieved{
 | 
				
			||||||
 | 
							ID:        int(expenseDTO.ID),
 | 
				
			||||||
 | 
							CreatedAt: expenseDTO.CreatedAt,
 | 
				
			||||||
 | 
							UpdatedAt: expenseDTO.UpdatedAt,
 | 
				
			||||||
 | 
							Amount:    model.MakeMoney(int(expenseDTO.Amount), model.Currency(expenseDTO.Currency)),
 | 
				
			||||||
 | 
							EventID:   int(expenseDTO.EventID),
 | 
				
			||||||
 | 
							Detail: model.ExpenseDetail{
 | 
				
			||||||
 | 
								Name:  expenseDTO.Name.String,
 | 
				
			||||||
 | 
								Place: expenseDTO.Place.String,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Payments: payments,
 | 
				
			||||||
 | 
							Benefits: benefits,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return expenseRetrieved, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										74
									
								
								internal/howmuch/adapter/repo/expense_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								internal/howmuch/adapter/repo/expense_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					package repo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"database/sql"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"git.vinchent.xyz/vinchent/howmuch/internal/howmuch/adapter/repo/sqlc"
 | 
				
			||||||
 | 
						"git.vinchent.xyz/vinchent/howmuch/internal/howmuch/model"
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestConvToExpenseRetrieved(t *testing.T) {
 | 
				
			||||||
 | 
						input := &sqlc.GetExpenseByIDRow{
 | 
				
			||||||
 | 
							ID:        123,
 | 
				
			||||||
 | 
							CreatedAt: time.Date(2000, time.April, 11, 0, 0, 0, 0, time.UTC),
 | 
				
			||||||
 | 
							UpdatedAt: time.Date(2000, time.April, 11, 0, 0, 0, 0, time.UTC),
 | 
				
			||||||
 | 
							Amount:    123,
 | 
				
			||||||
 | 
							Currency:  "EUR",
 | 
				
			||||||
 | 
							EventID:   123,
 | 
				
			||||||
 | 
							Name:      sql.NullString{Valid: false},
 | 
				
			||||||
 | 
							Place:     sql.NullString{Valid: false},
 | 
				
			||||||
 | 
							Payments: json.RawMessage(
 | 
				
			||||||
 | 
								`[{"payer_id": 1, "payer_first_name": "toto", "payer_last_name": "titi", "amount": 10, "currency": "EUR"},
 | 
				
			||||||
 | 
					            {"payer_id": 2, "payer_first_name": "tata", "payer_last_name": "titi", "amount": 10, "currency": "EUR"}]`,
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
 | 
							Benefits: json.RawMessage(
 | 
				
			||||||
 | 
								`[{"recipient_id": 1, "recipient_first_name": "toto", "recipient_last_name": "titi", "amount": 10, "currency": "EUR"},
 | 
				
			||||||
 | 
					            {"recipient_id": 2, "recipient_first_name": "tata", "recipient_last_name": "titi", "amount": 10, "currency": "EUR"}]`,
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						want := &model.ExpenseRetrieved{
 | 
				
			||||||
 | 
							ID:        123,
 | 
				
			||||||
 | 
							CreatedAt: time.Date(2000, time.April, 11, 0, 0, 0, 0, time.UTC),
 | 
				
			||||||
 | 
							UpdatedAt: time.Date(2000, time.April, 11, 0, 0, 0, 0, time.UTC),
 | 
				
			||||||
 | 
							Amount:    model.Money{Amount: 123, Currency: model.Currency("EUR")},
 | 
				
			||||||
 | 
							EventID:   123,
 | 
				
			||||||
 | 
							Detail:    model.ExpenseDetail{},
 | 
				
			||||||
 | 
							Payments: []model.Payment{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									PayerID:        1,
 | 
				
			||||||
 | 
									PayerFirstName: "toto",
 | 
				
			||||||
 | 
									PayerLastName:  "titi",
 | 
				
			||||||
 | 
									Amount:         model.Money{Amount: 10, Currency: model.Currency("EUR")},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									PayerID:        2,
 | 
				
			||||||
 | 
									PayerFirstName: "tata",
 | 
				
			||||||
 | 
									PayerLastName:  "titi",
 | 
				
			||||||
 | 
									Amount:         model.Money{Amount: 10, Currency: model.Currency("EUR")},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Benefits: []model.Benefit{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									RecipientID:        1,
 | 
				
			||||||
 | 
									RecipientFirstName: "toto",
 | 
				
			||||||
 | 
									RecipientLastName:  "titi",
 | 
				
			||||||
 | 
									Amount:             model.Money{Amount: 10, Currency: model.Currency("EUR")},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									RecipientID:        2,
 | 
				
			||||||
 | 
									RecipientFirstName: "tata",
 | 
				
			||||||
 | 
									RecipientLastName:  "titi",
 | 
				
			||||||
 | 
									Amount:             model.Money{Amount: 10, Currency: model.Currency("EUR")},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						got, err := convToExpenseRetrieved(input)
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
						assert.Equal(t, want, got)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user