package main import ( "fmt" "strconv" "strings" "time" ) var validDueDurations = map[string]time.Duration{ "+3 days": time.Hour * 24 * 3, "+7 days": time.Hour * 24 * 7, "+14 days": time.Hour * 24 * 14, "+28 days": time.Hour * 24 * 28, } type NewDecisionForm struct { Title string Content string VoteType string Due string Errors map[string]string } func (f *NewDecisionForm) Validate() (bool, *Decision) { f.Errors = make(map[string]string) data := &Decision{} data.Title = strings.TrimSpace(f.Title) if len(data.Title) < 3 { f.Errors["Title"] = "Please enter at least 3 characters." } data.Content = strings.TrimSpace(f.Content) if len(strings.Fields(data.Content)) < 3 { f.Errors["Content"] = "Please enter at least 3 words." } if voteType, err := strconv.ParseUint(f.VoteType, 10, 8); err != nil || (voteType != 0 && voteType != 1) { f.Errors["VoteType"] = fmt.Sprint("Please choose a valid vote type", err) } else { data.VoteType = VoteType(uint8(voteType)) } if dueDuration, ok := validDueDurations[f.Due]; !ok { f.Errors["Due"] = "Please choose a valid due date" } else { year, month, day := time.Now().UTC().Add(dueDuration).Date() data.Due = time.Date(year, month, day, 23, 59, 59, 0, time.UTC) } return len(f.Errors) == 0, data } type EditDecisionForm struct { Title string Content string VoteType string Due string Decision *Decision Errors map[string]string } func (f *EditDecisionForm) Validate() (bool, *Decision) { f.Errors = make(map[string]string) data := f.Decision data.Title = strings.TrimSpace(f.Title) if len(data.Title) < 3 { f.Errors["Title"] = "Please enter at least 3 characters." } data.Content = strings.TrimSpace(f.Content) if len(strings.Fields(data.Content)) < 3 { f.Errors["Content"] = "Please enter at least 3 words." } if voteType, err := strconv.ParseUint(f.VoteType, 10, 8); err != nil || (voteType != 0 && voteType != 1) { f.Errors["VoteType"] = fmt.Sprint("Please choose a valid vote type", err) } else { data.VoteType = VoteType(uint8(voteType)) } if dueDuration, ok := validDueDurations[f.Due]; !ok { f.Errors["Due"] = "Please choose a valid due date" } else { year, month, day := time.Now().UTC().Add(dueDuration).Date() data.Due = time.Date(year, month, day, 23, 59, 59, 0, time.UTC) } return len(f.Errors) == 0, data } type ProxyVoteForm struct { Voter string Vote string Justification string Errors map[string]string } func (f *ProxyVoteForm) Validate() (bool, *Voter, *Vote, string) { f.Errors = make(map[string]string) data := &Vote{} var voter *Voter if voterId, err := strconv.ParseInt(f.Voter, 10, 64); err != nil { f.Errors["Voter"] = fmt.Sprint("Please choose a valid voter", err) } else if voter, err = GetVoterById(voterId); err != nil { f.Errors["Voter"] = fmt.Sprint("Please choose a valid voter", err) } else { data.VoterId = voter.Id } if vote, err := strconv.ParseInt(f.Vote, 10, 8); err != nil { f.Errors["Vote"] = fmt.Sprint("Please choose a valid vote", err) } else if voteChoice, ok := VoteChoices[vote]; !ok { f.Errors["Vote"] = fmt.Sprint("Please choose a valid vote") } else { data.Vote = voteChoice } justification := strings.TrimSpace(f.Justification) if len(justification) < 3 { f.Errors["Justification"] = "Please enter at least 3 characters." } return len(f.Errors) == 0, voter, data, justification }