72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
package middlewares
|
||
|
||
import (
|
||
"bssapp-backend/auth"
|
||
"net/http"
|
||
"time"
|
||
|
||
"bssapp-backend/internal/auditlog"
|
||
)
|
||
|
||
type ResponseWriter struct {
|
||
http.ResponseWriter
|
||
status int
|
||
}
|
||
|
||
func NewResponseWriter(w http.ResponseWriter) *ResponseWriter {
|
||
return &ResponseWriter{
|
||
ResponseWriter: w,
|
||
status: http.StatusOK,
|
||
}
|
||
}
|
||
|
||
func (rw *ResponseWriter) WriteHeader(code int) {
|
||
rw.status = code
|
||
rw.ResponseWriter.WriteHeader(code)
|
||
}
|
||
|
||
func (rw *ResponseWriter) Status() int { return rw.status }
|
||
|
||
func Audit(next http.Handler) http.Handler {
|
||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
||
start := time.Now()
|
||
rw := NewResponseWriter(w)
|
||
|
||
next.ServeHTTP(rw, r)
|
||
|
||
// ✅ AuthMiddleware sonrası burada claims VAR
|
||
var dfusrID int64
|
||
var username, roleCode string
|
||
|
||
if claims, ok := auth.GetClaimsFromContext(r.Context()); ok && claims != nil {
|
||
dfusrID = int64(claims.ID)
|
||
username = claims.Username
|
||
roleCode = claims.RoleCode // token’da varsa
|
||
}
|
||
|
||
entry := auditlog.ActivityLog{
|
||
DfUsrID: dfusrID,
|
||
Username: username,
|
||
RoleCode: roleCode,
|
||
|
||
ActionType: "route_access",
|
||
ActionCategory: "nav",
|
||
ActionTarget: r.URL.Path,
|
||
Description: r.Method + " " + r.URL.Path,
|
||
|
||
IpAddress: r.RemoteAddr,
|
||
UserAgent: r.UserAgent(),
|
||
SessionID: "",
|
||
|
||
RequestStartedAt: start,
|
||
RequestFinishedAt: time.Now(),
|
||
DurationMs: int(time.Since(start).Milliseconds()),
|
||
HttpStatus: rw.Status(),
|
||
IsSuccess: rw.Status() < 400,
|
||
}
|
||
|
||
auditlog.Write(entry)
|
||
})
|
||
}
|