summaryrefslogtreecommitdiff
path: root/internal/api/handlers.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/api/handlers.go')
-rw-r--r--internal/api/handlers.go288
1 files changed, 2 insertions, 286 deletions
diff --git a/internal/api/handlers.go b/internal/api/handlers.go
index 2fedcdd..676f57f 100644
--- a/internal/api/handlers.go
+++ b/internal/api/handlers.go
@@ -22,10 +22,7 @@ import (
"io"
"math"
"math/rand"
- "net"
"net/http"
- "regexp"
- "strings"
"time"
)
@@ -91,48 +88,6 @@ func CreateLoginHandler(logs *[LogLength]string, n *int, toLogParser chan string
}
}
-const (
- StatusOperational = "operational"
- StatusDegraded = "degraded"
- StatusDown = "down"
-)
-
-const (
- IconAPIGateway = "🔗"
- IconWeb = "🌐"
- IconAuth = "🔐"
- IconDB = "🗄️"
- IconStorage = "📁"
- IconNotifications = "📧"
- IconSearch = "🔍"
- IconAnalytics = "📊"
-)
-
-const (
- SeverityMinor = "minor"
- SeverityMajor = "major"
-)
-
-const (
- ServiceAPIGateway = "api"
- ServiceWeb = "web"
- ServiceAuth = "auth"
- ServiceDB = "database"
- ServiceStorage = "storage"
- ServiceNotifications = "notifications"
- ServiceSearch = "search"
- ServiceAnalytics = "analytics"
-)
-
-type statusData struct {
- overallStatus overallStatus
- services []service
- metrics metrics
- incidents []incident
- maintenanceEvents []maintenanceEvent
- uptimeEvents []uptimeEvent
-}
-
var status statusData
func init() {
@@ -223,12 +178,12 @@ func init() {
case <-tick10s.C:
runChance(1.0, func() {
severity := SeverityMinor
- runChance(0.3, func(){
+ runChance(0.3, func() {
severity = SeverityMajor
})
i := rand.Intn(int(math.Min(float64(len(allIncidentTitles)), float64(len(allIncidentDescriptions)))))
serviceStatus := StatusDown
- runChance(0.5, func(){
+ runChance(0.5, func() {
serviceStatus = StatusDegraded
})
status.incidents = append(status.incidents, incident{
@@ -248,70 +203,6 @@ func init() {
}()
}
-func runChance(likelihood float64, action func()) {
- if likelihood <= 0 {
- return // never run
- }
- if likelihood >= 1 {
- action()
- return
- }
-
- if rand.Float64() < likelihood {
- action()
- }
-}
-
-type overallStatus struct {
- Status string `json:"status"`
- Description string `json:"description"`
- Uptime float64 `json:"uptime"`
- ResponseTime int `json:"responseTime"`
- ActiveIncidents int `json:"activeIncidents"`
- ScheduledMaintenance int `json:"scheduledMaintenance"`
-}
-
-type service struct {
- Id string `json:"id"`
- Name string `json:"name"`
- Description string `json:"description"`
- Icon string `json:"icon"`
- Status string `json:"status"`
- ResponseTime int `json:"responseTime"`
- Uptime float64 `json:"uptime"`
-}
-
-type metrics struct {
- Uptime float64 `json:"uptime"`
- ResponseTime int `json:"responseTime"`
- RequestVolume int `json:"requestVolume"`
- ErrorRate float64 `json:"errorRate"`
-}
-
-type incident struct {
- Id string `json:"id"`
- Title string `json:"title"`
- Description string `json:"description"`
- Status string `json:"status"`
- Severity string `json:"severity"`
- StartTime time.Time `json:"startTime"`
- AffectedServices []string `json:"affectedServices"`
-}
-
-type maintenanceEvent struct {
- Id string `json:"id"`
- Title string `json:"title"`
- Description string `json:"description"`
- StartTime time.Time `json:"startTime"`
- EndTime time.Time `json:"endTime"`
- AffectedServices []string `json:"affectedServices"`
-}
-
-type uptimeEvent struct {
- Date time.Time `json:"date"`
- Uptime float64 `json:"uptime"`
-}
-
func StatusHandler(w http.ResponseWriter, r *http.Request) {
jsonData, _ := json.Marshal(status.overallStatus)
fmt.Fprint(w, string(jsonData))
@@ -369,178 +260,3 @@ func CreateContactHandler(logs *[LogLength]string, n *int, toLogParser chan stri
fmt.Fprint(w, "{}")
}
}
-
-func redactIP(input string) string {
- ipRegex := `\b(?:\d{1,3}\.){3}\d{1,3}\b`
- re := regexp.MustCompile(ipRegex)
-
- return re.ReplaceAllStringFunc(input, func(match string) string {
- if ip := net.ParseIP(match); ip != nil {
- parts := strings.Split(match, ".")
- if len(parts) == 4 {
- parts[3] = "XXX"
- return strings.Join(parts, ".")
- }
- }
- return match
- })
-}
-
-func addRotLog(logs *[LogLength]string, last *int, parser chan string, value string) {
- if strings.Contains(value, "\n") {
- for _, v := range strings.Split(value, "\n") {
- addRotLog(logs, last, parser, v)
- }
- } else {
- if *last == LogLength {
- for i := 0; i < LogLength-1; i++ {
- logs[i] = logs[i+1]
- }
- logs[LogLength-1] = value
- parser <- value
- } else {
- logs[*last] = value
- *last++
- parser <- value
- }
- }
-}
-
-// Not const because can't use runtime append in const definition
-var (
- normalIncidentTitles = []string{
- "Database connection timeout",
- "Unexpected 500 Internal Server Error",
- "API rate limit exceeded",
- "Missing authentication token",
- "Service unavailable due to maintenance",
- "Invalid request payload",
- "Cross‑domain request blocked",
- "SSL certificate expired",
- "Memory leak detected in worker process",
- "Database deadlock detected",
- "Failed to serialize response",
- "Cache miss leading to latency spike",
- "Outdated API endpoint usage",
- "Insufficient permissions for resource",
- "Concurrent request overload",
- "Unexpected null reference",
- "Data consistency violation",
- "Failed to enqueue background job",
- "Rate limiter misconfigured",
- "Unexpected null pointer exception",
- }
- normalIncidentDescriptions = []string{
- "The database server failed to establish a connection within the allotted timeout period, causing API requests to hang and eventually fail.",
- "The web service returned a generic 500 Internal Server Error due to an unhandled exception in the request handler.",
- "Clients exceeded the predefined rate limit, resulting in throttled responses and temporary denial of service.",
- "Incoming requests lacked a valid authentication token, leading to unauthorized access attempts.",
- "The service was temporarily unavailable because of scheduled maintenance and infrastructure upgrades.",
- "The request payload was malformed or missing required fields, causing validation errors.",
- "Cross‑origin resource sharing (CORS) policy blocked the request from an unauthorized domain.",
- "The SSL/TLS certificate had expired, preventing secure connections from clients.",
- "A memory leak in the worker process caused gradual exhaustion of available RAM.",
- "A deadlock occurred between database transactions, blocking all pending queries.",
- "The response could not be serialized into JSON, leading to malformed output.",
- "Cache misses caused a spike in latency as the backend had to recompute data.",
- "Clients used deprecated API endpoints that are no longer supported.",
- "The user lacked sufficient permissions to access the requested resource.",
- "The server was overwhelmed by concurrent requests, exceeding its capacity limits.",
- "A null reference exception was thrown during request processing.",
- "Data integrity constraints were violated, causing transaction rollbacks.",
- "Background job enqueuing failed due to a full queue or missing worker.",
- "The rate limiter was misconfigured, allowing too many requests per interval.",
- "A null pointer exception caused the service to crash during execution.",
- }
- mixedIncidentTitels = []string{
- "Database connection timeout",
- "Unexpected 500 error on /api/v1/users",
- "Missing authentication token",
- "Rate limit exceeded for client IP 192.168.1.42",
- "Service unavailable due to maintenance",
- "Malformed JSON payload",
- "Cache miss leading to slow response",
- "Duplicate request IDs detected",
- "Circular dependency in microservices",
- "Out-of-memory exception in worker thread",
- "DNS resolution failure for external API",
- "Malformed URL in webhook callback",
- "Cat in the server room",
- "Unexpected emoji in user profile",
- "Randomly generated error: 42 is the answer",
- }
- mixedIncidentDescriptions = []string{
- "The database server stopped accepting connections, causing a timeout for all client queries.",
- "The `/api/v1/users` endpoint returned a 500 Internal Server Error due to an unhandled exception.",
- "Requests were rejected because the authentication token was missing or malformed.",
- "Requests from the IP `192.168.1.42` exceeded the rate limit, resulting in 429 responses.",
- "The service was temporarily unavailable due to scheduled maintenance.",
- "The API received malformed JSON, leading to a 400 Bad Request response.",
- "The cache layer missed the key, forcing a slow database lookup.",
- "Duplicate request IDs were detected, causing duplicate processing.",
- "A circular dependency in the microservice architecture caused a deadlock.",
- "The worker thread ran out of memory and crashed.",
- "DNS resolution failed for an external API, blocking outbound calls.",
- "A webhook callback URL contained invalid characters, causing a 400 error.",
- "A stray cat wandered into the server room and triggered a physical security alarm.",
- "User profiles contained unexpected emoji characters that broke rendering.",
- "A random error message appeared: \"42 is the answer\", indicating a placeholder bug.",
- }
- sillyIncidentTitles = []string{
- "The API returned a rainbow instead of JSON",
- "All requests were answered with a GIF of a dancing cat",
- "The service responded with a random haiku",
- "The endpoint started singing opera",
- "All data was encrypted with a secret handshake",
- "The server replied with a fortune cookie message",
- "The service accidentally sent a selfie of the developer",
- "All responses were wrapped in a Shakespearean sonnet",
- "The API returned a random meme image",
- "The service responded with a countdown to the moon landing",
- "All requests were answered with a joke about HTTP",
- "The server sent back a playlist of elevator music",
- "The endpoint replied with a random dad joke",
- "All data was sorted alphabetically by the last letter",
- "The service responded with a random emoji string",
- "The API returned a random recipe",
- "All responses were encoded in Morse code",
- "The server replied with a random motivational quote",
- "The endpoint responded with a random crossword clue",
- "All requests were answered with a random song lyric",
- "The service returned a random conspiracy theory",
- "The API responded with a random horoscope",
- "All data was shuffled like a deck of cards",
- "The server replied with a random conspiracy theory",
- "The endpoint responded with a random tongue twister",
- }
- sillyIncidentDescriptions = []string{
- "The JSON parser returned a holographic rainbow that demanded cookies in exchange for schema validation.",
- "Every API response included a looping dancing cat that judged your headers and sashayed through your CORS policy.",
- "The server replied only in haiku and refused to switch out of seventeen syllables even when begged with ramen.",
- "The endpoint belted operatic arias at 120 dB and required earplugs for POST requests.",
- "Payloads were encrypted with a secret handshake, a wink, and a kazoo solo — mobile apps kept failing the kazoo step.",
- "Responses arrived as fortune-cookie slips predicting uncanny laptop weather and advising investments in rubber ducks.",
- "The API accidentally uploaded the lead dev's selfie wearing a cape and labeled it 'new JSON schema'.",
- "Every error was delivered as a Shakespearean sonnet, complete with stage directions and a tragic '404 Romeo'.",
- "Endpoints served meme PNGs captioned 'When your query times out but you're still fabulous' instead of data.",
- "Responses counted down to the next moon landing in reverse, prompting clients to RSVP and NASA to ask why.",
- "Headers contained nothing but increasingly elaborate HTTP puns, causing an epidemic of groans across the office.",
- "Requests yielded a 45-minute elevator-music playlist narrated by a bored brass section and an oddly philosophical sheep.",
- "Each response began with a groan-inducing dad joke and ended with 'Did you get it? No? Okay.'",
- "Data was alphabetized by the last letter of each word, resulting in sentences like 'zoo apes banana' and much confusion.",
- "Every field turned into a cryptic emoji cipher that required a three-hour romance with an online emoji oracle to decode.",
- "The API returned microwave recipes involving glitter, two bananas, and an optional unicycle for garnish.",
- "Responses blinked in Morse via server LEDs; clients had to tap along on toast to translate the payload.",
- "The server replied with overenthusiastic motivational quotes, some signed 'Sincerely, Your Router'.",
- "Each endpoint answered with a crossword clue so obscure it demanded a PhD in Breakfast Cereals.",
- "Responses contained obscure song lyrics that led to several lawsuits from very offended shower singers.",
- "The service offered a handcrafted conspiracy about pigeons, quantum routers, and a secret society of baristas.",
- "Users received horoscopes telling their IPs to avoid Tuesdays and to invest heavily in chamomile tea.",
- "Records were shuffled like a magician's deck, with the ace of spades mysteriously serving as the primary key.",
- "The server spun a conspiracy about sentient staplers plotting to replace USB‑C with fashionable shoelaces.",
- "Replies were impossible tongue twisters typed by the server while giggling, causing voice assistants to short out.",
- }
-
- allIncidentTitles = append(append(append([]string{}, normalIncidentTitles...), mixedIncidentTitels...), sillyIncidentTitles...)
- allIncidentDescriptions = append(append(append([]string{}, normalIncidentDescriptions...), mixedIncidentTitels...), sillyIncidentDescriptions...)
-)