Refactoring usermodifier

This commit is contained in:
Andrea Fazzi 2020-01-27 11:43:56 +01:00
parent d027e84807
commit f35410e0ae
10 changed files with 136 additions and 25 deletions

View file

@ -16,9 +16,11 @@ func (e *Error) Error() string {
} }
var ( var (
RecordExists = errors.New("Record already exists!") RecordExists = errors.New("Record already exists!")
NotAuthorized = errors.New(i18n.Authorization["notAuthorized"]["it"]) NotAuthorized = errors.New(i18n.Authorization["notAuthorized"]["it"])
SchoolExists = &Error{
SchoolExists = &Error{
TemplateName: "error_school_exists", TemplateName: "error_school_exists",
Err: errors.New(i18n.Errors["schoolExists"]["it"]), Err: errors.New(i18n.Errors["schoolExists"]["it"]),
} }
@ -27,8 +29,14 @@ var (
TemplateName: "error_category_exists", TemplateName: "error_category_exists",
Err: errors.New(i18n.FlashMessages["categoryExists"]["it"]), Err: errors.New(i18n.FlashMessages["categoryExists"]["it"]),
} }
OutOfTime = &Error{ OutOfTime = &Error{
TemplateName: "error_out_of_time", TemplateName: "error_out_of_time",
Err: errors.New(i18n.Errors["outOfTime"]["it"]), Err: errors.New(i18n.Errors["outOfTime"]["it"]),
} }
ContestHasZeroQuestions = &Error{
TemplateName: "error_contest_has_zero_questions",
Err: errors.New(i18n.Errors["contestHasZeroQuestions"]["it"]),
}
) )

View file

