2025-08-26 14:13:09 -06:00
|
|
|
// Add this to your handlers package (create volunteer_posts.go or add to existing file)
|
|
|
|
|
|
|
|
|
|
package handlers
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"net/http"
|
|
|
|
|
"strconv"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/patel-mann/poll-system/app/internal/models"
|
|
|
|
|
"github.com/patel-mann/poll-system/app/internal/utils"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// VolunteerPostsHandler - Read-only posts view for volunteers
|
|
|
|
|
func VolunteerPostsHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
// Only allow GET requests for volunteers
|
|
|
|
|
if r.Method != http.MethodGet {
|
|
|
|
|
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get user info from context
|
|
|
|
|
role := r.Context().Value("user_role").(int)
|
2025-08-27 13:21:11 -06:00
|
|
|
CurrentUserID := models.GetCurrentUserID(w, r)
|
|
|
|
|
username,_ := models.GetCurrentUserName(r)
|
2025-08-26 14:13:09 -06:00
|
|
|
|
|
|
|
|
// Fetch posts from database
|
|
|
|
|
rows, err := models.DB.Query(`
|
|
|
|
|
SELECT p.post_id, p.author_id, u.first_name || ' ' || u.last_name AS author_name,
|
|
|
|
|
p.content, COALESCE(p.image_url, '') as image_url, p.created_at
|
|
|
|
|
FROM post p
|
|
|
|
|
JOIN users u ON p.author_id = u.user_id
|
2025-08-27 13:21:11 -06:00
|
|
|
JOIN admin_volunteers x ON u.user_id = x.admin_id
|
|
|
|
|
WHERE x.volunteer_id = $1
|
2025-08-26 14:13:09 -06:00
|
|
|
ORDER BY p.created_at DESC
|
2025-08-27 13:21:11 -06:00
|
|
|
`,CurrentUserID)
|
2025-08-26 14:13:09 -06:00
|
|
|
if err != nil {
|
|
|
|
|
fmt.Printf("Database query error: %v\n", err)
|
|
|
|
|
http.Error(w, "Failed to fetch posts", http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
defer rows.Close()
|
|
|
|
|
|
|
|
|
|
var posts []models.Post
|
|
|
|
|
for rows.Next() {
|
|
|
|
|
var p models.Post
|
|
|
|
|
err := rows.Scan(&p.PostID, &p.AuthorID, &p.AuthorName, &p.Content, &p.ImageURL, &p.CreatedAt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Printf("Row scan error: %v\n", err)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
posts = append(posts, p)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add cache busting parameter to image URLs
|
|
|
|
|
for i := range posts {
|
|
|
|
|
if posts[i].ImageURL != "" {
|
|
|
|
|
posts[i].ImageURL += "?t=" + strconv.FormatInt(time.Now().UnixNano(), 10)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get navigation flags
|
|
|
|
|
showAdminNav, showVolunteerNav := getNavFlags(role)
|
|
|
|
|
|
|
|
|
|
fmt.Printf("Volunteer viewing %d posts\n", len(posts))
|
|
|
|
|
|
|
|
|
|
utils.Render(w, "dashboard/volunteer_dashboard.html", map[string]interface{}{
|
|
|
|
|
"Title": "Community Posts",
|
|
|
|
|
"IsAuthenticated": true,
|
|
|
|
|
"ShowAdminNav": showAdminNav,
|
|
|
|
|
"ShowVolunteerNav": showVolunteerNav,
|
2025-08-27 13:21:11 -06:00
|
|
|
"UserName": username,
|
2025-08-26 14:13:09 -06:00
|
|
|
"Posts": posts,
|
|
|
|
|
"ActiveSection": "posts",
|
|
|
|
|
"IsVolunteer": true, // Flag to indicate this is volunteer view
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|