🚨 go fmt; go mod tidy
This commit is contained in:
parent
fb2a29be51
commit
b0657a3fb2
20 changed files with 715 additions and 722 deletions
218
http/main.go
218
http/main.go
|
|
@ -19,137 +19,137 @@ import (
|
|||
)
|
||||
|
||||
func Serve(bindAddr string) error {
|
||||
e := echo.New()
|
||||
e.Pre(middleware.RemoveTrailingSlash())
|
||||
// e.Use(middleware.Recover())
|
||||
e := echo.New()
|
||||
e.Pre(middleware.RemoveTrailingSlash())
|
||||
// e.Use(middleware.Recover())
|
||||
|
||||
NewTemplateRenderer(e, "tmpl/*.html")
|
||||
|
||||
e.Static("/static", "static")
|
||||
e.GET("/", handleIndex)
|
||||
e.GET("/v", handleVotingForm)
|
||||
e.POST("/v", handleNewVoting)
|
||||
e.GET("/v/:id", handleShowVoting)
|
||||
e.POST("/v/:id", handleVote)
|
||||
NewTemplateRenderer(e, "tmpl/*.html")
|
||||
|
||||
return e.Start(bindAddr)
|
||||
e.Static("/static", "static")
|
||||
e.GET("/", handleIndex)
|
||||
e.GET("/v", handleVotingForm)
|
||||
e.POST("/v", handleNewVoting)
|
||||
e.GET("/v/:id", handleShowVoting)
|
||||
e.POST("/v/:id", handleVote)
|
||||
|
||||
return e.Start(bindAddr)
|
||||
}
|
||||
|
||||
func handleIndex(ctx echo.Context) error {
|
||||
return ctx.Redirect(http.StatusTemporaryRedirect, "/v")
|
||||
return ctx.Redirect(http.StatusTemporaryRedirect, "/v")
|
||||
}
|
||||
|
||||
func handleNewVoting(ctx echo.Context) error {
|
||||
id :=utils.GenerateRandomString(11)
|
||||
var (
|
||||
formReferendum = ctx.FormValue("referendum")
|
||||
formDeadline = ctx.FormValue("deadline")
|
||||
formQuorum = ctx.FormValue("quorum")
|
||||
formThreshold = ctx.FormValue("threshold")
|
||||
formElectors = ctx.FormValue("electors")
|
||||
formAnonymous = ctx.FormValue("anonymous")
|
||||
)
|
||||
id := utils.GenerateRandomString(11)
|
||||
var (
|
||||
formReferendum = ctx.FormValue("referendum")
|
||||
formDeadline = ctx.FormValue("deadline")
|
||||
formQuorum = ctx.FormValue("quorum")
|
||||
formThreshold = ctx.FormValue("threshold")
|
||||
formElectors = ctx.FormValue("electors")
|
||||
formAnonymous = ctx.FormValue("anonymous")
|
||||
)
|
||||
|
||||
var (
|
||||
err error
|
||||
r string
|
||||
d time.Time
|
||||
q quorum.Quorum
|
||||
t threshold.Threshold
|
||||
e = []string{}
|
||||
a bool
|
||||
)
|
||||
var (
|
||||
err error
|
||||
r string
|
||||
d time.Time
|
||||
q quorum.Quorum
|
||||
t threshold.Threshold
|
||||
e = []string{}
|
||||
a bool
|
||||
)
|
||||
|
||||
r = formReferendum
|
||||
deadlineNum := fmt.Sprintf("%s", formDeadline[:len(formDeadline)-1])
|
||||
deadlineUnit := fmt.Sprintf("%s", formDeadline[len(formDeadline)-1:])
|
||||
deadlineInt, err := strconv.Atoi(deadlineNum)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch deadlineUnit {
|
||||
case "m", "":
|
||||
d = time.Now().UTC().Add(time.Duration(deadlineInt)*time.Minute).Round(time.Second)
|
||||
case "h":
|
||||
d = time.Now().UTC().Add(time.Duration(deadlineInt)*time.Hour).Round(time.Second)
|
||||
case "d":
|
||||
d = time.Now().UTC().Add(time.Duration(deadlineInt)*time.Hour*24).Round(time.Second)
|
||||
default:
|
||||
panic("this code should never be reached")
|
||||
}
|
||||
r = formReferendum
|
||||
deadlineNum := fmt.Sprintf("%s", formDeadline[:len(formDeadline)-1])
|
||||
deadlineUnit := fmt.Sprintf("%s", formDeadline[len(formDeadline)-1:])
|
||||
deadlineInt, err := strconv.Atoi(deadlineNum)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch deadlineUnit {
|
||||
case "m", "":
|
||||
d = time.Now().UTC().Add(time.Duration(deadlineInt) * time.Minute).Round(time.Second)
|
||||
case "h":
|
||||
d = time.Now().UTC().Add(time.Duration(deadlineInt) * time.Hour).Round(time.Second)
|
||||
case "d":
|
||||
d = time.Now().UTC().Add(time.Duration(deadlineInt) * time.Hour * 24).Round(time.Second)
|
||||
default:
|
||||
panic("this code should never be reached")
|
||||
}
|
||||
|
||||
if q, err = quorum.FromString(formQuorum); err != nil {
|
||||
return err
|
||||
}
|
||||
if t, err = threshold.FromString(formThreshold); err != nil {
|
||||
return err
|
||||
}
|
||||
e = strings.Split(formElectors, " ")
|
||||
if formAnonymous == "on" {
|
||||
a = true
|
||||
}
|
||||
if q, err = quorum.FromString(formQuorum); err != nil {
|
||||
return err
|
||||
}
|
||||
if t, err = threshold.FromString(formThreshold); err != nil {
|
||||
return err
|
||||
}
|
||||
e = strings.Split(formElectors, " ")
|
||||
if formAnonymous == "on" {
|
||||
a = true
|
||||
}
|
||||
|
||||
store.NewVoting(id, r, d, q, t, e, a)
|
||||
return ctx.Redirect(http.StatusFound, fmt.Sprintf("/v/%s", id))
|
||||
store.NewVoting(id, r, d, q, t, e, a)
|
||||
return ctx.Redirect(http.StatusFound, fmt.Sprintf("/v/%s", id))
|
||||
}
|
||||
|
||||
func handleVotingForm(ctx echo.Context) error {
|
||||
return ctx.Render(http.StatusOK, "voting_form", nil)
|
||||
return ctx.Render(http.StatusOK, "voting_form", nil)
|
||||
}
|
||||
|
||||
func handleVote(ctx echo.Context) error {
|
||||
var (
|
||||
id = uuid.New().String()
|
||||
vid = ctx.Param("id")
|
||||
elector = ctx.Request().Header.Get("X-Remote-User")
|
||||
choice = ctx.FormValue("vote")
|
||||
v *voting.Voting
|
||||
c vote.Choice
|
||||
err error
|
||||
)
|
||||
v, err = store.GetVoting(vid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if time.Now().UTC().After(v.Deadline()) {
|
||||
return ctx.Redirect(http.StatusFound, fmt.Sprintf("/v/%s", vid))
|
||||
}
|
||||
if !eligible(elector, v.Electors()) {
|
||||
return ctx.String(http.StatusForbidden, "")
|
||||
}
|
||||
if c, err = vote.ChoiceFromString(choice); err != nil {
|
||||
return err
|
||||
}
|
||||
store.PlaceVote(id, vid, elector, c)
|
||||
return ctx.Render(http.StatusFound, "thanks", map[string]interface{}{
|
||||
"Id": id,
|
||||
"Vid": vid,
|
||||
})
|
||||
var (
|
||||
id = uuid.New().String()
|
||||
vid = ctx.Param("id")
|
||||
elector = ctx.Request().Header.Get("X-Remote-User")
|
||||
choice = ctx.FormValue("vote")
|
||||
v *voting.Voting
|
||||
c vote.Choice
|
||||
err error
|
||||
)
|
||||
v, err = store.GetVoting(vid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if time.Now().UTC().After(v.Deadline()) {
|
||||
return ctx.Redirect(http.StatusFound, fmt.Sprintf("/v/%s", vid))
|
||||
}
|
||||
if !eligible(elector, v.Electors()) {
|
||||
return ctx.String(http.StatusForbidden, "")
|
||||
}
|
||||
if c, err = vote.ChoiceFromString(choice); err != nil {
|
||||
return err
|
||||
}
|
||||
store.PlaceVote(id, vid, elector, c)
|
||||
return ctx.Render(http.StatusFound, "thanks", map[string]interface{}{
|
||||
"Id": id,
|
||||
"Vid": vid,
|
||||
})
|
||||
}
|
||||
|
||||
func handleShowVoting(ctx echo.Context) error {
|
||||
v, err := store.GetVoting(ctx.Param("id"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if v.Deadline().After(time.Now().UTC()) {
|
||||
if !eligible(ctx.Request().Header.Get("X-Remote-User"), v.Electors()) {
|
||||
return ctx.String(http.StatusForbidden, "")
|
||||
}
|
||||
}
|
||||
return ctx.Render(http.StatusOK, "voting", map[string]interface{}{
|
||||
"Voting": v,
|
||||
})
|
||||
v, err := store.GetVoting(ctx.Param("id"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if v.Deadline().After(time.Now().UTC()) {
|
||||
if !eligible(ctx.Request().Header.Get("X-Remote-User"), v.Electors()) {
|
||||
return ctx.String(http.StatusForbidden, "")
|
||||
}
|
||||
}
|
||||
return ctx.Render(http.StatusOK, "voting", map[string]interface{}{
|
||||
"Voting": v,
|
||||
})
|
||||
}
|
||||
|
||||
func eligible(e string, electors []string) bool {
|
||||
if electors == nil || len(electors) == 0 {
|
||||
return true
|
||||
}
|
||||
for _, _e := range electors {
|
||||
if strings.ToLower(_e) == strings.ToLower(e) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
if electors == nil || len(electors) == 0 {
|
||||
return true
|
||||
}
|
||||
for _, _e := range electors {
|
||||
if strings.ToLower(_e) == strings.ToLower(e) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,24 +8,24 @@ import (
|
|||
)
|
||||
|
||||
type Template struct {
|
||||
Templates *template.Template
|
||||
Templates *template.Template
|
||||
}
|
||||
|
||||
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
|
||||
return t.Templates.ExecuteTemplate(w, name, data)
|
||||
return t.Templates.ExecuteTemplate(w, name, data)
|
||||
}
|
||||
|
||||
func NewTemplateRenderer(e *echo.Echo, paths ...string) {
|
||||
tmpl := &template.Template{}
|
||||
for i := range paths {
|
||||
template.Must(tmpl.ParseGlob(paths[i]))
|
||||
}
|
||||
t := newTemplate(tmpl)
|
||||
e.Renderer = t
|
||||
tmpl := &template.Template{}
|
||||
for i := range paths {
|
||||
template.Must(tmpl.ParseGlob(paths[i]))
|
||||
}
|
||||
t := newTemplate(tmpl)
|
||||
e.Renderer = t
|
||||
}
|
||||
|
||||
func newTemplate(templates *template.Template) echo.Renderer {
|
||||
return &Template{
|
||||
Templates: templates,
|
||||
}
|
||||
return &Template{
|
||||
Templates: templates,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue