package controllers import ( "errors" "fmt" "strconv" "git.readonly.ch/bouzoure/pop-camarades/helpers" "git.readonly.ch/bouzoure/pop-camarades/models" "github.com/gofiber/fiber/v2" "gorm.io/gorm" ) func Fields(c *fiber.Ctx) error { db, err := helpers.GetDatabase() if err != nil { return err } var fields []models.Field result := db.Order("position asc").Find(&fields) if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) { return err } return c.Render("fields", fiber.Map{ "PageTitle": "Champs supplémentaires", "Fields": fields, "PersonTypes": models.PersonTypes, "FieldTypes": models.FieldTypes, }) } func FieldShow(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } var field models.Field result := db.Preload("List").Find(&field, "id = ?", id) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } title := fmt.Sprintf( "%s | Champs supplémentaires", field.Name, ) return c.Render("field", fiber.Map{ "PageTitle": title, "Field": field, "PersonTypes": models.PersonTypes, "FieldTypes": models.FieldTypes, }) } func FieldAdd(c *fiber.Ctx) error { var field models.Field var errors []string db, err := helpers.GetDatabase() if err != nil { return err } var lists []models.List db.Order("name collate nocase asc").Find(&lists) if c.Method() == "POST" { field.Name = c.FormValue("name") if len(field.Name) > 100 || len(field.Name) < 1 { errors = append(errors, "Le nom doit contentir entre 1 et 100 caractères") } for key := range models.PersonTypes { if c.FormValue("person_type") == key { field.PersonType = key } } if len(field.PersonType) < 1 { errors = append(errors, "Population incorrecte") } for key := range models.FieldTypes { if c.FormValue("field_type") == key { field.FieldType = key } } if len(field.FieldType) < 1 { errors = append(errors, "Type de champ incorrect") } if field.FieldType == "list" { listID, err := strconv.ParseUint(c.FormValue("list"), 10, 0) if err != nil || listID < 1 { errors = append(errors, "Liste incorrecte") } else { field.ListID = uint(listID) } } var lastPosition models.Field result := db.Order("position desc").First( &lastPosition, "person_type = ?", field.PersonType, ) field.Position = 0 if result.RowsAffected > 0 && lastPosition.Position >= 0 { field.Position = lastPosition.Position + 1 } if len(errors) == 0 { result = db.Create(&field) if result.Error != nil { return result.Error } c.Redirect(fmt.Sprintf( "/admin/fields/%d", field.ID, )) } } return c.Render("field_form", fiber.Map{ "PageTitle": "Ajouter un champ", "Field": field, "Lists": lists, "Errors": errors, "PersonTypes": models.PersonTypes, "FieldTypes": models.FieldTypes, }) } func FieldEdit(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } var field models.Field result := db.Find(&field, "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 un champ", field.Name, ) var errors []string if c.Method() == "POST" { field.Name = c.FormValue("name") if len(field.Name) > 100 || len(field.Name) < 1 { errors = append(errors, "Le nom doit contentir entre 1 et 100 caractères") } if len(errors) == 0 { result := db.Save(&field) if result.Error != nil { return result.Error } c.Redirect(fmt.Sprintf( "/admin/fields/%d", field.ID, )) } } return c.Render("field_form", fiber.Map{ "PageTitle": title, "Field": field, "Errors": errors, }) } func FieldDelete(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } var field models.Field db.Find(&field, "id = ?", id) result := db.Delete(&models.Field{}, id) if result.Error != nil { return result.Error } if field.ID > 0 { db.Exec( "UPDATE fields SET position = position - 1 WHERE position > ? AND person_type = ?", field.Position, field.PersonType, ) } return c.Redirect("/admin/fields") } func FieldMoveUp(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } var field models.Field result := db.Find(&field, "id = ?", id) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } if field.Position == 0 { return c.Redirect("/admin/fields") } db.Exec( "UPDATE fields SET position = position + 1 WHERE position = ? AND person_type = ?", field.Position-1, field.PersonType, ) db.Exec( "UPDATE fields SET position = position - 1 WHERE id = ?", field.ID, ) return c.Redirect("/admin/fields") } func FieldMoveDown(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } var field models.Field result := db.Find(&field, "id = ?", id) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } var lastPosition models.Field result = db.Order("position desc").First( &lastPosition, "person_type = ?", field.PersonType, ) if result.RowsAffected <= 0 || field.Position >= lastPosition.Position { return c.Redirect("/admin/fields") } db.Exec( "UPDATE fields SET position = position - 1 WHERE position = ? AND person_type = ?", field.Position+1, field.PersonType, ) db.Exec( "UPDATE fields SET position = position + 1 WHERE id = ?", field.ID, ) return c.Redirect("/admin/fields") } func FieldJSON(c *fiber.Ctx) error { id := c.Params("id") db, err := helpers.GetDatabase() if err != nil { return err } var field models.Field result := db.Preload("List").Preload("List.ListItems").Find(&field, "id = ?", id) if result.Error != nil { return result.Error } if result.RowsAffected < 1 { return fiber.NewError(fiber.StatusNotFound, "Not found") } return c.JSON(field) }