package dashboard import ( "context" "spend-sparrow/internal/auth_types" "spend-sparrow/internal/core" "spend-sparrow/internal/treasure_chest" "spend-sparrow/internal/treasure_chest_types" "spend-sparrow/internal/types" "time" "github.com/google/uuid" "github.com/jmoiron/sqlx" ) type Service struct { db *sqlx.DB } func NewService(db *sqlx.DB) *Service { return &Service{ db: db, } } func (s Service) MainChart( ctx context.Context, user *auth_types.User, ) ([]DashboardMainChartEntry, error) { if user == nil { return nil, core.ErrUnauthorized } transactions := make([]types.Transaction, 0) err := s.db.SelectContext(ctx, &transactions, ` SELECT * FROM "transaction" WHERE user_id = ? ORDER BY timestamp`, user.Id) err = core.TransformAndLogDbError(ctx, "dashboard Chart", nil, err) if err != nil { return nil, err } timeEntries := make([]DashboardMainChartEntry, 0) var lastEntry *DashboardMainChartEntry for _, t := range transactions { if t.Error != nil { continue } newDay := t.Timestamp.Truncate(24 * time.Hour) if lastEntry == nil { lastEntry = &DashboardMainChartEntry{ Day: newDay, Value: 0, Savings: 0, } } else if lastEntry.Day != newDay { timeEntries = append(timeEntries, *lastEntry) lastEntry = &DashboardMainChartEntry{ Day: newDay, Value: lastEntry.Value, Savings: lastEntry.Savings, } } if t.AccountId != nil { lastEntry.Value += t.Value } if t.TreasureChestId != nil { lastEntry.Savings += t.Value } } if lastEntry != nil { timeEntries = append(timeEntries, *lastEntry) } return timeEntries, nil } func (s Service) TreasureChests( ctx context.Context, user *auth_types.User, ) ([]*DashboardTreasureChest, error) { if user == nil { return nil, core.ErrUnauthorized } treasureChests := make([]*treasure_chest_types.TreasureChest, 0) err := s.db.SelectContext(ctx, &treasureChests, `SELECT * FROM treasure_chest WHERE user_id = ?`, user.Id) err = core.TransformAndLogDbError(ctx, "dashboard TreasureChests", nil, err) if err != nil { return nil, err } treasureChests = treasure_chest.SortTreasureChests(treasureChests) result := make([]*DashboardTreasureChest, 0) for _, t := range treasureChests { if t.ParentId == nil { result = append(result, &DashboardTreasureChest{ Name: t.Name, Value: t.CurrentBalance, Children: make([]DashboardTreasureChest, 0), }) } else { result[len(result)-1].Children = append(result[len(result)-1].Children, DashboardTreasureChest{ Name: t.Name, Value: t.CurrentBalance, Children: make([]DashboardTreasureChest, 0), }) } } return result, nil } func (s Service) TreasureChest( ctx context.Context, user *auth_types.User, treausureChestId *uuid.UUID, ) ([]DashboardMainChartEntry, error) { if user == nil { return nil, core.ErrUnauthorized } transactions := make([]types.Transaction, 0) err := s.db.SelectContext(ctx, &transactions, ` SELECT * FROM "transaction" WHERE user_id = ? AND treasure_chest_id = ? ORDER BY timestamp`, user.Id, treausureChestId) err = core.TransformAndLogDbError(ctx, "dashboard Chart", nil, err) if err != nil { return nil, err } timeEntries := make([]DashboardMainChartEntry, 0) var lastEntry *DashboardMainChartEntry for _, t := range transactions { if t.Error != nil { continue } newDay := t.Timestamp.Truncate(24 * time.Hour) if lastEntry == nil { lastEntry = &DashboardMainChartEntry{ Day: newDay, Value: 0, } } else if lastEntry.Day != newDay { timeEntries = append(timeEntries, *lastEntry) lastEntry = &DashboardMainChartEntry{ Day: newDay, Value: lastEntry.Value, } } if t.TreasureChestId != nil { lastEntry.Value += t.Value } } if lastEntry != nil { timeEntries = append(timeEntries, *lastEntry) } return timeEntries, nil }