From fa3aa494194a6859b7ddf75f40660255a737bb57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Thu, 2 Jan 2025 15:29:55 +0100 Subject: [PATCH] =?UTF-8?q?Gestion=20des=20r=C3=B4les?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/roles.go | 210 ++++++++++++++++++++++++++++++ main.go | 9 ++ models/roles.go | 27 ++-- views/role.html | 136 ++++++++++++++++++++ views/role_form.html | 300 +++++++++++++++++++++++++++++++++++++++++++ views/roles.html | 51 ++++++++ 6 files changed, 725 insertions(+), 8 deletions(-) create mode 100644 controllers/roles.go create mode 100644 views/role.html create mode 100644 views/role_form.html create mode 100644 views/roles.html diff --git a/controllers/roles.go b/controllers/roles.go new file mode 100644 index 0000000..bc2cc23 --- /dev/null +++ b/controllers/roles.go @@ -0,0 +1,210 @@ +package controllers + +import ( + "errors" + "fmt" + + "git.readonly.ch/bouzoure/popvaud-people/helpers" + "git.readonly.ch/bouzoure/popvaud-people/models" + "github.com/gofiber/fiber/v2" + "gorm.io/gorm" +) + +func Roles(c *fiber.Ctx) error { + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var roles []models.Role + result := db.Order("name collate nocase asc").Find(&roles) + + if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) { + return err + } + + return c.Render("roles", fiber.Map{ + "PageTitle": "Rôles", + "Roles": roles, + }) +} + +func RoleShow(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var role models.Role + result := db.Find(&role, "id = ?", id) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result.Error != nil { + return err + } + + title := fmt.Sprintf( + "%s | Rôles", + role.Name, + ) + + return c.Render("role", fiber.Map{ + "PageTitle": title, + "Role": role, + }) +} + +func RoleAdd(c *fiber.Ctx) error { + var role models.Role + var errors []string + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + if c.Method() == "POST" { + + // Role name + role.Name = c.FormValue("name") + if len(role.Name) > 100 || len(role.Name) < 1 { + errors = append(errors, "Le nom doit contentir entre 1 et 100 caractères") + } + + // Member permissions + role.ShowMember = (c.FormValue("show_member") == "on") + role.CreateMember = (c.FormValue("create_member") == "on") + role.EditMember = (c.FormValue("edit_member") == "on") + role.ShowArchivedMember = (c.FormValue("show_archived_member") == "on") + role.ArchiveMember = (c.FormValue("archive_member") == "on") + role.RestoreMember = (c.FormValue("restore_member") == "on") + role.PurgeMember = (c.FormValue("purge_member") == "on") + role.ConvertMemberToContact = (c.FormValue("convert_member_to_contact") == "on") + role.ExportMember = (c.FormValue("export_member") == "on") + + // Contact permissions + role.ShowContact = (c.FormValue("show_contact") == "on") + role.CreateContact = (c.FormValue("create_contact") == "on") + role.EditContact = (c.FormValue("edit_contact") == "on") + role.ShowArchivedContact = (c.FormValue("show_archived_contact") == "on") + role.ArchiveContact = (c.FormValue("archive_contact") == "on") + role.RestoreContact = (c.FormValue("restore_contact") == "on") + role.PurgeContact = (c.FormValue("purge_contact") == "on") + role.ConvertContactToMember = (c.FormValue("convert_contact_to_member") == "on") + role.ExportContact = (c.FormValue("export_contact") == "on") + + if len(errors) == 0 { + result := db.Create(&role) + if result.Error != nil { + return result.Error + } else { + c.Redirect(fmt.Sprintf( + "/admin/roles/%d", + role.ID, + )) + } + } + } + + return c.Render("role_form", fiber.Map{ + "PageTitle": "Ajouter un rôle", + "role": role, + "Errors": errors, + }) +} + +func RoleEdit(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var role models.Role + result := db.Find(&role, "id = ?", id) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result.Error != nil { + return err + } + + title := fmt.Sprintf( + "%s | Modifier rôle", + role.Name, + ) + + var errors []string + if c.Method() == "POST" { + + // Role name + role.Name = c.FormValue("name") + if len(role.Name) > 100 || len(role.Name) < 1 { + errors = append(errors, "Le nom doit contentir entre 1 et 100 caractères") + } + + // Member permissions + role.ShowMember = (c.FormValue("show_member") == "on") + role.CreateMember = (c.FormValue("create_member") == "on") + role.EditMember = (c.FormValue("edit_member") == "on") + role.ShowArchivedMember = (c.FormValue("show_archived_member") == "on") + role.ArchiveMember = (c.FormValue("archive_member") == "on") + role.RestoreMember = (c.FormValue("restore_member") == "on") + role.PurgeMember = (c.FormValue("purge_member") == "on") + role.ConvertMemberToContact = (c.FormValue("convert_member_to_contact") == "on") + role.ExportMember = (c.FormValue("export_member") == "on") + + // Contact permissions + role.ShowContact = (c.FormValue("show_contact") == "on") + role.CreateContact = (c.FormValue("create_contact") == "on") + role.EditContact = (c.FormValue("edit_contact") == "on") + role.ShowArchivedContact = (c.FormValue("show_archived_contact") == "on") + role.ArchiveContact = (c.FormValue("archive_contact") == "on") + role.RestoreContact = (c.FormValue("restore_contact") == "on") + role.PurgeContact = (c.FormValue("purge_contact") == "on") + role.ConvertContactToMember = (c.FormValue("convert_contact_to_member") == "on") + role.ExportContact = (c.FormValue("export_contact") == "on") + + if len(errors) == 0 { + result := db.Save(&role) + if result.Error != nil { + return result.Error + } else { + c.Redirect(fmt.Sprintf( + "/admin/roles/%d", + role.ID, + )) + } + } + } + + return c.Render("role_form", fiber.Map{ + "PageTitle": title, + "Role": role, + "Errors": errors, + }) +} + +func RoleDelete(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + result := db.Delete(&models.Role{}, id) + if result.Error != nil { + return err + } + + return c.Redirect("/admin/roles") +} diff --git a/main.go b/main.go index 3f38826..80e773e 100644 --- a/main.go +++ b/main.go @@ -135,6 +135,15 @@ func main() { app.Post("/admin/lists/:id/items/:itemid", controllers.ListItemEdit) app.Post("/admin/lists/:id/items/:itemid/delete", controllers.ListItemDelete) + // Admin: Roles + app.Get("/admin/roles", controllers.Roles) + app.Get("/admin/roles/:id", controllers.RoleShow) + app.Get("/admin/roles/add", controllers.RoleAdd) + app.Post("/admin/roles/add", controllers.RoleAdd) + app.Get("/admin/roles/:id/edit", controllers.RoleEdit) + app.Post("/admin/roles/:id/edit", controllers.RoleEdit) + app.Post("/admin/roles/:id/delete", controllers.RoleDelete) + listenAddr := fmt.Sprintf( "%s:%d", config.App.ListenAddress, diff --git a/models/roles.go b/models/roles.go index 6739803..c47f2db 100644 --- a/models/roles.go +++ b/models/roles.go @@ -4,12 +4,23 @@ import "gorm.io/gorm" type Role struct { gorm.Model - Name string - ShowPerson bool - CreatePerson bool - EditPerson bool - ShowArchivedPerson bool - ArchivePerson bool - RestorePerson bool - ExportData bool + Name string + ShowMember bool + CreateMember bool + EditMember bool + ShowArchivedMember bool + ArchiveMember bool + RestoreMember bool + PurgeMember bool + ConvertMemberToContact bool + ExportMember bool + ShowContact bool + CreateContact bool + EditContact bool + ShowArchivedContact bool + ArchiveContact bool + RestoreContact bool + PurgeContact bool + ConvertContactToMember bool + ExportContact bool } diff --git a/views/role.html b/views/role.html new file mode 100644 index 0000000..c8eb239 --- /dev/null +++ b/views/role.html @@ -0,0 +1,136 @@ +{% extends "layouts/main.html" %} + +{% block main %} +
+
+ +
+
+ +
+ Nom
+ {{ Role.Name }} +
+ +
+
+ Permissions - Membres +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Afficher membres{% if Role.ShowMember %}Oui{% else %}Non{% endif %}
Créer membres{% if Role.CreateMember %}Oui{% else %}Non{% endif %}
Modifier membres{% if Role.EditMember %}Oui{% else %}Non{% endif %}
Afficher membres archivés{% if Role.ShowArchivedMember %}Oui{% else %}Non{% endif %}
Archiver membres{% if Role.ArchiveMember %}Oui{% else %}Non{% endif %}
Restaurer membres{% if Role.RestoreMember %}Oui{% else %}Non{% endif %}
Purger membres (suppression définitive){% if Role.PurgeMember %}Oui{% else %}Non{% endif %}
Convertir membres en contacts{% if Role.ConvertMemberToContact %}Oui{% else %}Non{% endif %}
Exporter membres (CSV){% if Role.ExportMember %}Oui{% else %}Non{% endif %}
+
+
+ +
+
+ Permissions - Contacts +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Afficher contacts{% if Role.ShowContact %}Oui{% else %}Non{% endif %}
Créer contacts{% if Role.CreateContact %}Oui{% else %}Non{% endif %}
Modifier contacts{% if Role.EditContact %}Oui{% else %}Non{% endif %}
Afficher contacts archivés{% if Role.ShowArchivedContact %}Oui{% else %}Non{% endif %}
Archiver contacts{% if Role.ArchiveContact %}Oui{% else %}Non{% endif %}
Restaurer contacts{% if Role.RestoreContact %}Oui{% else %}Non{% endif %}
Purger contacts (suppression définitive){% if Role.PurgeContact %}Oui{% else %}Non{% endif %}
Convertir contacts en membres{% if Role.ConvertContactToMember %}Oui{% else %}Non{% endif %}
Exporter contacts (CSV){% if Role.ExportContact %}Oui{% else %}Non{% endif %}
+
+
+ +
+ + + Modifier + +
+ +
+
+ +
+{% endblock %} diff --git a/views/role_form.html b/views/role_form.html new file mode 100644 index 0000000..766e8cb --- /dev/null +++ b/views/role_form.html @@ -0,0 +1,300 @@ +{% extends "layouts/main.html" %} + +{% block main %} +
+
+ +
+
+ + {% if Errors %} +
+
    + {% for Error in Errors %} +
  • {{ Error }}
  • + {% endfor %} +
+
+ {% endif %} + +
+ +
+ + +
+ +
+ Permissions - Membres +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ Permissions - Contacts +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
+{% endblock %} diff --git a/views/roles.html b/views/roles.html new file mode 100644 index 0000000..2133156 --- /dev/null +++ b/views/roles.html @@ -0,0 +1,51 @@ +{% extends "layouts/main.html" %} + +{% block main %} +
+
+ +
+
+ + {% if Roles %} +
+ + + + + + + + {% for Role in Roles %} + + + + {% endfor %} + +
Nom
+ + {{ Role.Name }} + +
+
+ {% else %} +
+ Pas de rôle pour le moment +
+ {% endif %} + + + +
+{% endblock %}