From 8c18f8a3f0da358e49ebcb9958518b03f91ed16a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Mon, 13 Jan 2025 17:13:55 +0100 Subject: [PATCH] Members: edit - archive/restore - delete --- controllers/members.go | 225 ++++++++++++++++++++++++++++++++++++++++- main.go | 6 ++ views/person.html | 91 ++++++++++------- views/person_form.html | 5 +- 4 files changed, 285 insertions(+), 42 deletions(-) diff --git a/controllers/members.go b/controllers/members.go index f04a597..64316d2 100644 --- a/controllers/members.go +++ b/controllers/members.go @@ -58,11 +58,11 @@ func MemberShow(c *fiber.Ctx) error { } var person models.Person - result := db.Preload("Section").Find( + result := db.Unscoped().Preload("Section").Find( &person, "id = ? AND is_member", id, true, ) - if errors.Is(result.Error, gorm.ErrRecordNotFound) { + if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } @@ -192,3 +192,224 @@ func MemberAdd(c *fiber.Ctx) error { "Errors": errors, }) } + +func MemberEdit(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var person models.Person + result := db.Find(&person, "id = ?", id) + + 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 | Modifier membre", + person.LastName, + person.LastName, + ) + + var sections []models.Section + db.Order("name collate nocase asc").Find( + §ions, + "contains_members = ?", + true, + ) + + var errors []string + 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.Save(&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": title, + "Person": person, + "Sections": sections, + "Errors": errors, + }) +} + +func MemberConvert(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var person models.Person + result := db.Find(&person, "id = ?", id) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result.Error != nil { + return result.Error + } + + person.IsContact = true + person.IsMember = false + + result = db.Save(&person) + if result.Error != nil { + return result.Error + } + + return c.Redirect(fmt.Sprintf( + "/contacts/%d", + person.ID, + )) +} + +func MemberArchive(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + result := db.Delete(&models.Person{}, id) + if result.Error != nil { + return result.Error + } + + return c.Redirect(fmt.Sprintf( + "/members/%s", + id, + )) +} + +func MemberRestore(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + result := db.Unscoped().Model(&models.Person{}).Where( + "id = ?", id, + ).Update("DeletedAt", nil) + + if result.Error != nil { + return result.Error + } + + return c.Redirect(fmt.Sprintf( + "/members/%s", + id, + )) +} + +func MemberPurge(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + result := db.Unscoped().Delete( + &models.Person{}, id, + ) + + if result.Error != nil { + return result.Error + } + + return c.Redirect("/members") +} diff --git a/main.go b/main.go index 1db35ea..0596f0b 100644 --- a/main.go +++ b/main.go @@ -121,6 +121,12 @@ func main() { app.Get("/members/:id", controllers.MemberShow) app.Get("/members/add", controllers.MemberAdd) app.Post("/members/add", controllers.MemberAdd) + app.Get("/members/:id/edit", controllers.MemberEdit) + app.Post("/members/:id/edit", controllers.MemberEdit) + app.Post("/members/:id/convert", controllers.MemberConvert) + app.Post("/members/:id/archive", controllers.MemberArchive) + app.Post("/members/:id/restore", controllers.MemberRestore) + app.Post("/members/:id/purge", controllers.MemberPurge) // Contacts app.Get("/contacts", controllers.Contacts) diff --git a/views/person.html b/views/person.html index 2a9b0d8..597acb4 100644 --- a/views/person.html +++ b/views/person.html @@ -159,45 +159,60 @@ -
+
{% if Person.IsMember %} -
- - - Modifier - -
- -
-
-
-
- -
-
- -
+
+
+ + + Modifier + +
+ +
+
+
+ {% if Person.DeletedAt.Valid %} +
+ +
+ {% else %} +
+ +
+ {% endif %} +
+ +
+
{% else %} diff --git a/views/person_form.html b/views/person_form.html index c6fc3f6..c68801b 100644 --- a/views/person_form.html +++ b/views/person_form.html @@ -47,7 +47,7 @@
{% endif %} -
+
@@ -204,7 +205,7 @@
-
+