Some checks failed
Build Docker Image / Build-Docker-Image (push) Has been cancelled
89 lines
1.9 KiB
Go
89 lines
1.9 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
"spend-sparrow/internal/db"
|
|
"spend-sparrow/internal/types"
|
|
"time"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
)
|
|
|
|
type Dashboard struct {
|
|
db *sqlx.DB
|
|
}
|
|
|
|
func NewDashboard(db *sqlx.DB) *Dashboard {
|
|
return &Dashboard{
|
|
db: db,
|
|
}
|
|
}
|
|
|
|
func (s Dashboard) Summary(ctx context.Context, user *types.User, month time.Time) (*types.DashboardMonthlySummary, error) {
|
|
if user == nil {
|
|
return nil, ErrUnauthorized
|
|
}
|
|
|
|
var summary types.DashboardMonthlySummary
|
|
|
|
var value *int64
|
|
err := s.db.GetContext(ctx, &value, `
|
|
SELECT SUM(value)
|
|
FROM "transaction"
|
|
WHERE user_id = $1
|
|
AND treasure_chest_id IS NOT NULL
|
|
AND account_id IS NULL
|
|
AND error IS NULL
|
|
AND date(timestamp, 'start of month') = date($2, 'start of month')`,
|
|
user.Id, month)
|
|
err = db.TransformAndLogDbError("dashboard", nil, err)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if value != nil {
|
|
summary.Savings = *value
|
|
}
|
|
|
|
err = s.db.GetContext(ctx, &value, `
|
|
SELECT SUM(value)
|
|
FROM "transaction"
|
|
WHERE user_id = $1
|
|
AND account_id IS NOT NULL
|
|
AND treasure_chest_id IS NULL
|
|
AND error IS NULL
|
|
AND date(timestamp, 'start of month') = date($2, 'start of month')`,
|
|
user.Id, month)
|
|
err = db.TransformAndLogDbError("dashboard", nil, err)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if value != nil {
|
|
summary.Income = *value
|
|
}
|
|
|
|
err = s.db.GetContext(ctx, &value, `
|
|
SELECT SUM(value)
|
|
FROM "transaction"
|
|
WHERE user_id = $1
|
|
AND account_id IS NOT NULL
|
|
AND treasure_chest_id IS NOT NULL
|
|
AND error IS NULL
|
|
AND date(timestamp, 'start of month') = date($2, 'start of month')`,
|
|
user.Id, month)
|
|
err = db.TransformAndLogDbError("dashboard", nil, err)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if value != nil {
|
|
summary.Expenses = *value
|
|
}
|
|
|
|
summary.Total = summary.Income + summary.Expenses
|
|
summary.Month = month
|
|
|
|
slog.Info("Dashboard summary", "summary", summary)
|
|
|
|
return &summary, nil
|
|
}
|