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