Add logs controller and routes for log retrieval by month

This commit is contained in:
Habib Fatkhul Rohman 2025-10-21 15:05:22 +07:00
parent fb49163803
commit 3ea963bd9e
2 changed files with 126 additions and 0 deletions

View File

@ -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,
})
}

33
modules/logs/routes.go Normal file
View File

@ -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)
}
}