feat: extract types to seperate files
All checks were successful
Build Docker Image / Build-Docker-Image (push) Successful in 4m27s
All checks were successful
Build Docker Image / Build-Docker-Image (push) Successful in 4m27s
This commit is contained in:
27
types/account.go
Normal file
27
types/account.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
// The Account holds money
|
||||||
|
type Account struct {
|
||||||
|
Id uuid.UUID
|
||||||
|
UserId uuid.UUID `db:"user_id"`
|
||||||
|
|
||||||
|
// Custom Name of the account, e.g. "Bank", "Cash", "Credit Card"
|
||||||
|
Name string
|
||||||
|
|
||||||
|
CurrentBalance int64 `db:"current_balance"`
|
||||||
|
LastTransaction *time.Time `db:"last_transaction"`
|
||||||
|
// The current precalculated value of:
|
||||||
|
// Account.Balance - [PiggyBank.Balance...]
|
||||||
|
OinkBalance int64 `db:"oink_balance"`
|
||||||
|
|
||||||
|
CreatedAt time.Time `db:"created_at"`
|
||||||
|
CreatedBy uuid.UUID `db:"created_by"`
|
||||||
|
UpdatedAt *time.Time `db:"updated_at"`
|
||||||
|
UpdatedBy *uuid.UUID `db:"updated_by"`
|
||||||
|
}
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
)
|
|
||||||
|
|
||||||
// At the center of the application is the transaction.
|
|
||||||
//
|
|
||||||
// Every piece of data should be calculated based on transactions. This means potential calculation errors can be fixed later in time.
|
|
||||||
//
|
|
||||||
// If it becomes necessary to precalculate snapshots for performance reasons, this can be done in the future. But the transaction should always be the source of truth.
|
|
||||||
type Transaction struct {
|
|
||||||
Id uuid.UUID
|
|
||||||
UserId uuid.UUID
|
|
||||||
|
|
||||||
AccountId uuid.UUID
|
|
||||||
// nil indicates that the transaction is not yet associated with a piggy bank
|
|
||||||
PiggyBankId *uuid.UUID
|
|
||||||
|
|
||||||
// The internal transaction is amove between e.g. an account and a piggy bank to execute a savings plan
|
|
||||||
Internal bool
|
|
||||||
|
|
||||||
// The value of the transacion. Negative for outgoing and positive for incoming
|
|
||||||
Value int64
|
|
||||||
Timestamp time.Time
|
|
||||||
|
|
||||||
Note string
|
|
||||||
|
|
||||||
CreatedAt time.Time
|
|
||||||
// either "<username>" or "system-<subsystem>"
|
|
||||||
CreatedBy uuid.UUID
|
|
||||||
UpdatedAt time.Time
|
|
||||||
UpdatedBy uuid.UUID
|
|
||||||
}
|
|
||||||
|
|
||||||
// The Account holds money
|
|
||||||
type Account struct {
|
|
||||||
Id uuid.UUID
|
|
||||||
UserId uuid.UUID `db:"user_id"`
|
|
||||||
|
|
||||||
// Custom Name of the account, e.g. "Bank", "Cash", "Credit Card"
|
|
||||||
Name string
|
|
||||||
|
|
||||||
CurrentBalance int64 `db:"current_balance"`
|
|
||||||
LastTransaction *time.Time `db:"last_transaction"`
|
|
||||||
// The current precalculated value of:
|
|
||||||
// Account.Balance - [PiggyBank.Balance...]
|
|
||||||
OinkBalance int64 `db:"oink_balance"`
|
|
||||||
|
|
||||||
CreatedAt time.Time `db:"created_at"`
|
|
||||||
CreatedBy uuid.UUID `db:"created_by"`
|
|
||||||
UpdatedAt *time.Time `db:"updated_at"`
|
|
||||||
UpdatedBy *uuid.UUID `db:"updated_by"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// The PiggyBank is a fictional account. The money it "holds" is actually in the Account
|
|
||||||
type PiggyBank struct {
|
|
||||||
Id uuid.UUID
|
|
||||||
UserId uuid.UUID
|
|
||||||
|
|
||||||
AccountId uuid.UUID
|
|
||||||
Name string
|
|
||||||
|
|
||||||
CurrentBalance int64
|
|
||||||
|
|
||||||
CreatedAt time.Time
|
|
||||||
CreatedBy uuid.UUID
|
|
||||||
UpdatedAt *time.Time
|
|
||||||
UpdatedBy *uuid.UUID
|
|
||||||
}
|
|
||||||
|
|
||||||
// The SavingsPlan is applied every interval to the PiggyBank/Account as a transaction
|
|
||||||
type SavingsPlan struct {
|
|
||||||
Id uuid.UUID
|
|
||||||
UserId uuid.UUID
|
|
||||||
|
|
||||||
PiggyBankId uuid.UUID
|
|
||||||
|
|
||||||
MonthlySaving int64
|
|
||||||
|
|
||||||
ValidFrom time.Time
|
|
||||||
/// nil means it is valid indefinitely
|
|
||||||
ValidTo *time.Time
|
|
||||||
|
|
||||||
CreatedAt time.Time
|
|
||||||
CreatedBy uuid.UUID
|
|
||||||
UpdatedAt *time.Time
|
|
||||||
UpdatedBy *uuid.UUID
|
|
||||||
}
|
|
||||||
26
types/savings_plan.go
Normal file
26
types/savings_plan.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
// The SavingsPlan is applied every interval to the TreasureChest/Account as a transaction
|
||||||
|
type SavingsPlan struct {
|
||||||
|
Id uuid.UUID
|
||||||
|
UserId uuid.UUID `db:"user_id"`
|
||||||
|
|
||||||
|
TreasureChestId uuid.UUID `db:"treasure_chest_id"`
|
||||||
|
|
||||||
|
MonthlySaving int64 `db:"monthly_saving"`
|
||||||
|
|
||||||
|
ValidFrom time.Time `db:"valid_from"`
|
||||||
|
/// nil means it is valid indefinitely
|
||||||
|
ValidTo *time.Time `db:"valid_to"`
|
||||||
|
|
||||||
|
CreatedAt time.Time `db:"created_at"`
|
||||||
|
CreatedBy uuid.UUID `db:"created_by"`
|
||||||
|
UpdatedAt *time.Time `db:"updated_at"`
|
||||||
|
UpdatedBy *uuid.UUID `db:"updated_by"`
|
||||||
|
}
|
||||||
37
types/transaction.go
Normal file
37
types/transaction.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
// At the center of the application is the transaction.
|
||||||
|
//
|
||||||
|
// Every piece of data should be calculated based on transactions.
|
||||||
|
// This means potential calculation errors can be fixed later in time.
|
||||||
|
//
|
||||||
|
// If it becomes necessary to precalculate snapshots for performance reasons, this can be done in the future.
|
||||||
|
// But the transaction should always be the source of truth.
|
||||||
|
type Transaction struct {
|
||||||
|
Id uuid.UUID
|
||||||
|
UserId uuid.UUID `db:"user_id"`
|
||||||
|
|
||||||
|
AccountId uuid.UUID `db:"account_id"`
|
||||||
|
// nil indicates that the transaction is not yet associated with a piggy bank
|
||||||
|
TreasureChestId *uuid.UUID `db:"treasure_chest_id"`
|
||||||
|
|
||||||
|
// The internal transaction is amove between e.g. an account and a piggy bank to execute a savings plan
|
||||||
|
Internal bool
|
||||||
|
|
||||||
|
// The value of the transacion. Negative for outgoing and positive for incoming
|
||||||
|
Value int64
|
||||||
|
Timestamp time.Time
|
||||||
|
|
||||||
|
Note string
|
||||||
|
|
||||||
|
CreatedAt time.Time `db:"created_at"`
|
||||||
|
CreatedBy uuid.UUID `db:"created_by"`
|
||||||
|
UpdatedAt *time.Time `db:"updated_at"`
|
||||||
|
UpdatedBy *uuid.UUID `db:"updated_by"`
|
||||||
|
}
|
||||||
24
types/treasure.go
Normal file
24
types/treasure.go
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
// The TreasureChest is a fictional account.
|
||||||
|
// The money it "holds" is actually in the linked Account
|
||||||
|
type TreasureChest struct {
|
||||||
|
Id uuid.UUID
|
||||||
|
UserId uuid.UUID `db:"user_id"`
|
||||||
|
|
||||||
|
AccountId uuid.UUID `db:"account_id"`
|
||||||
|
Name string
|
||||||
|
|
||||||
|
CurrentBalance int64 `db:"current_balance"`
|
||||||
|
|
||||||
|
CreatedAt time.Time `db:"created_at"`
|
||||||
|
CreatedBy uuid.UUID `db:"created_by"`
|
||||||
|
UpdatedAt *time.Time `db:"updated_at"`
|
||||||
|
UpdatedBy *uuid.UUID `db:"updated_by"`
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user