110 lines
2.9 KiB
Go
110 lines
2.9 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/patel-mann/poll-system/app/internal/models"
|
|
"github.com/patel-mann/poll-system/app/internal/utils"
|
|
)
|
|
|
|
func VolunteerAppointmentHandler(w http.ResponseWriter, r *http.Request) {
|
|
// Fetch appointments joined with address info
|
|
currentUserID := models.GetCurrentUserID(w, r)
|
|
username, _ := models.GetCurrentUserName(r)
|
|
|
|
rows, err := models.DB.Query(`
|
|
SELECT
|
|
a.sched_id,
|
|
a.user_id,
|
|
ad.address_id,
|
|
ad.address,
|
|
ad.latitude,
|
|
ad.longitude,
|
|
a.appointment_date,
|
|
a.appointment_time
|
|
FROM appointment a
|
|
JOIN address_database ad ON a.address_id = ad.address_id
|
|
WHERE a.user_id = $1
|
|
`, currentUserID)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
|
|
// Struct to hold appointment + address info
|
|
type AppointmentWithAddress struct {
|
|
SchedID int
|
|
UserID int
|
|
AddressID int
|
|
Address string
|
|
Latitude float64
|
|
Longitude float64
|
|
AppointmentDate time.Time
|
|
AppointmentTime time.Time
|
|
HasPollResponse bool // New field to track poll status
|
|
PollButtonText string // New field for button text
|
|
PollButtonClass string // New field for button styling
|
|
}
|
|
|
|
var appointments []AppointmentWithAddress
|
|
for rows.Next() {
|
|
var a AppointmentWithAddress
|
|
if err := rows.Scan(&a.SchedID, &a.UserID, &a.AddressID, &a.Address, &a.Latitude, &a.Longitude, &a.AppointmentDate, &a.AppointmentTime); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
// Check if poll response exists for this address
|
|
var pollResponseExists bool
|
|
err = models.DB.QueryRow(`
|
|
SELECT EXISTS(
|
|
SELECT 1
|
|
FROM poll p
|
|
JOIN poll_response pr ON p.poll_id = pr.poll_id
|
|
WHERE p.address_id = $1 AND p.user_id = $2
|
|
)
|
|
`, a.AddressID, currentUserID).Scan(&pollResponseExists)
|
|
|
|
if err != nil {
|
|
// If there's an error checking, default to no response
|
|
pollResponseExists = false
|
|
}
|
|
|
|
// Set button properties based on poll response status
|
|
a.HasPollResponse = pollResponseExists
|
|
if pollResponseExists {
|
|
a.PollButtonText = "Poll Taken"
|
|
a.PollButtonClass = "px-3 py-1 bg-green-600 text-white text-sm rounded cursor-not-allowed"
|
|
} else {
|
|
a.PollButtonText = "Ask Poll"
|
|
a.PollButtonClass = "px-3 py-1 bg-blue-600 text-white text-sm hover:bg-blue-700 rounded"
|
|
}
|
|
|
|
appointments = append(appointments, a)
|
|
}
|
|
|
|
role := r.Context().Value("user_role").(int)
|
|
adminnav := false
|
|
volunteernav := false
|
|
|
|
if role == 1 {
|
|
adminnav = true
|
|
volunteernav = false
|
|
} else {
|
|
adminnav = false
|
|
volunteernav = true
|
|
}
|
|
|
|
// Render template
|
|
utils.Render(w, "/appointment.html", map[string]interface{}{
|
|
"Title": "My Profile",
|
|
"IsAuthenticated": true,
|
|
"ShowAdminNav": adminnav,
|
|
"ShowVolunteerNav": volunteernav,
|
|
"ActiveSection": "address",
|
|
"UserName": username,
|
|
"Appointments": appointments,
|
|
})
|
|
} |