pop-camarades/controllers/lists.go

378 lines
7 KiB
Go

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 Lists(c *fiber.Ctx) error {
db, err := helpers.GetDatabase()
if err != nil {
return err
}
var lists []models.List
result := db.Order("name collate nocase 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 errors.Is(result.Error, gorm.ErrRecordNotFound) {
return fiber.NewError(fiber.StatusNotFound, "Not found")
}
if result.Error != nil {
return err
}
title := fmt.Sprintf(
"%s | Listes",
list.Name,
)
var listItems []models.ListItem
db.Order("value collate nocase 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
} else {
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 errors.Is(result.Error, gorm.ErrRecordNotFound) {
return fiber.NewError(fiber.StatusNotFound, "Not found")
}
if result.Error != nil {
return err
}
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
} else {
if !list.Multi && multiOriginal {
var listItems []models.ListItem
result2 := db.Find(&listItems,
"list_id = ? AND `default` = ?",
list.ID, true,
)
if result2.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 err
}
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 errors.Is(result.Error, gorm.ErrRecordNotFound) {
return fiber.NewError(fiber.StatusNotFound, "Not found")
}
if result.Error != nil {
return err
}
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
} else {
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 errors.Is(result.Error, gorm.ErrRecordNotFound) {
return fiber.NewError(fiber.StatusNotFound, "Not found")
}
if result.Error != nil {
return err
}
var listItem models.ListItem
result2 := db.Find(&listItem, "id = ?", itemid)
if errors.Is(result2.Error, gorm.ErrRecordNotFound) {
return fiber.NewError(fiber.StatusNotFound, "Not found")
}
if result2.Error != nil {
return err
}
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 {
result3 := db.Save(&listItem)
if result3.Error != nil {
return result3.Error
} else {
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 errors.Is(result.Error, gorm.ErrRecordNotFound) {
return fiber.NewError(fiber.StatusNotFound, "Not found")
}
if result.Error != nil {
return err
}
result2 := db.Delete(&models.ListItem{}, itemid)
if result2.Error != nil {
return err
}
return c.Redirect(fmt.Sprintf(
"/admin/lists/%d", list.ID,
))
}