package controllers import ( "errors" "fmt" "git.readonly.ch/bouzoure/pop-camarades/helpers" "git.readonly.ch/bouzoure/pop-camarades/models" "github.com/gofiber/fiber/v2" "gorm.io/gorm" ) func Lists(c *fiber.Ctx) error { db, err := helpers.GetDatabase() if err != nil { return err } var lists []models.List result := db.Order("name asc").Find(&lists) if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) { return err } return c.Render("lists", fiber.Map{ "PageTitle": "Listes", "Lists": lists, }) } func ListShow(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } var list models.List result := db.Find(&list, "id = ?", id) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } title := fmt.Sprintf( "%s | Listes", list.Name, ) var listItems []models.ListItem db.Order("value asc").Find(&listItems, "list_id = ?", id) return c.Render("list", fiber.Map{ "PageTitle": title, "List": list, "ListItems": listItems, }) } func ListAdd(c *fiber.Ctx) error { var list models.List var errors []string db, err := helpers.GetDatabase() if err != nil { return err } if c.Method() == "POST" { name := c.FormValue("name") multi := c.FormValue("multi") if len(name) > 100 || len(name) < 1 { errors = append(errors, "Le nom doit avoir entre 1 et 100 caractères") } list.Name = name list.Multi = false if multi == "on" { list.Multi = true } if len(errors) == 0 { result := db.Create(&list) if result.Error != nil { return result.Error } c.Redirect(fmt.Sprintf( "/admin/lists/%d", list.ID, )) } } return c.Render("list_form", fiber.Map{ "PageTitle": "Ajouter une liste", "List": list, "Errors": errors, }) } func ListEdit(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } var list models.List result := db.Find(&list, "id = ?", id) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } title := fmt.Sprintf( "%s | Modifier liste", list.Name, ) var errors []string if c.Method() == "POST" { multiOriginal := list.Multi name := c.FormValue("name") multi := c.FormValue("multi") if len(name) > 100 || len(name) < 1 { errors = append(errors, "Le nom doit avoir entre 1 et 100 caractères") } list.Name = name list.Multi = false if multi == "on" { list.Multi = true } if len(errors) == 0 { result = db.Save(&list) if result.Error != nil { return result.Error } if !list.Multi && multiOriginal { var listItems []models.ListItem result = db.Find(&listItems, "list_id = ? AND `default` = ?", list.ID, true, ) if result.RowsAffected > 1 { db.Model(&models.ListItem{}).Where( "list_id = ?", list.ID, ).Update("default", false) } } c.Redirect(fmt.Sprintf( "/admin/lists/%d", list.ID, )) } } return c.Render("list_form", fiber.Map{ "PageTitle": title, "List": list, "Errors": errors, }) } func ListDelete(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } result := db.Delete(&models.List{}, id) if result.Error != nil { return result.Error } return c.Redirect("/admin/lists") } func ListItemAdd(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } var list models.List result := db.Find(&list, "id = ?", id) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } title := fmt.Sprintf( "%s | Ajouter un élément à la liste", list.Name, ) listItem := models.ListItem{ ListID: list.ID, } var errors []string if c.Method() == "POST" { value := c.FormValue("value") isDefault := c.FormValue("default") if len(value) > 100 || len(value) < 1 { errors = append(errors, "La valeur doit avoir entre 1 et 100 caractères") } listItem.Value = value listItem.Default = false if isDefault == "on" { listItem.Default = true } if len(errors) == 0 { result := db.Create(&listItem) if result.Error != nil { return result.Error } if listItem.Default && !list.Multi { db.Model(&models.ListItem{}).Where( "list_id = ? AND id <> ?", list.ID, listItem.ID, ).Update("default", false) } c.Redirect(fmt.Sprintf( "/admin/lists/%d", list.ID, )) } } return c.Render("listitem_form", fiber.Map{ "PageTitle": title, "List": list, "ListItem": listItem, "Errors": errors, }) } func ListItemEdit(c *fiber.Ctx) error { id := c.Params("id") itemid := c.Params("itemid") db, err := helpers.GetDatabase() if err != nil { return err } var list models.List result := db.Find(&list, "id = ?", id) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } var listItem models.ListItem result = db.Find(&listItem, "id = ?", itemid) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } title := fmt.Sprintf( "%s | Modifier un élément de la liste", list.Name, ) var errors []string if c.Method() == "POST" { value := c.FormValue("value") isDefault := c.FormValue("default") if len(value) > 100 || len(value) < 1 { errors = append(errors, "La valeur doit avoir entre 1 et 100 caractères") } listItem.Value = value listItem.Default = false if isDefault == "on" { listItem.Default = true } if len(errors) == 0 { result = db.Save(&listItem) if result.Error != nil { return result.Error } if listItem.Default && !list.Multi { db.Model(&models.ListItem{}).Where( "list_id = ? AND id <> ?", list.ID, listItem.ID, ).Update("default", false) } c.Redirect(fmt.Sprintf( "/admin/lists/%d", list.ID, )) } } return c.Render("listitem_form", fiber.Map{ "PageTitle": title, "List": list, "ListItem": listItem, "Errors": errors, }) } func ListItemDelete(c *fiber.Ctx) error { id := c.Params("id") itemid := c.Params("itemid") db, err := helpers.GetDatabase() if err != nil { return err } var list models.List result := db.Find(&list, "id = ?", id) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } result = db.Delete(&models.ListItem{}, itemid) if result.Error != nil { return result.Error } return c.Redirect(fmt.Sprintf( "/admin/lists/%d", list.ID, )) }