From 2a7d446f982ff5c6dac32d2a56fcebc6d4ae94aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Mon, 13 Jan 2025 12:38:19 +0100 Subject: [PATCH] Members: show & add --- controllers/members.go | 160 +++++++++++++++++++++++++++++ main.go | 3 + views/people.html | 10 +- views/person.html | 221 +++++++++++++++++++++++++++++++++++++++++ views/person_form.html | 216 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 605 insertions(+), 5 deletions(-) create mode 100644 views/person.html create mode 100644 views/person_form.html diff --git a/controllers/members.go b/controllers/members.go index 001275d..517a487 100644 --- a/controllers/members.go +++ b/controllers/members.go @@ -2,13 +2,29 @@ package controllers import ( "errors" + "fmt" + "strconv" "git.readonly.ch/bouzoure/pop-camarades/helpers" "git.readonly.ch/bouzoure/pop-camarades/models" + "github.com/go-playground/validator" "github.com/gofiber/fiber/v2" "gorm.io/gorm" ) +type PersonValidation struct { + LastName string `validate:"required,min=1,max=100"` + FirstName string `validate:"required,min=1,max=100"` + Email string `validate:"max=100,email"` + Phone string `validate:"max=100"` + Mobile string `validate:"max=100"` + Address1 string `validate:"max=100"` + Address2 string `validate:"max=100"` + PostalCode string `validate:"min=4,max=4,number"` + City string `validate:"max=100"` + Section string `validate:"required,number"` +} + func Members(c *fiber.Ctx) error { db, err := helpers.GetDatabase() if err != nil { @@ -32,3 +48,147 @@ func Members(c *fiber.Ctx) error { "People": people, }) } + +func MemberShow(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var person models.Person + result := db.Preload("Section").Find( + &person, "id = ? AND is_member", id, true, + ) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result.Error != nil { + return result.Error + } + + title := fmt.Sprintf( + "%s %s | Membre", + person.LastName, + person.FirstName, + ) + + return c.Render("person", fiber.Map{ + "PageTitle": title, + "Person": person, + }) +} + +func MemberAdd(c *fiber.Ctx) error { + var person models.Person + var errors []string + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var sections []models.Section + db.Order("name collate nocase asc").Find( + §ions, + "contains_members = ?", + true, + ) + + if c.Method() == "POST" { + data := PersonValidation{ + LastName: c.FormValue("last_name"), + FirstName: c.FormValue("first_name"), + Email: c.FormValue("email"), + Phone: c.FormValue("phone"), + Mobile: c.FormValue("mobile"), + Address1: c.FormValue("address1"), + Address2: c.FormValue("address2"), + PostalCode: c.FormValue("postal_code"), + City: c.FormValue("city"), + Section: c.FormValue("section"), + } + + validate := validator.New() + validErrs := validate.Struct(data) + + if validErrs != nil { + for _, validErr := range validErrs.(validator.ValidationErrors) { + switch validErr.Field() { + case "LastName": + errors = append(errors, "Le nom de famille est requis et ne peut pas contenir plus de 100 caractères") + case "FirstName": + errors = append(errors, "Le prénom est requis et ne peut pas contenir plus de 100 caractères") + case "Email": + if len(data.Email) > 0 { + errors = append(errors, "L'adresse email doit être valide") + } + case "Phone": + errors = append(errors, "Le numéro de téléphone fixe est trop long") + case "Mobile": + errors = append(errors, "Le numéro de téléphone mobile est trop long") + case "Address1": + errors = append(errors, "La ligne 1 de l'adresse est trop longue") + case "Address2": + errors = append(errors, "La ligne 2 de l'adresse est trop longue") + case "PostalCode": + if len(data.PostalCode) > 0 { + errors = append(errors, "Le code postal n'est pas valide") + } + case "City": + errors = append(errors, "Le lieu est trop long") + case "Section": + errors = append(errors, "La section n'est pas valide") + } + } + } + + person.IsContact = false + person.IsMember = true + person.LastName = data.LastName + person.FirstName = data.FirstName + person.Email = data.Email + person.Phone = data.Phone + person.Mobile = data.Mobile + person.Address1 = data.Address1 + person.Address2 = data.Address2 + person.PostalCode = data.PostalCode + person.City = data.City + + sectionID, err := strconv.ParseUint(data.Section, 10, 0) + if err == nil { + for _, section := range sections { + if section.ID == uint(sectionID) { + person.SectionID = uint(sectionID) + break + } + } + } + + if person.SectionID == 0 { + errors = append(errors, "La section est introuvable") + } + + if len(errors) == 0 { + result := db.Create(&person) + if result.Error != nil { + return result.Error + } else { + c.Redirect(fmt.Sprintf( + "/members/%d", + person.ID, + )) + } + } + } + + return c.Render("person_form", fiber.Map{ + "PageTitle": "Ajouter un membre", + "Person": person, + "Sections": sections, + "Errors": errors, + }) +} diff --git a/main.go b/main.go index 2f70245..1db35ea 100644 --- a/main.go +++ b/main.go @@ -118,6 +118,9 @@ func main() { // Members app.Get("/members", controllers.Members) + app.Get("/members/:id", controllers.MemberShow) + app.Get("/members/add", controllers.MemberAdd) + app.Post("/members/add", controllers.MemberAdd) // Contacts app.Get("/contacts", controllers.Contacts) diff --git a/views/people.html b/views/people.html index 6709732..f148c8e 100644 --- a/views/people.html +++ b/views/people.html @@ -34,22 +34,22 @@ {% if Person.IsMember %} - + {{ Person.LastName }} {% else %} - + {{ Person.LastName }} {% endif %} {% if Person.IsMember %} - + {{ Person.FirstName }} {% else %} - + {{ Person.FirstName }} {% endif %} @@ -59,7 +59,7 @@ {% if Person.SectionID %} - {{ Section.Section.Name }} + {{ Person.Section.Name }} {% endif %} diff --git a/views/person.html b/views/person.html new file mode 100644 index 0000000..2a9b0d8 --- /dev/null +++ b/views/person.html @@ -0,0 +1,221 @@ +{% extends "layouts/main.html" %} + +{% block main %} +
+
+ +
+
+ +
+
+ Nom de famille +
+
+ +
+
+ +
+
+ Prénom +
+
+ +
+
+ +
+
+ Email +
+
+ +
+
+ +
+
+ Téléphone fixe +
+
+ +
+
+ +
+
+ Téléphone mobile +
+
+ +
+
+ +
+
+ Adresse +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ Section +
+
+ +
+
+ +
+ {% if Person.IsMember %} +
+ + + Modifier + +
+ +
+
+
+
+ +
+
+ +
+
+ {% else %} + + + Modifier + +
+ +
+ {% endif %} +
+ +
+{% endblock %} diff --git a/views/person_form.html b/views/person_form.html new file mode 100644 index 0000000..c6fc3f6 --- /dev/null +++ b/views/person_form.html @@ -0,0 +1,216 @@ +{% extends "layouts/main.html" %} + +{% block main %} +
+
+ +
+
+ + {% if Errors %} +
+
    + {% for Error in Errors %} +
  • {{ Error }}
  • + {% endfor %} +
+
+ {% endif %} + +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+{% endblock %}