Adding page to create votes and view the votes, rearanging some methods

This commit is contained in:
2026-01-23 13:54:05 -05:00
parent 0f6e8a8350
commit 3b0a8625bc
10 changed files with 479 additions and 152 deletions

View File

@@ -5,9 +5,14 @@ import (
"fmt"
"log"
"strings"
"net/http"
"strconv"
"io/ioutil"
"encoding/json"
"github.com/pkg/errors"
"go-sjles-pta-vote/server/common"
"go-sjles-pta-vote/server/db"
)
@@ -18,6 +23,80 @@ type Member struct {
const BATCH_SIZE = 100
func AdminMembersHandler(resWriter http.ResponseWriter, request *http.Request) {
if request.Method != http.MethodPost {
resWriter.WriteHeader(http.StatusMethodNotAllowed)
return
}
var year int
var err error
if err = request.ParseMultipartForm(10 << 20); err != nil {
common.SendError(resWriter, "Failed to parse multipart form", http.StatusBadRequest)
return
}
year_from_form := request.FormValue("year")
if year_from_form == "" {
common.SendError(resWriter, "Year is required", http.StatusBadRequest)
return
} else {
year, err = strconv.Atoi(year_from_form)
if err != nil {
common.SendError(resWriter, "Invalid year", http.StatusBadRequest)
return
}
}
file, _, err := request.FormFile("members.csv")
if err != nil {
common.SendError(resWriter, "Failed to read members.csv file", http.StatusBadRequest)
return
}
defer file.Close()
fileBytes, err := ioutil.ReadAll(file)
if err != nil {
common.SendError(resWriter, "Failed to read members.csv file", http.StatusInternalServerError)
return
}
if err = ParseMembersFromBytes(year, fileBytes); err != nil {
common.SendError(resWriter, "Failed to parse members from CSV", http.StatusBadRequest)
return
}
resWriter.WriteHeader(http.StatusOK)
json.NewEncoder(resWriter).Encode(map[string]bool{"success": true})
}
func AdminMembersView(resWriter http.ResponseWriter, request *http.Request) {
yearStr := request.URL.Query().Get("year")
if yearStr == "" {
common.SendError(resWriter, "Year is required", http.StatusBadRequest)
return
}
year, err := strconv.Atoi(yearStr)
if err != nil {
common.SendError(resWriter, "Invalid year", http.StatusBadRequest)
return
}
members, err := GetMembersByYear(year)
if err != nil {
common.SendError(resWriter, "Failed to get members", http.StatusInternalServerError)
return
}
resWriter.WriteHeader(http.StatusOK)
json.NewEncoder(resWriter).Encode(map[string]interface{}{
"success": true,
"members": members,
})
}
func ParseMembersFromBytes(year int, fileBytes []byte) error {
reader := csv.NewReader(strings.NewReader(string(fileBytes)))
reader.FieldsPerRecord = -1 // Allow variable number of fields per record