ci: add lint, coverage check and proper deploy workflow #2
@@ -253,11 +253,21 @@ func (h *FinanceHandler) Analytics(w http.ResponseWriter, r *http.Request) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
months, _ := strconv.Atoi(r.URL.Query().Get("months"))
|
q := r.URL.Query()
|
||||||
|
months, _ := strconv.Atoi(q.Get("months"))
|
||||||
if months <= 0 {
|
if months <= 0 {
|
||||||
months = 6
|
months = 6
|
||||||
}
|
}
|
||||||
analytics, err := h.svc.GetAnalytics(userID, months)
|
now := time.Now()
|
||||||
|
month, _ := strconv.Atoi(q.Get("month"))
|
||||||
|
year, _ := strconv.Atoi(q.Get("year"))
|
||||||
|
if month <= 0 {
|
||||||
|
month = int(now.Month())
|
||||||
|
}
|
||||||
|
if year <= 0 {
|
||||||
|
year = now.Year()
|
||||||
|
}
|
||||||
|
analytics, err := h.svc.GetAnalytics(userID, months, month, year)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writeError(w, "failed to get analytics", http.StatusInternalServerError)
|
writeError(w, "failed to get analytics", http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ func (r *FinanceRepository) GetSummary(userID int64, month, year int) (*model.Fi
|
|||||||
return summary, nil
|
return summary, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *FinanceRepository) GetAnalytics(userID int64, months int) (*model.FinanceAnalytics, error) {
|
func (r *FinanceRepository) GetAnalytics(userID int64, months, month, year int) (*model.FinanceAnalytics, error) {
|
||||||
analytics := &model.FinanceAnalytics{}
|
analytics := &model.FinanceAnalytics{}
|
||||||
|
|
||||||
// Monthly trend
|
// Monthly trend
|
||||||
@@ -342,27 +342,27 @@ func (r *FinanceRepository) GetAnalytics(userID int64, months int) (*model.Finan
|
|||||||
analytics.MonthlyTrend = []model.MonthlyTrend{}
|
analytics.MonthlyTrend = []model.MonthlyTrend{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avg daily expense for current month
|
// Avg daily expense for selected month
|
||||||
now := time.Now()
|
|
||||||
var totalExpense float64
|
var totalExpense float64
|
||||||
var dayCount int
|
var dayCount int
|
||||||
r.db.QueryRow(`SELECT COALESCE(SUM(amount),0), COUNT(DISTINCT date)
|
r.db.QueryRow(`SELECT COALESCE(SUM(amount),0), COUNT(DISTINCT date)
|
||||||
FROM finance_transactions WHERE user_id=$1 AND type='expense'
|
FROM finance_transactions WHERE user_id=$1 AND type='expense'
|
||||||
AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`,
|
AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`,
|
||||||
userID, int(now.Month()), now.Year()).Scan(&totalExpense, &dayCount)
|
userID, month, year).Scan(&totalExpense, &dayCount)
|
||||||
if dayCount > 0 {
|
if dayCount > 0 {
|
||||||
analytics.AvgDailyExpense = totalExpense / float64(dayCount)
|
analytics.AvgDailyExpense = totalExpense / float64(dayCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comparison with previous month
|
// Comparison with previous month
|
||||||
prevMonth := now.AddDate(0, -1, 0)
|
selectedMonth := time.Date(year, time.Month(month), 1, 0, 0, 0, 0, time.UTC)
|
||||||
|
prevMonthTime := selectedMonth.AddDate(0, -1, 0)
|
||||||
var currentMonthExp, prevMonthExp float64
|
var currentMonthExp, prevMonthExp float64
|
||||||
r.db.QueryRow(`SELECT COALESCE(SUM(amount),0) FROM finance_transactions WHERE user_id=$1 AND type='expense'
|
r.db.QueryRow(`SELECT COALESCE(SUM(amount),0) FROM finance_transactions WHERE user_id=$1 AND type='expense'
|
||||||
AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`,
|
AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`,
|
||||||
userID, int(now.Month()), now.Year()).Scan(¤tMonthExp)
|
userID, month, year).Scan(¤tMonthExp)
|
||||||
r.db.QueryRow(`SELECT COALESCE(SUM(amount),0) FROM finance_transactions WHERE user_id=$1 AND type='expense'
|
r.db.QueryRow(`SELECT COALESCE(SUM(amount),0) FROM finance_transactions WHERE user_id=$1 AND type='expense'
|
||||||
AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`,
|
AND EXTRACT(MONTH FROM date)=$2 AND EXTRACT(YEAR FROM date)=$3`,
|
||||||
userID, int(prevMonth.Month()), prevMonth.Year()).Scan(&prevMonthExp)
|
userID, int(prevMonthTime.Month()), prevMonthTime.Year()).Scan(&prevMonthExp)
|
||||||
|
|
||||||
analytics.ComparisonPrevMonth = model.Comparison{
|
analytics.ComparisonPrevMonth = model.Comparison{
|
||||||
Current: currentMonthExp,
|
Current: currentMonthExp,
|
||||||
|
|||||||
@@ -162,6 +162,6 @@ func (s *FinanceService) GetSummary(userID int64, month, year int) (*model.Finan
|
|||||||
return s.repo.GetSummary(userID, month, year)
|
return s.repo.GetSummary(userID, month, year)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *FinanceService) GetAnalytics(userID int64, months int) (*model.FinanceAnalytics, error) {
|
func (s *FinanceService) GetAnalytics(userID int64, months, month, year int) (*model.FinanceAnalytics, error) {
|
||||||
return s.repo.GetAnalytics(userID, months)
|
return s.repo.GetAnalytics(userID, months, month, year)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user