diff --git a/cmd/web/handlers.go b/cmd/web/handlers.go index 911250e..5ad8f51 100644 --- a/cmd/web/handlers.go +++ b/cmd/web/handlers.go @@ -16,29 +16,25 @@ type createElectionRequestWithValidator struct { func (app *application) createElection(w http.ResponseWriter, r *http.Request) { var request createElectionRequestWithValidator - err := app.unmarshalRequest(r, &request) - if err != nil { + + if err := app.unmarshalRequest(r, &request); err != nil { app.clientError(w, http.StatusBadRequest, err.Error()) return } - request.CheckField(validator.NotBlank(request.Name), "name", "must not be blank") - request.CheckField(validator.GreaterThan(request.Tokens, 0), "tokens", "must be greater than 0") - request.CheckField(validator.After(request.ExpiresAt, time.Now()), "expiresAt", "must expire in a future date") - request.CheckField(validator.GreaterThan(len(request.Choices), 1), "choices", "there must be more than 1 choice") - - request.CheckField( - !(request.AreVotersKnown && request.MaxVoters < 1), - "maxVoters", - "must be greater than 0 when voters are known", - ) - - if !request.Valid() { + if !isRequestValid(&request) { app.unprocessableEntityError(w, request.Validator) return } - electionId, err := app.elections.Insert(request.Name, request.Tokens, request.AreVotersKnown, request.MaxVoters, request.Choices, request.ExpiresAt) + electionId, err := app.elections.Insert( + request.Name, + request.Tokens, + request.AreVotersKnown, + request.MaxVoters, + request.Choices, + request.ExpiresAt, + ) if err != nil { app.serverError(w, r, err) return @@ -66,6 +62,21 @@ func (app *application) createElection(w http.ResponseWriter, r *http.Request) { w.Write(res) } +func isRequestValid(r *createElectionRequestWithValidator) bool { + r.CheckField(validator.NotBlank(r.Name), "name", "must not be blank") + r.CheckField(validator.GreaterThan(r.Tokens, 0), "tokens", "must be greater than 0") + r.CheckField(validator.After(r.ExpiresAt, time.Now()), "expiresAt", "must expire in a future date") + r.CheckField(validator.GreaterThan(len(r.Choices), 1), "choices", "there must be more than 1 choice") + + r.CheckField( + !(r.AreVotersKnown && r.MaxVoters < 1), + "maxVoters", + "must be greater than 0 when voters are known", + ) + + return r.Valid() +} + func generateRandomVoterIdentity() string { const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" b := make([]byte, 16)