package controllers import ( "fmt" "math" "os" "strconv" "strings" "github.com/gofiber/fiber/v2" //nolint:goimports "github.com/sujit-baniya/fiber-boilerplate/pkg/models" ) // RENDER func Submodules(c *fiber.Ctx) error { data := fiber.Map{ "user": c.Locals("user").(map[string]interface{}), "modules": c.Locals("userModules"), } // Renderiza la vista "modules" con el layout "layouts/landing" if err := c.Render("submodules", data, "layouts/main"); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": "Error rendering template", "error": err.Error(), }) } return nil } //CONSULTAR TODOS LOS SUBMODULOS func GetSubmodules(c *fiber.Ctx) error { // Obtener parámetros de consulta para la paginación pageStr := c.Query("page", "1") // Por defecto, la página es 1 page, err := strconv.Atoi(pageStr) if err != nil || page < 1 { page = 1 } searchQuery := c.Query("search", "") // Obtener el término de búsqueda limit := 10 // Número de módulos por página offset := (page - 1) * limit // Llama a AllModules con el término de búsqueda submodules, total, err := models.AllSubmodules(limit, offset, searchQuery) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": "Error retrieving modules", "error": err.Error(), }) } // Llama a AllRoles sin el término de búsqueda para obtener todos los roles modules, err := models.AllModulesSelect() // Pasamos 0 para limit y offset para obtener todos los roles if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": "Error retrieving roles", "error": err.Error(), }) } // Calcular el total de páginas totalPages := int(math.Ceil(float64(total) / float64(limit))) // Envía los módulos como respuesta JSON junto con la información de paginación return c.JSON(fiber.Map{ "submodules": submodules, "modules": modules, "total": total, // Total de módulos disponibles "totalPages": totalPages, // Total de páginas "page": page, // Página actual "limit": limit, // Límites por página }) } // ACTUALIZAR func UpdateSubmodule(c *fiber.Ctx) error { var m models.Submodules uid, err := strconv.ParseUint(c.Params("id"), 10, 32) if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "message": "ID inválido", "error": true, }) } // Analiza el cuerpo de la solicitud if err := c.BodyParser(&m); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "message": "Error al analizar el cuerpo de la solicitud", "error": true, }) } m.ID = uint(uid) // Actualiza el módulo en la base de datos if err := models.UpdateSubmodule(m); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": err.Error(), "error": true, }) } return c.Status(fiber.StatusOK).JSON(fiber.Map{ "message": "Registro actualizado con éxito", "error": false, "submodule": m, }) } // CREAR SUBMODULO func CreateSubmodule(c *fiber.Ctx) error { var m models.Submodules // Analiza el cuerpo de la solicitud if err := c.BodyParser(&m); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "message": "Error al analizar el cuerpo de la solicitud", "error": true, }) } // Crea el nuevo módulo en la base de datos if err := models.CreateSubmodule(m); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": err.Error(), "error": true, }) } // Crear el archivo del modelo basado en el nombre del submódulo (title) title := m.Title fileName := fmt.Sprintf("C:/laragon/www/gases/fiber-boilerplate/pkg/models/%s.go", strings.ToLower(title)) controllerFileName := fmt.Sprintf("C:/laragon/www/gases/fiber-boilerplate/rest/controllers/%s_controller.go", strings.ToLower(title)) routeFileName := "C:/laragon/www/gases/fiber-boilerplate/rest/routes/user.go" viewFileName := fmt.Sprintf("C:/laragon/www/gases/fiber-boilerplate/resources/views/%s.html", strings.ToLower(title)) // Ruta del archivo de vista // Generar el contenido del archivo content := generateModelFileContent(title) // Crear y escribir el archivo de modelo if err := os.WriteFile(fileName, []byte(content), 0644); err != nil { fmt.Printf("Error al crear el archivo de modelo: %s\n", err) return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": "Error al crear el archivo de modelo", "error": true, }) } fmt.Printf("Archivo de modelo creado: %s\n", fileName) // Generar el contenido del archivo de controlador controllerContent := generateControllerFileContent(title) // Crear y escribir el archivo de controlador if err := os.WriteFile(controllerFileName, []byte(controllerContent), 0644); err != nil { fmt.Printf("Error al crear el archivo de controlador: %s\n", err) return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": "Error al crear el archivo de controlador", "error": true, }) } fmt.Printf("Archivo de controlador creado: %s\n", controllerFileName) // Generar el contenido del archivo de vista viewContent := generateViewFileContent(title) // Crear y escribir el archivo de vista if err := os.WriteFile(viewFileName, []byte(viewContent), 0644); err != nil { fmt.Printf("Error al crear el archivo de vista: %s\n", err) return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": "Error al crear el archivo de vista", "error": true, }) } fmt.Printf("Archivo de vista creado: %s\n", viewFileName) // Añadir las rutas al archivo user.go routeContent := generateRouteFileContent(title) // Abrir el archivo user.go en modo append y añadir las nuevas rutas if err := appendToFile(routeFileName, routeContent); err != nil { fmt.Printf("Error al añadir las rutas al archivo user.go: %s\n", err) return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": "Error al añadir las rutas al archivo user.go", "error": true, }) } fmt.Printf("Rutas añadidas al archivo user.go: %s\n", routeFileName) return c.Status(fiber.StatusCreated).JSON(fiber.Map{ "message": "Registro creado con éxito", "error": false, "submodule": m, }) } // Función auxiliar para pluralizar el nombre si es necesario func pluralize(word string) string { // Simple heuristic: if the word ends in "s", don't pluralize if strings.HasSuffix(word, "s") { return word } return word + "s" } // Función que genera el contenido del archivo del modelo func generateModelFileContent(title string) string { pluralTitle := pluralize(title) return fmt.Sprintf(`package models import ( "time" "gorm.io/gorm" "github.com/sujit-baniya/fiber-boilerplate/app" ) type %s struct { gorm.Model // Embedding gorm.Model to inherit fields like ID, CreatedAt, UpdatedAt, DeletedAt ID uint gorm:"primarykey" ModifiedAt time.Time json:"modified_at" gorm:"column:modified_at" Description string json:"description" gorm:"column:description" Title string json:"title" gorm:"column:title" } // TableName overrides the table name used by %s to %s func (%s) TableName() string { return "%s" } // All%s recupera todos los registros con búsqueda func All%s(limit, offset int, search string) ([]%s, int64, error) { var items []%s var total int64 db := app.Http.Database.DB.Model(&%s{}) // Filtrar por término de búsqueda si se proporciona if search != "" { db = db.Where("title LIKE ? OR description LIKE ?", "%%"+search+"%%", "%%"+search+"%%") } // Obtener el total de registros if err := db.Count(&total).Error; err != nil { return nil, 0, err } // Obtener los registros con paginación if err := db.Order("created_at DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil { return nil, 0, err } return items, total, nil } // All%sSelect recupera todos los registros sin paginación func All%sSelect() ([]%s, error) { var items []%s // Realizar la consulta para obtener todos los registros if err := app.Http.Database.DB.Model(&%s{}).Find(&items).Error; err != nil { return nil, err } return items, nil } // Create%s creates a new record func Create%s(item %s) error { if err := app.Http.Database.DB.Create(&item).Error; err != nil { return err } return nil } // Update%s updates an existing record func Update%s(item %s) error { if err := app.Http.Database.DB.Save(&item).Error; err != nil { return err } return nil } // Delete%s deletes a record by its ID func Delete%s (id uint) error { if err := app.Http.Database.DB.Delete(&%s{}, id).Error; err != nil { return err } return nil } `, title, // Nombre de la estructura (singular) title, title, // TableName usa el nombre en singular para la estructura y la función title, pluralTitle, // Nombre de la tabla (en plural) pluralTitle, pluralTitle, title, // Función All para paginación, plural y singular title, title, // Modelo usado en la consulta pluralTitle, pluralTitle, title, // AllSelect sin paginación title, title, title, // Crear, actualizar, borrar registros title, title, title, title) // Funciones de creación, actualización y eliminación } // Función para generar el contenido del archivo de controlador func generateControllerFileContent(title string) string { lowerTitle := strings.ToLower(title) // Contenido del controlador reemplazando "Title" con el nombre del submódulo return fmt.Sprintf(`package controllers import ( "github.com/gofiber/fiber/v2" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" "strconv" "math" ) // RENDER func %s(c *fiber.Ctx) error { // Renderiza la vista con el layout layouts/main if err := c.Render("%s", nil, "layouts/main"); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": "Error rendering template", "error": err.Error(), }) } return nil } // CONSULTAR TODOS LOS REGISTROS func Get%s(c *fiber.Ctx) error { // Obtener parámetros de consulta para la paginación pageStr := c.Query("page", "1") // Por defecto, la página es 1 page, err := strconv.Atoi(pageStr) if err != nil || page < 1 { page = 1 } searchQuery := c.Query("search", "") // Obtener el término de búsqueda limit := 10 // Número de registros por página offset := (page - 1) * limit // Llama a AllModules con el término de búsqueda records, total, err := models.All%s(limit, offset, searchQuery) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": "Error retrieving records", "error": err.Error(), }) } // Calcular el total de páginas totalPages := int(math.Ceil(float64(total) / float64(limit))) // Envía los registros como respuesta JSON junto con la información de paginación return c.JSON(fiber.Map{ "registros": records, "total": total, // Total de registros disponibles "totalPages": totalPages, // Total de páginas "page": page, // Página actual "limit": limit, // Límites por página }) } // CREAR func Create%s(c *fiber.Ctx) error { var m models.%s // Analiza el cuerpo de la solicitud if err := c.BodyParser(&m); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "message": "Error al analizar el cuerpo de la solicitud", "error": true, }) } // Crea el nuevo registro en la base de datos if err := models.Create%s(m); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": err.Error(), "error": true, }) } return c.Status(fiber.StatusCreated).JSON(fiber.Map{ "message": "Registro creado con éxito", "error": false, "registro": m, }) } // ACTUALIZAR func Update%s(c *fiber.Ctx) error { var m models.%s uid, err := strconv.ParseUint(c.Params("id"), 10, 32) if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "message": "ID inválido", "error": true, }) } // Analiza el cuerpo de la solicitud if err := c.BodyParser(&m); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "message": "Error al analizar el cuerpo de la solicitud", "error": true, }) } m.ID = uint(uid) // Actualiza el módulo en la base de datos if err := models.Update%s(m); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": err.Error(), "error": true, }) } return c.Status(fiber.StatusOK).JSON(fiber.Map{ "message": "Registro actualizado con éxito", "error": false, "registro": m, }) } // Delete%s elimina un %s por su ID func Delete%s(c *fiber.Ctx) error { uid, err := strconv.ParseUint(c.Params("id"), 10, 32) if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "message": "ID inválido", "error": true, }) } // Lógica para eliminar %s if err := models.Delete%s(uint(uid)); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "message": err.Error(), "error": true, }) } return c.Status(fiber.StatusOK).JSON(fiber.Map{ "message": "%s eliminado con éxito", "error": false, }) } `, title, lowerTitle, title, title, title, title, title, title, title, lowerTitle, title, title, lowerTitle, title) } // Función para generar el contenido de rutas para el nuevo submódulo func generateRouteFileContent(title string) string { lowerTitle := strings.ToLower(title) // Bloque de rutas personalizado return fmt.Sprintf(` // Rutas para %s account.Get("/%s", controllers.Get%s) // Renderizar la vista de %s account.Get("/load%s", controllers.Get%s) // Obtener todos los %s account.Post("/%s", controllers.Create%s) // Crear un nuevo %s account.Put("/%s/:id", controllers.Update%s) // Actualizar un %s existente account.Delete("/%s/:id", controllers.Delete%s) // Eliminar un %s `, lowerTitle, lowerTitle, title, lowerTitle, lowerTitle, title, lowerTitle, lowerTitle, title, lowerTitle, lowerTitle, title, lowerTitle, lowerTitle, title) } // Función para añadir contenido a un archivo existente func appendToFile(fileName, content string) error { f, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, 0644) if err != nil { return err } defer f.Close() if _, err := f.WriteString(content); err != nil { return err } return nil } // generateViewFileContent genera el contenido del archivo de vista para un submódulo func generateViewFileContent(title string) string { return fmt.Sprintf(`
Gestión de actualizaciones de datos de usuario.
| Código | Nombre | |||
|---|---|---|---|---|
|
|
|