@ -120,10 +120,10 @@ CREATE TABLE `participants` (
`created_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL,
`creator_id` varchar(255) DEFAULT NULL, `creator_id` int(10) unsigned DEFAULT NULL,
`creator_role` varchar(255) DEFAULT NULL, `creator_role` varchar(255) DEFAULT NULL,
`creator_ip` varchar(255) DEFAULT NULL, `creator_ip` varchar(255) DEFAULT NULL,
`updater_id` varchar(255) DEFAULT NULL, `updater_id` int(10) unsigned DEFAULT NULL,
`updater_role` varchar(255) DEFAULT NULL, `updater_role` varchar(255) DEFAULT NULL,
`updater_ip` varchar(255) DEFAULT NULL, `updater_ip` varchar(255) DEFAULT NULL,
`user_id` int(10) unsigned DEFAULT NULL, `user_id` int(10) unsigned DEFAULT NULL,
@ -216,10 +216,10 @@ CREATE TABLE `responses` (
`created_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL,
`creator_id` varchar(255) DEFAULT NULL, `creator_id` int(10) unsigned DEFAULT NULL,
`creator_role` varchar(255) DEFAULT NULL, `creator_role` varchar(255) DEFAULT NULL,
`creator_ip` varchar(255) DEFAULT NULL, `creator_ip` varchar(255) DEFAULT NULL,
`updater_id` varchar(255) DEFAULT NULL, `updater_id` int(10) unsigned DEFAULT NULL,
`updater_role` varchar(255) DEFAULT NULL, `updater_role` varchar(255) DEFAULT NULL,
`updater_ip` varchar(255) DEFAULT NULL, `updater_ip` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL,
@ -257,10 +257,10 @@ CREATE TABLE `schools` (
`created_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL,
`creator_id` varchar(255) DEFAULT NULL, `creator_id` int(10) unsigned DEFAULT NULL,
`creator_role` varchar(255) DEFAULT NULL, `creator_role` varchar(255) DEFAULT NULL,
`creator_ip` varchar(255) DEFAULT NULL, `creator_ip` varchar(255) DEFAULT NULL,
`updater_id` varchar(255) DEFAULT NULL, `updater_id` int(10) unsigned DEFAULT NULL,
`updater_role` varchar(255) DEFAULT NULL, `updater_role` varchar(255) DEFAULT NULL,
`updater_ip` varchar(255) DEFAULT NULL, `updater_ip` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL,

View file

@ -371,6 +371,7 @@ func (t *testSuite) TestSchoolSubscription() {
t.Equal(http.StatusSeeOther, rr.Code) t.Equal(http.StatusSeeOther, rr.Code)
log.Println(rr.Header())
schoolId, err := getIdFromPath(rr.Header()["Location"][0]) schoolId, err := getIdFromPath(rr.Header()["Location"][0])
if !t.Failed() { if !t.Failed() {
doc, err := goquery.NewDocumentFromReader(rr.Body) doc, err := goquery.NewDocumentFromReader(rr.Body)
@ -454,13 +455,14 @@ func (t *testSuite) TestUserModifier() {
t.Equal(http.StatusOK, rr.Code) t.Equal(http.StatusOK, rr.Code)
if !t.Failed() { if !t.Failed() {
fmt.Println(rr.Body)
doc, err := goquery.NewDocumentFromReader(rr.Body) doc, err := goquery.NewDocumentFromReader(rr.Body)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
expected := "Creato da" expected := "admin[administrator]"
ok := false ok := false
doc.Find("dt").Each(func(i int, s *goquery.Selection) { doc.Find("dd").Each(func(i int, s *goquery.Selection) {
if strings.Contains(s.Text(), expected) { if strings.Contains(s.Text(), expected) {
ok = true ok = true
} }

View file

@ -47,5 +47,8 @@ var (
"schoolExists": map[string]string{ "schoolExists": map[string]string{
"it": "Una scuola con questo codice meccanografico è già presente nella base dati!", "it": "Una scuola con questo codice meccanografico è già presente nella base dati!",
}, },
"contestHasZeroQuestions": map[string]string{
"it": "La gara a cui il partecipante è iscritto non contiene alcuna domanda.",
},
} }
) )

View file

@ -10,6 +10,7 @@ import (
"net/http" "net/http"
"time" "time"
"git.andreafazzi.eu/andrea/oef/errors"
"git.andreafazzi.eu/andrea/oef/renderer" "git.andreafazzi.eu/andrea/oef/renderer"
"github.com/dgrijalva/jwt-go" "github.com/dgrijalva/jwt-go"
"github.com/jinzhu/gorm" "github.com/jinzhu/gorm"
@ -92,7 +93,7 @@ func (c *Contest) ReadAll(db *Database, args map[string]string, w http.ResponseW
var contests []*Contest var contests []*Contest
claims := r.Context().Value("user").(*jwt.Token).Claims.(jwt.MapClaims) claims := r.Context().Value("user").(*jwt.Token).Claims.(jwt.MapClaims)
if claims["admin"].(bool) { if claims["admin"].(bool) {
if err := db._db.Order("created_at").Find(&contests).Error; err != nil { if err := db._db.Order("created_at").Find(&contests).Error; err != nil {
return nil, err return nil, err
@ -199,6 +200,10 @@ func (c *Contest) generateQuestionsOrder(db *gorm.DB) (string, error) {
return "", err return "", err
} }
if len(questions) == 0 {
return "", errors.ContestHasZeroQuestions
}
count := 0 count := 0
generated := make(map[int]bool, 0) generated := make(map[int]bool, 0)

View file

@ -78,6 +78,30 @@ func (model *Participant) String() string {
return fmt.Sprintf("%s %s", strings.ToUpper(model.Lastname), strings.Title(strings.ToLower(model.Firstname))) return fmt.Sprintf("%s %s", strings.ToUpper(model.Lastname), strings.Title(strings.ToLower(model.Firstname)))
} }
func (model *Participant) SetCreatorID(id uint) {
model.CreatorID = id
}
func (model *Participant) SetCreatorRole(role string) {
model.CreatorRole = role
}
func (model *Participant) SetCreatorIP(addr string) {
model.CreatorIP = addr
}
func (model *Participant) SetUpdaterID(id uint) {
model.UpdaterID = id
}
func (model *Participant) SetUpdaterRole(role string) {
model.UpdaterRole = role
}
func (model *Participant) SetUpdaterIP(addr string) {
model.UpdaterIP = addr
}
// func setFlashMessage(w http.ResponseWriter, r *http.Request, key string) error { // func setFlashMessage(w http.ResponseWriter, r *http.Request, key string) error {
// session, err := store.Get(r, "flash-session") // session, err := store.Get(r, "flash-session")
// if err != nil { // if err != nil {
@ -210,7 +234,7 @@ func (model *Participant) Create(db *Database, args map[string]string, w http.Re
return nil, errors.CategoryExists return nil, errors.CategoryExists
} }
participant.CreatorID = getUserIDFromTokenAsUint(r) WriteCreator(r, participant)
participant, err = CreateParticipant(db, participant) participant, err = CreateParticipant(db, participant)
if err != nil { if err != nil {
@ -362,11 +386,11 @@ func (model *Participant) Update(db *Database, args map[string]string, w http.Re
return nil, errors.CategoryExists return nil, errors.CategoryExists
} }
if err := db._db.Where(participant.(*Participant).ContestIDs).Find(&participant.(*Participant).Contests).Error; err != nil { if err := db._db.Where([]uint(participant.(*Participant).ContestIDs)).Find(&participant.(*Participant).Contests).Error; err != nil {
return nil, err return nil, err
} }
participant.(*Participant).UpdaterID = getUserIDFromTokenAsUint(r) WriteUpdater(r, participant.(*Participant))
_, err = SaveParticipant(db, participant) _, err = SaveParticipant(db, participant)
if err != nil { if err != nil {

View file

@ -63,6 +63,30 @@ func (model *Response) IsActive() bool {
return !time.Now().After(model.Contest.EndTime) || model.Contest.isAlwaysActive() return !time.Now().After(model.Contest.EndTime) || model.Contest.isAlwaysActive()
} }
func (model *Response) SetCreatorID(id uint) {
model.CreatorID = id
}
func (model *Response) SetCreatorRole(role string) {
model.CreatorRole = role
}
func (model *Response) SetCreatorIP(addr string) {
model.CreatorIP = addr
}
func (model *Response) SetUpdaterID(id uint) {
model.UpdaterID = id
}
func (model *Response) SetUpdaterRole(role string) {
model.UpdaterRole = role
}
func (model *Response) SetUpdaterIP(addr string) {
model.UpdaterIP = addr
}
func (model *Response) generateAnswersIDs() string { func (model *Response) generateAnswersIDs() string {
ids := make([]string, 0) ids := make([]string, 0)
for _, sr := range model.SingleResponses { for _, sr := range model.SingleResponses {
@ -93,7 +117,7 @@ func (model *Response) Create(db *Database, args map[string]string, w http.Respo
return nil, err return nil, err
} }
response.CreatorID = getUserIDFromTokenAsUint(r) WriteCreator(r, response)
response, err = CreateResponse(db, response) response, err = CreateResponse(db, response)
if err != nil { if err != nil {
@ -210,7 +234,7 @@ func (model *Response) Update(db *Database, args map[string]string, w http.Respo
return nil, err return nil, err
} }
response.(*Response).UpdaterID = getUserIDFromTokenAsUint(r) WriteUpdater(r, response.(*Response))
_, err = SaveResponse(db, response) _, err = SaveResponse(db, response)
if err != nil { if err != nil {

View file

@ -30,6 +30,8 @@ https://iscrizioni.olimpiadi-economiaefinanza.it/
ed inserire le credenziali riportate sopra (si consiglia di effettuare un copia/incolla). ed inserire le credenziali riportate sopra (si consiglia di effettuare un copia/incolla).
Questa mail è stata generata da un sistema automatico. Si prega di non rispondere.
Cordialmente, Cordialmente,
Lo Staff delle OEF 2020. Lo Staff delle OEF 2020.
` `
@ -91,6 +93,30 @@ func (model *School) To() string {
return model.Email return model.Email
} }
func (model *School) SetCreatorID(id uint) {
model.CreatorID = id
}
func (model *School) SetCreatorRole(role string) {
model.CreatorRole = role
}
func (model *School) SetCreatorIP(addr string) {
model.CreatorIP = addr
}
func (model *School) SetUpdaterID(id uint) {
model.UpdaterID = id
}
func (model *School) SetUpdaterRole(role string) {
model.UpdaterRole = role
}
func (model *School) SetUpdaterIP(addr string) {
model.UpdaterIP = addr
}
func (model *School) exists(db *Database) (*User, error) { func (model *School) exists(db *Database) (*User, error) {
var user User var user User
if err := db._db.First(&user, &User{Username: model.Username()}).Error; err != nil && err != gorm.ErrRecordNotFound { if err := db._db.First(&user, &User{Username: model.Username()}).Error; err != nil && err != gorm.ErrRecordNotFound {
@ -165,9 +191,7 @@ func (model *School) Create(db *Database, args map[string]string, w http.Respons
return nil, err return nil, err
} }
school.CreatorID = getUserIDFromTokenAsUint(r) WriteCreator(r, school)
school.CreatorRole = getUserRole(r)
school.CreatorIP = r.RemoteAddr
school.mailSender = mail.NewMailSender(db.Config, mailBody) school.mailSender = mail.NewMailSender(db.Config, mailBody)
school, err = CreateSchool(db, school) school, err = CreateSchool(db, school)
@ -238,12 +262,7 @@ func (model *School) Update(db *Database, args map[string]string, w http.Respons
return nil, err return nil, err
} }
// FIXME WriteUpdater(r, school.(*School))
// WriteCreator(school.(*School))
school.(*School).UpdaterID = getUserIDFromTokenAsUint(r)
school.(*School).UpdaterRole = getUserRole(r)
school.(*School).UpdaterIP = r.RemoteAddr
_, err = SaveSchool(db, school) _, err = SaveSchool(db, school)
if err != nil { if err != nil {

View file

@ -1,5 +1,7 @@
package orm package orm
import "net/http"
type Modifier interface { type Modifier interface {
SetCreatorID(id uint) SetCreatorID(id uint)
SetUpdaterID(id uint) SetUpdaterID(id uint)
@ -45,3 +47,16 @@ func (um UserModifier) UpdatedBy() *User {
return um.Updater return um.Updater
} }
func WriteCreator(r *http.Request, modifier Modifier) {
modifier.SetCreatorID(getUserIDFromTokenAsUint(r))
modifier.SetCreatorRole(getUserRole(r))
modifier.SetCreatorIP(r.RemoteAddr)
}
func WriteUpdater(r *http.Request, modifier Modifier) {
modifier.SetUpdaterID(getUserIDFromTokenAsUint(r))
modifier.SetUpdaterRole(getUserRole(r))
modifier.SetUpdaterIP(r.RemoteAddr)
}

View file

@ -0,0 +1,11 @@
{{ define "content" }}
<div class="container">
<h1 class="border-bottom">Errore</h1>
<p>
Si è verificato un errore durante la creazione o l'aggiornamento di un partecipante: <strong>{{.Data}}</strong>
</p>
<p>
Clicca {{all "Contest"|anchor "qui"}} per tornare all'elenco delle gare.
</p>
</div>
{{ end }}