diff --git a/modules/logs/controller/log_controller.go b/modules/logs/controller/log_controller.go new file mode 100644 index 0000000..0751747 --- /dev/null +++ b/modules/logs/controller/log_controller.go @@ -0,0 +1,93 @@ +package controller + +import ( + "net/http" + "os" + "path/filepath" + "strings" + "time" + + "github.com/Caknoooo/go-gin-clean-starter/pkg/constants" + "github.com/Caknoooo/go-gin-clean-starter/pkg/utils" + "github.com/gin-gonic/gin" + "github.com/samber/do" + "gorm.io/gorm" +) + +type ( + LogsController interface { + GetLogs(ctx *gin.Context) + GetLogsByMonth(ctx *gin.Context) + } + + logsController struct { + db *gorm.DB + } +) + +func NewLogsController(injector *do.Injector) LogsController { + db := do.MustInvokeNamed[*gorm.DB](injector, constants.DB) + return &logsController{ + db: db, + } +} + +func (c *logsController) GetLogs(ctx *gin.Context) { + month := strings.ToLower(time.Now().Format("January")) + c.getLogsForMonth(ctx, month) +} + +func (c *logsController) GetLogsByMonth(ctx *gin.Context) { + month := ctx.Param("month") + c.getLogsForMonth(ctx, month) +} + +func (c *logsController) getLogsForMonth(ctx *gin.Context, month string) { + // Multiple possible log locations + logLocations := []string{ + "/app/config/logs/query_log", + "./config/logs/query_log", + "/tmp/logs", + } + + var logs []string + var found bool + + for _, logDir := range logLocations { + logFile := filepath.Join(logDir, month+"_query.log") + + content, err := os.ReadFile(logFile) + if err == nil { + // File found, parse content + logEntries := strings.Split(string(content), "\r\n") + for _, entry := range logEntries { + if strings.TrimSpace(entry) != "" { + logs = append(logs, entry) + } + } + found = true + break + } + } + + if !found { + logs = []string{} + } + + // Jika request Accept header adalah application/json, kembalikan JSON + if ctx.GetHeader("Accept") == "application/json" { + res := utils.BuildResponseSuccess("Success get logs", gin.H{ + "month": month, + "logs": logs, + "total": len(logs), + }) + ctx.JSON(http.StatusOK, res) + return + } + + // Default kembalikan HTML page + ctx.HTML(http.StatusOK, "logs.html", gin.H{ + "Month": month, + "Logs": logs, + }) +} diff --git a/modules/logs/routes.go b/modules/logs/routes.go new file mode 100644 index 0000000..c7c5597 --- /dev/null +++ b/modules/logs/routes.go @@ -0,0 +1,33 @@ +package logs + +import ( + "github.com/Caknoooo/go-gin-clean-starter/middlewares" + "github.com/Caknoooo/go-gin-clean-starter/modules/auth/service" + "github.com/Caknoooo/go-gin-clean-starter/modules/logs/controller" + userService "github.com/Caknoooo/go-gin-clean-starter/modules/user/service" + "github.com/Caknoooo/go-gin-clean-starter/pkg/constants" + "github.com/gin-gonic/gin" + "github.com/samber/do" +) + +func RegisterRoutes(server *gin.Engine, injector *do.Injector) { + logsController := do.MustInvoke[controller.LogsController](injector) + userService := do.MustInvoke[userService.UserService](injector) + jwtService := do.MustInvokeNamed[service.JWTService](injector, constants.JWTService) + + // Public routes (tanpa auth) - untuk testing + publicLogs := server.Group("/logs") + { + publicLogs.GET("", logsController.GetLogs) + publicLogs.GET("/:month", logsController.GetLogsByMonth) + } + + // Protected routes (hanya superadmin) + protectedLogs := server.Group("/admin/logs") + protectedLogs.Use(middlewares.Authenticate(jwtService)) + protectedLogs.Use(middlewares.RoleSuperAdmin(userService)) + { + protectedLogs.GET("", logsController.GetLogs) + protectedLogs.GET("/:month", logsController.GetLogsByMonth) + } +}