add maintenance mode
Some checks failed
CI / test-build (push) Failing after 2m12s

This commit is contained in:
2025-12-15 01:11:51 +07:00
parent 507961716e
commit 9779b30a65
7 changed files with 689 additions and 22 deletions

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