378 lines
7 KiB
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,
|
|
))
|
|
}
|