admin core func done
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
@@ -14,6 +15,7 @@ import (
|
||||
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
|
||||
@@ -42,6 +44,7 @@ func VolunteerHandler(w http.ResponseWriter, r *http.Request) {
|
||||
"Title": "Assigned Volunteers",
|
||||
"IsAuthenticated": true,
|
||||
"ShowAdminNav": true,
|
||||
"UserName": username,
|
||||
"Users": user,
|
||||
"ActiveSection": "volunteer",
|
||||
})
|
||||
@@ -92,6 +95,28 @@ func EditVolunteerHandler(w http.ResponseWriter, r *http.Request) {
|
||||
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
|
||||
@@ -108,108 +133,6 @@ func EditVolunteerHandler(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
type User struct {
|
||||
ID int
|
||||
Name string
|
||||
}
|
||||
|
||||
type TeamLead struct {
|
||||
ID int
|
||||
Name string
|
||||
Volunteers []User
|
||||
}
|
||||
|
||||
type TeamBuilderData struct {
|
||||
TeamLeads []TeamLead
|
||||
UnassignedVolunteers []User
|
||||
}
|
||||
|
||||
|
||||
|
||||
func TeamBuilderHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// GET request: show team leads and unassigned volunteers
|
||||
if r.Method == http.MethodGet {
|
||||
var teamLeads []TeamLead
|
||||
var unassignedVolunteers []User
|
||||
|
||||
// Get all team leads (role_id = 2)
|
||||
tlRows, err := models.DB.Query(`SELECT user_id, first_name || ' ' || last_name AS name FROM users WHERE role_id = 2`)
|
||||
if err != nil {
|
||||
http.Error(w, "Error fetching team leads", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
defer tlRows.Close()
|
||||
for tlRows.Next() {
|
||||
var tl TeamLead
|
||||
tlRows.Scan(&tl.ID, &tl.Name)
|
||||
|
||||
// Get assigned volunteers for this team lead
|
||||
vRows, _ := models.DB.Query(`SELECT u.user_id, u.first_name || ' ' || u.last_name AS name
|
||||
FROM users u
|
||||
JOIN team t ON u.user_id = t.volunteer_id
|
||||
WHERE t.team_lead_id = $1`, tl.ID)
|
||||
|
||||
for vRows.Next() {
|
||||
var vol User
|
||||
vRows.Scan(&vol.ID, &vol.Name)
|
||||
tl.Volunteers = append(tl.Volunteers, vol)
|
||||
}
|
||||
|
||||
teamLeads = append(teamLeads, tl)
|
||||
}
|
||||
|
||||
// Get unassigned volunteers (role_id = 3)
|
||||
vRows, _ := models.DB.Query(`SELECT user_id, first_name || ' ' || last_name AS name
|
||||
FROM users
|
||||
WHERE role_id = 3
|
||||
AND user_id NOT IN (SELECT volunteer_id FROM team)`)
|
||||
for vRows.Next() {
|
||||
var vol User
|
||||
vRows.Scan(&vol.ID, &vol.Name)
|
||||
unassignedVolunteers = append(unassignedVolunteers, vol)
|
||||
}
|
||||
|
||||
utils.Render(w, "volunteer/team_builder.html", map[string]interface{}{
|
||||
"Title": "Team Builder",
|
||||
"IsAuthenticated": true,
|
||||
"ShowAdminNav": true,
|
||||
"TeamLeads": teamLeads,
|
||||
"UnassignedVolunteers": unassignedVolunteers,
|
||||
"ActiveSection": "team_builder",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// POST request: assign volunteer to a team lead
|
||||
if r.Method == http.MethodPost {
|
||||
if err := r.ParseForm(); err != nil {
|
||||
http.Error(w, "Invalid form", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
volunteerID, err := strconv.Atoi(r.FormValue("volunteer_id"))
|
||||
if err != nil {
|
||||
http.Error(w, "Invalid volunteer ID", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
teamLeadID, err := strconv.Atoi(r.FormValue("team_lead_id"))
|
||||
if err != nil {
|
||||
http.Error(w, "Invalid team lead ID", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
_, err = models.DB.Exec(`INSERT INTO team (volunteer_id, team_lead_id) VALUES ($1, $2)`, volunteerID, teamLeadID)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
http.Error(w, "Failed to assign volunteer", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
http.Redirect(w, r, "/team_builder", http.StatusSeeOther)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user