chore: calculate total balance for space

This commit is contained in:
juancwu 2026-04-11 17:57:41 +00:00
commit 694b774986
6 changed files with 35 additions and 23 deletions

View file

@ -0,0 +1,9 @@
-- +goose Up
-- +goose StatementBegin
ALTER TABLE accounts ADD COLUMN balance TEXT NOT NULL DEFAULT '0.00';
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
ALTER TABLE accounts DROP COLUMN balance;
-- +goose StatementEnd

View file

@ -5,7 +5,6 @@ import (
"net/http" "net/http"
"git.juancwu.dev/juancwu/budgit/internal/ctxkeys" "git.juancwu.dev/juancwu/budgit/internal/ctxkeys"
"git.juancwu.dev/juancwu/budgit/internal/misc/currency"
"git.juancwu.dev/juancwu/budgit/internal/service" "git.juancwu.dev/juancwu/budgit/internal/service"
"git.juancwu.dev/juancwu/budgit/internal/ui" "git.juancwu.dev/juancwu/budgit/internal/ui"
"git.juancwu.dev/juancwu/budgit/internal/ui/blocks" "git.juancwu.dev/juancwu/budgit/internal/ui/blocks"
@ -14,11 +13,12 @@ import (
) )
type spaceHandler struct { type spaceHandler struct {
spaceService *service.SpaceService spaceService *service.SpaceService
accountService *service.AccountService
} }
func NewSpaceHandler(spaceService *service.SpaceService) *spaceHandler { func NewSpaceHandler(spaceService *service.SpaceService, accountService *service.AccountService) *spaceHandler {
return &spaceHandler{spaceService: spaceService} return &spaceHandler{spaceService: spaceService, accountService: accountService}
} }
func (h *spaceHandler) SpacesPage(w http.ResponseWriter, r *http.Request) { func (h *spaceHandler) SpacesPage(w http.ResponseWriter, r *http.Request) {
@ -41,14 +41,26 @@ func (h *spaceHandler) SpacesPage(w http.ResponseWriter, r *http.Request) {
if err != nil { if err != nil {
slog.Error("failed to get space member count", "error", err, "space_id", sp.ID) slog.Error("failed to get space member count", "error", err, "space_id", sp.ID)
memberCount = 0 memberCount = 0
err = nil
}
accounts, err := h.accountService.GetAccountsForSpace(sp.ID)
if err != nil {
slog.Error("failed to get space accounts", "error", err, "space_id", sp.ID)
accounts = nil
err = nil
}
totalBalance := decimal.Zero
for _, acc := range accounts {
totalBalance = totalBalance.Add(acc.Balance)
} }
cards = append(cards, blocks.SpaceCardInfo{ cards = append(cards, blocks.SpaceCardInfo{
ID: sp.ID, ID: sp.ID,
Name: sp.Name, Name: sp.Name,
MemberCount: memberCount, MemberCount: memberCount,
TotalBalance: decimal.Zero, TotalBalance: totalBalance,
Currency: currency.CAD,
}) })
} }

View file

@ -1,8 +0,0 @@
package currency
type Currency string
const (
CAD Currency = "cad"
USD Currency = "usd"
)

View file

@ -7,11 +7,12 @@ import (
) )
type Account struct { type Account struct {
ID string `db:"id"` ID string `db:"id"`
Name string `db:"name"` Name string `db:"name"`
SpaceID string `db:"space_id"` SpaceID string `db:"space_id"`
CreatedAt time.Time `db:"created_at"` Balance decimal.Decimal `db:"balance"`
UpdatedAt time.Time `db:"updated_at"` CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
} }
type TransactionType string type TransactionType string

View file

@ -9,8 +9,8 @@ import (
"git.juancwu.dev/juancwu/budgit/internal/app" "git.juancwu.dev/juancwu/budgit/internal/app"
"git.juancwu.dev/juancwu/budgit/internal/handler" "git.juancwu.dev/juancwu/budgit/internal/handler"
"git.juancwu.dev/juancwu/budgit/internal/middleware" "git.juancwu.dev/juancwu/budgit/internal/middleware"
"git.juancwu.dev/juancwu/budgit/internal/routeurl"
"git.juancwu.dev/juancwu/budgit/internal/router" "git.juancwu.dev/juancwu/budgit/internal/router"
"git.juancwu.dev/juancwu/budgit/internal/routeurl"
) )
func SetupRoutes(a *app.App) http.Handler { func SetupRoutes(a *app.App) http.Handler {
@ -19,7 +19,7 @@ func SetupRoutes(a *app.App) http.Handler {
authH := handler.NewAuthHandler(a.AuthService, a.InviteService, a.SpaceService) authH := handler.NewAuthHandler(a.AuthService, a.InviteService, a.SpaceService)
homeH := handler.NewHomeHandler() homeH := handler.NewHomeHandler()
settingsH := handler.NewSettingsHandler(a.AuthService, a.UserService) settingsH := handler.NewSettingsHandler(a.AuthService, a.UserService)
spaceH := handler.NewSpaceHandler(a.SpaceService) spaceH := handler.NewSpaceHandler(a.SpaceService, a.AccountService)
redirectH := handler.NewRedirectHandler() redirectH := handler.NewRedirectHandler()
r := router.New() r := router.New()

View file

@ -4,14 +4,12 @@ import "github.com/shopspring/decimal"
import "strings" import "strings"
import "git.juancwu.dev/juancwu/budgit/internal/ui/components/icon" import "git.juancwu.dev/juancwu/budgit/internal/ui/components/icon"
import "fmt" import "fmt"
import "git.juancwu.dev/juancwu/budgit/internal/misc/currency"
type SpaceCardInfo struct { type SpaceCardInfo struct {
ID string ID string
Name string Name string
MemberCount int MemberCount int
TotalBalance decimal.Decimal TotalBalance decimal.Decimal
Currency currency.Currency
} }
templ SpaceCard(info SpaceCardInfo) { templ SpaceCard(info SpaceCardInfo) {