82 lines
2.2 KiB
Go
82 lines
2.2 KiB
Go
package handlers
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/patel-mann/poll-system/app/internal/models"
|
|
"github.com/patel-mann/poll-system/app/internal/utils"
|
|
)
|
|
|
|
|
|
func AdminDashboardHandler(w http.ResponseWriter, r *http.Request) {
|
|
currentAdminID := r.Context().Value("user_id").(int)
|
|
username,_ := models.GetCurrentUserName(r)
|
|
role, _ := r.Context().Value("uesr_role").(int)
|
|
|
|
var volunteerCount int
|
|
var totalDonations float64
|
|
var validatedCount int
|
|
var housesLeftPercent float64
|
|
|
|
// 1. Count volunteers assigned to this admin
|
|
err := models.DB.QueryRow(`
|
|
SELECT COUNT(av.volunteer_id)
|
|
FROM admin_volunteers av
|
|
WHERE av.admin_id = $1 AND av.is_active = TRUE;
|
|
`, currentAdminID).Scan(&volunteerCount)
|
|
if err != nil {
|
|
log.Println("Volunteer query error:", err)
|
|
volunteerCount = 0 // Set default value on error
|
|
}
|
|
|
|
// 2. Total donations from polls
|
|
err = models.DB.QueryRow(`
|
|
SELECT COALESCE(SUM(amount_donated), 0)
|
|
FROM poll_responce;
|
|
`).Scan(&totalDonations)
|
|
if err != nil {
|
|
log.Println("Donation query error:", err)
|
|
totalDonations = 0 // Set default value on error
|
|
}
|
|
|
|
// 3. Count validated addresses
|
|
err = models.DB.QueryRow(`
|
|
SELECT COUNT(*)
|
|
FROM address_database
|
|
WHERE visited_validated = TRUE;
|
|
`).Scan(&validatedCount)
|
|
if err != nil {
|
|
log.Println("Validated addresses query error:", err)
|
|
validatedCount = 0 // Set default value on error
|
|
}
|
|
|
|
// 4. Calculate percentage of houses left to visit
|
|
err = models.DB.QueryRow(`
|
|
SELECT
|
|
CASE
|
|
WHEN COUNT(*) = 0 THEN 0
|
|
ELSE ROUND(
|
|
(COUNT(*) FILTER (WHERE visited_validated = FALSE)::numeric / COUNT(*)::numeric) * 100, 2
|
|
)
|
|
END
|
|
FROM address_database;
|
|
`).Scan(&housesLeftPercent)
|
|
if err != nil {
|
|
log.Println("Houses left query error:", err)
|
|
housesLeftPercent = 0 // Set default value on error
|
|
}
|
|
|
|
utils.Render(w, "dashboard/dashboard.html", map[string]interface{}{
|
|
"Title": "Admin Dashboard",
|
|
"IsAuthenticated": true,
|
|
"VolunteerCount": volunteerCount,
|
|
"TotalDonations": totalDonations,
|
|
"ValidatedCount": validatedCount,
|
|
"HousesLeftPercent": housesLeftPercent,
|
|
"ShowAdminNav": true,
|
|
"UserName": username,
|
|
"Role": role,
|
|
"ActiveSection": "dashboard",
|
|
})
|
|
} |