From 000ac334ccbb3d44d7eeeaf5059c987cbc95168f Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Mon, 1 Mar 2021 17:47:00 +0100 Subject: [PATCH] Add notion of promo --- db.go | 2 ++ htdocs/views/survey.html | 7 +++++++ main.go | 1 + surveys.go | 32 +++++++++++++++++++------------- users.go | 18 +++++++++++------- 5 files changed, 40 insertions(+), 20 deletions(-) diff --git a/db.go b/db.go index 7873411..9890395 100644 --- a/db.go +++ b/db.go @@ -60,6 +60,7 @@ CREATE TABLE IF NOT EXISTS users( firstname VARCHAR(255) NOT NULL, lastname VARCHAR(255) NOT NULL, time TIMESTAMP NOT NULL, + promo MEDIUMINT NOT NULL, is_admin BOOLEAN NOT NULL DEFAULT FALSE ) DEFAULT CHARACTER SET = utf8 COLLATE = utf8_bin; `); err != nil { @@ -79,6 +80,7 @@ CREATE TABLE IF NOT EXISTS user_sessions( CREATE TABLE IF NOT EXISTS surveys( id_survey INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255), + promo MEDIUMINT NOT NULL, shown BOOLEAN NOT NULL DEFAULT FALSE, corrected BOOLEAN NOT NULL DEFAULT FALSE, start_availability TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, diff --git a/htdocs/views/survey.html b/htdocs/views/survey.html index 3758fdd..91304d6 100644 --- a/htdocs/views/survey.html +++ b/htdocs/views/survey.html @@ -16,6 +16,13 @@ +
+ +
+ +
+
+
diff --git a/main.go b/main.go index 19156d0..a3bbde0 100644 --- a/main.go +++ b/main.go @@ -60,6 +60,7 @@ func main() { var bind = flag.String("bind", ":8081", "Bind port/socket") var dsn = flag.String("dsn", DSNGenerator(), "DSN to connect to the MySQL server") flag.StringVar(&baseURL, "baseurl", baseURL, "URL prepended to each URL") + flag.UintVar(¤tPromo, "current-promo", currentPromo, "Year of the current promotion") flag.Parse() // Sanitize options diff --git a/surveys.go b/surveys.go index cd531d3..5556c3e 100644 --- a/surveys.go +++ b/surveys.go @@ -3,6 +3,7 @@ package main import ( "encoding/json" "errors" + "fmt" "net/http" "strconv" "time" @@ -14,11 +15,11 @@ func init() { router.GET("/api/surveys", apiAuthHandler( func(u *User, _ httprouter.Params, _ []byte) HTTPResponse { if u == nil { - return formatApiResponse(getSurveys("WHERE shown = TRUE AND NOW() > start_availability")) + return formatApiResponse(getSurveys(fmt.Sprintf("WHERE shown = TRUE AND NOW() > start_availability AND promo = %d", currentPromo))) } else if u.IsAdmin { return formatApiResponse(getSurveys("")) } else { - return formatApiResponse(getSurveys("WHERE shown = TRUE")) + return formatApiResponse(getSurveys(fmt.Sprintf("WHERE shown = TRUE AND promo = %d", u.Promo))) } })) router.POST("/api/surveys", apiHandler(func(_ httprouter.Params, body []byte) HTTPResponse { @@ -27,11 +28,15 @@ func init() { return APIErrorResponse{err: err} } - return formatApiResponse(NewSurvey(new.Title, new.Shown, new.StartAvailability, new.EndAvailability)) + if new.Promo == 0 { + new.Promo = currentPromo + } + + return formatApiResponse(NewSurvey(new.Title, new.Promo, new.Shown, new.StartAvailability, new.EndAvailability)) }, adminRestricted)) router.GET("/api/surveys/:sid", apiAuthHandler(surveyAuthHandler( func(s Survey, u *User, _ []byte) HTTPResponse { - if s.Shown || (u != nil && u.IsAdmin) { + if (s.Promo == u.Promo && s.Shown) || (u != nil && u.IsAdmin) { return APIResponse{s} } else { return APIErrorResponse{ @@ -55,7 +60,7 @@ func init() { }), adminRestricted)) router.GET("/api/surveys/:sid/score", apiAuthHandler(surveyAuthHandler( func(s Survey, u *User, _ []byte) HTTPResponse { - if s.Shown || (u != nil && u.IsAdmin) { + if (s.Promo == u.Promo && s.Shown) || (u != nil && u.IsAdmin) { if score, err := s.GetScore(u); err != nil { return APIErrorResponse{err: err} } else if score == nil { @@ -73,7 +78,7 @@ func init() { router.GET("/api/users/:uid/surveys/:sid/score", apiAuthHandler(func(uauth *User, ps httprouter.Params, body []byte) HTTPResponse { return surveyAuthHandler(func(s Survey, uauth *User, _ []byte) HTTPResponse { return userHandler(func(u User, _ []byte) HTTPResponse { - if uauth != nil && ((s.Shown && u.Id == uauth.Id) || uauth.IsAdmin) { + if uauth != nil && ((s.Promo == u.Promo && s.Shown && u.Id == uauth.Id) || uauth.IsAdmin) { if score, err := s.GetScore(&u); err != nil { return APIErrorResponse{err: err} } else if score == nil { @@ -119,6 +124,7 @@ func surveyAuthHandler(f func(Survey, *User, []byte) HTTPResponse) func(*User, h type Survey struct { Id int64 `json:"id"` Title string `json:"title"` + Promo uint `json:"promo"` Shown bool `json:"shown"` Corrected bool `json:"corrected"` StartAvailability time.Time `json:"start_availability"` @@ -126,14 +132,14 @@ type Survey struct { } func getSurveys(cnd string, param ...interface{}) (surveys []Survey, err error) { - if rows, errr := DBQuery("SELECT id_survey, title, shown, corrected, start_availability, end_availability FROM surveys "+cnd, param...); errr != nil { + if rows, errr := DBQuery("SELECT id_survey, title, promo, shown, corrected, start_availability, end_availability FROM surveys "+cnd, param...); errr != nil { return nil, errr } else { defer rows.Close() for rows.Next() { var s Survey - if err = rows.Scan(&s.Id, &s.Title, &s.Shown, &s.Corrected, &s.StartAvailability, &s.EndAvailability); err != nil { + if err = rows.Scan(&s.Id, &s.Title, &s.Promo, &s.Shown, &s.Corrected, &s.StartAvailability, &s.EndAvailability); err != nil { return } surveys = append(surveys, s) @@ -147,17 +153,17 @@ func getSurveys(cnd string, param ...interface{}) (surveys []Survey, err error) } func getSurvey(id int) (s Survey, err error) { - err = DBQueryRow("SELECT id_survey, title, shown, corrected, start_availability, end_availability FROM surveys WHERE id_survey=?", id).Scan(&s.Id, &s.Title, &s.Shown, &s.Corrected, &s.StartAvailability, &s.EndAvailability) + err = DBQueryRow("SELECT id_survey, title, promo, shown, corrected, start_availability, end_availability FROM surveys WHERE id_survey=?", id).Scan(&s.Id, &s.Title, &s.Promo, &s.Shown, &s.Corrected, &s.StartAvailability, &s.EndAvailability) return } -func NewSurvey(title string, shown bool, startAvailability time.Time, endAvailability time.Time) (Survey, error) { - if res, err := DBExec("INSERT INTO surveys (title, shown, start_availability, end_availability) VALUES (?, ?, ?, ?)", title, shown, startAvailability, endAvailability); err != nil { +func NewSurvey(title string, promo uint, shown bool, startAvailability time.Time, endAvailability time.Time) (Survey, error) { + if res, err := DBExec("INSERT INTO surveys (title, promo, shown, start_availability, end_availability) VALUES (?, ?, ?, ?, ?)", title, promo, shown, startAvailability, endAvailability); err != nil { return Survey{}, err } else if sid, err := res.LastInsertId(); err != nil { return Survey{}, err } else { - return Survey{sid, title, shown, false, startAvailability, endAvailability}, nil + return Survey{sid, title, promo, shown, false, startAvailability, endAvailability}, nil } } @@ -195,7 +201,7 @@ func (s Survey) GetScores() (scores map[int64]*float64, err error) { } func (s Survey) Update() (int64, error) { - if res, err := DBExec("UPDATE surveys SET title = ?, shown = ?, corrected = ?, start_availability = ?, end_availability = ? WHERE id_survey = ?", s.Title, s.Shown, s.Corrected, s.StartAvailability, s.EndAvailability, s.Id); err != nil { + if res, err := DBExec("UPDATE surveys SET title = ?, promo = ?, shown = ?, corrected = ?, start_availability = ?, end_availability = ? WHERE id_survey = ?", s.Title, s.Promo, s.Shown, s.Corrected, s.StartAvailability, s.EndAvailability, s.Id); err != nil { return 0, err } else if nb, err := res.RowsAffected(); err != nil { return 0, err diff --git a/users.go b/users.go index d779ed7..1e5d8bc 100644 --- a/users.go +++ b/users.go @@ -8,6 +8,8 @@ import ( "github.com/julienschmidt/httprouter" ) +var currentPromo uint = 0 + func init() { router.GET("/api/users", apiHandler( func(httprouter.Params, []byte) HTTPResponse { @@ -47,18 +49,19 @@ type User struct { Firstname string `json:"firstname"` Lastname string `json:"lastname"` Time time.Time `json:"time"` + Promo uint `json:"promo"` IsAdmin bool `json:"is_admin"` } func getUsers() (users []User, err error) { - if rows, errr := DBQuery("SELECT id_user, login, email, firstname, lastname, time, is_admin FROM users"); errr != nil { + if rows, errr := DBQuery("SELECT id_user, login, email, firstname, lastname, time, promo, is_admin FROM users"); errr != nil { return nil, errr } else { defer rows.Close() for rows.Next() { var u User - if err = rows.Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.IsAdmin); err != nil { + if err = rows.Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.Promo, &u.IsAdmin); err != nil { return } users = append(users, u) @@ -72,12 +75,12 @@ func getUsers() (users []User, err error) { } func getUser(id int) (u User, err error) { - err = DBQueryRow("SELECT id_user, login, email, firstname, lastname, time, is_admin FROM users WHERE id_user=?", id).Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.IsAdmin) + err = DBQueryRow("SELECT id_user, login, email, firstname, lastname, time, promo, is_admin FROM users WHERE id_user=?", id).Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.Promo, &u.IsAdmin) return } func getUserByLogin(login string) (u User, err error) { - err = DBQueryRow("SELECT id_user, login, email, firstname, lastname, time, is_admin FROM users WHERE login=?", login).Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.IsAdmin) + err = DBQueryRow("SELECT id_user, login, email, firstname, lastname, time, promo, is_admin FROM users WHERE login=?", login).Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.Promo, &u.IsAdmin) return } @@ -89,17 +92,17 @@ func userExists(login string) bool { func NewUser(login string, email string, firstname string, lastname string) (User, error) { t := time.Now() - if res, err := DBExec("INSERT INTO users (login, email, firstname, lastname, time) VALUES (?, ?, ?, ?, ?)", login, email, firstname, lastname, t); err != nil { + if res, err := DBExec("INSERT INTO users (login, email, firstname, lastname, time, promo) VALUES (?, ?, ?, ?, ?, ?)", login, email, firstname, lastname, t, currentPromo); err != nil { return User{}, err } else if sid, err := res.LastInsertId(); err != nil { return User{}, err } else { - return User{sid, login, email, firstname, lastname, t, false}, nil + return User{sid, login, email, firstname, lastname, t, currentPromo, false}, nil } } func (u User) Update() (int64, error) { - if res, err := DBExec("UPDATE users SET login = ?, email = ?, firstname = ?, lastname = ?, time = ? WHERE id_user = ?", u.Login, u.Email, u.Firstname, u.Lastname, u.Time, u.Id); err != nil { + if res, err := DBExec("UPDATE users SET login = ?, email = ?, firstname = ?, lastname = ?, time = ?, promo = ? WHERE id_user = ?", u.Login, u.Email, u.Firstname, u.Lastname, u.Time, u.Promo, u.Id); err != nil { return 0, err } else if nb, err := res.RowsAffected(); err != nil { return 0, err @@ -148,5 +151,6 @@ func updateUser(current User, body []byte) HTTPResponse { current.Firstname = new.Firstname current.Lastname = new.Lastname current.Time = new.Time + current.Promo = new.Promo return formatApiResponse(current.Update()) }