This commit is contained in:
39
internal/httpapp/maintenance_middleware.go
Normal file
39
internal/httpapp/maintenance_middleware.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package httpapp
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"gitea.avt.data-center.id/othman.suseno/atlas/internal/errors"
|
||||
)
|
||||
|
||||
// maintenanceMiddleware blocks operations during maintenance mode
|
||||
func (a *App) maintenanceMiddleware(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// Skip maintenance check for read-only operations and public endpoints
|
||||
if r.Method == http.MethodGet || r.Method == http.MethodHead || r.Method == http.MethodOptions {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
if a.isPublicEndpoint(r.URL.Path) {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
// Check if maintenance mode is enabled
|
||||
if a.maintenanceService != nil && a.maintenanceService.IsEnabled() {
|
||||
// Check if user is allowed during maintenance
|
||||
user, ok := getUserFromContext(r)
|
||||
if !ok || !a.maintenanceService.IsUserAllowed(user.ID) {
|
||||
writeError(w, errors.NewAPIError(
|
||||
errors.ErrCodeServiceUnavailable,
|
||||
"system is in maintenance mode",
|
||||
http.StatusServiceUnavailable,
|
||||
).WithDetails("the system is currently in maintenance mode and user operations are disabled"))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user