143 lines
3.8 KiB
Go
143 lines
3.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/patel-mann/poll-system/app/internal/models"
|
|
"github.com/patel-mann/poll-system/app/internal/utils"
|
|
)
|
|
|
|
|
|
func VolunteerHandler(w http.ResponseWriter, r *http.Request) {
|
|
// TODO: Replace this with actual session/jwt extraction
|
|
currentAdminID := r.Context().Value("user_id").(int)
|
|
username,_ := models.GetCurrentUserName(r)
|
|
|
|
rows, err := models.DB.Query(`
|
|
SELECT u.user_id, u.email, u.role_id, u.first_name, u.last_name, u.phone
|
|
FROM "users" u
|
|
JOIN admin_volunteers av ON u.user_id = av.volunteer_id
|
|
WHERE av.admin_id = $1 AND ( u.role_id = 3 OR u.role_id = 2 )
|
|
`, currentAdminID)
|
|
if err != nil {
|
|
http.Error(w, "Query error", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
|
|
var user []models.User
|
|
for rows.Next() {
|
|
var b models.User
|
|
err := rows.Scan(&b.UserID, &b.Email, &b.RoleID, &b.FirstName, &b.LastName, &b.Phone)
|
|
if err != nil {
|
|
log.Println("Scan error:", err)
|
|
continue
|
|
}
|
|
user = append(user, b)
|
|
}
|
|
|
|
utils.Render(w, "volunteer/volunteer.html", map[string]interface{}{
|
|
"Title": "Assigned Volunteers",
|
|
"IsAuthenticated": true,
|
|
"ShowAdminNav": true,
|
|
"UserName": username,
|
|
"Users": user,
|
|
"ActiveSection": "volunteer",
|
|
})
|
|
}
|
|
|
|
func EditVolunteerHandler(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method == http.MethodGet {
|
|
volunteerID := r.URL.Query().Get("id")
|
|
var user models.User
|
|
err := models.DB.QueryRow(`
|
|
SELECT user_id, email, role_id, first_name, last_name, phone
|
|
FROM "users"
|
|
WHERE user_id = $1 AND (role_id = 3 OR role_id = 2)
|
|
`, volunteerID).Scan(&user.UserID, &user.Email, &user.RoleID, &user.FirstName, &user.LastName, &user.Phone)
|
|
|
|
if err != nil {
|
|
http.Error(w, "Volunteer not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
utils.Render(w, "volunteer/edit_volunteer.html", map[string]interface{}{
|
|
"Title": "Edit Volunteer",
|
|
"IsAuthenticated": true,
|
|
"ShowAdminNav": true,
|
|
"Volunteer": user,
|
|
"ActiveSection": "volunteer",
|
|
})
|
|
return
|
|
}
|
|
|
|
if r.Method == http.MethodPost {
|
|
err := r.ParseForm()
|
|
if err != nil {
|
|
http.Error(w, "Invalid form", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
volunteerID := r.FormValue("user_id")
|
|
firstName := r.FormValue("first_name")
|
|
lastName := r.FormValue("last_name")
|
|
email := r.FormValue("email")
|
|
phone := r.FormValue("phone")
|
|
roleID := r.FormValue("role_id")
|
|
|
|
rid, err := strconv.Atoi(roleID)
|
|
if err != nil || (rid != 2 && rid != 3) {
|
|
http.Error(w, "Invalid role selection", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// If role is being updated to Team Leader
|
|
if rid == 2 {
|
|
// Check if the volunteer is in any team
|
|
var teamID int
|
|
err := models.DB.QueryRow(`SELECT team_id FROM team WHERE volunteer_id = $1`, volunteerID).Scan(&teamID)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
log.Printf("DB error checking team for user %s: %v", volunteerID, err)
|
|
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
// If found, remove from the team
|
|
if err == nil {
|
|
_, err := models.DB.Exec(`UPDATE team SET volunteer_id = NULL WHERE team_id = $1`, teamID)
|
|
if err != nil {
|
|
log.Printf("Failed to remove volunteer %s from team %d: %v", volunteerID, teamID, err)
|
|
http.Error(w, "Failed to update team assignment", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
_, err = models.DB.Exec(`
|
|
UPDATE "users"
|
|
SET first_name = $1, last_name = $2, email = $3, phone = $4, role_id = $5
|
|
WHERE user_id = $6
|
|
`, firstName, lastName, email, phone, rid, volunteerID)
|
|
|
|
if err != nil {
|
|
fmt.Print(err)
|
|
http.Error(w, "Update failed", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
http.Redirect(w, r, "/volunteers", http.StatusSeeOther)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//assign volunterr the title of team_leader
|
|
//Team View
|
|
//edit volnteer data
|
|
//
|