adding revenue handlers and shell
This commit is contained in:
@@ -6,47 +6,104 @@ import (
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"runtime"
|
||||
"time"
|
||||
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
)
|
||||
|
||||
var startTime = time.Now()
|
||||
|
||||
func HealthHandler(db *sql.DB) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
|
||||
dbStatus := "ok"
|
||||
if err := db.Ping(); err != nil {
|
||||
dbStatus = "error: " + err.Error()
|
||||
health := checkHealth(db)
|
||||
|
||||
if health["status"] != "ok" {
|
||||
w.WriteHeader(http.StatusServiceUnavailable)
|
||||
}
|
||||
|
||||
json.NewEncoder(w).Encode(map[string]string{
|
||||
"status": "ok",
|
||||
"database": dbStatus,
|
||||
})
|
||||
json.NewEncoder(w).Encode(health)
|
||||
}
|
||||
}
|
||||
|
||||
func checkHealth(db *sql.DB) map[string]any {
|
||||
// database
|
||||
dbStatus := "ok"
|
||||
dbLatency := ""
|
||||
t := time.Now()
|
||||
if err := db.Ping(); err != nil {
|
||||
dbStatus = "error: " + err.Error()
|
||||
} else {
|
||||
dbLatency = time.Since(t).String()
|
||||
}
|
||||
|
||||
// db pool stats
|
||||
stats := db.Stats()
|
||||
|
||||
// overall status
|
||||
status := "ok"
|
||||
if dbStatus != "ok" {
|
||||
status = "degraded"
|
||||
}
|
||||
|
||||
var mem runtime.MemStats
|
||||
runtime.ReadMemStats(&mem)
|
||||
|
||||
return map[string]any{
|
||||
"status": status,
|
||||
"uptime": time.Since(startTime).String(),
|
||||
"database": map[string]any{
|
||||
"status": dbStatus,
|
||||
"latency": dbLatency,
|
||||
"open_connections": stats.OpenConnections,
|
||||
"in_use": stats.InUse,
|
||||
"idle": stats.Idle,
|
||||
},
|
||||
"memory": map[string]any{
|
||||
"alloc_mb": bToMb(mem.Alloc),
|
||||
"sys_mb": bToMb(mem.Sys),
|
||||
"num_gc": mem.NumGC,
|
||||
},
|
||||
"go_version": runtime.Version(),
|
||||
"goroutines": runtime.NumGoroutine(),
|
||||
}
|
||||
}
|
||||
|
||||
func bToMb(b uint64) float64 {
|
||||
return float64(b) / 1024 / 1024
|
||||
}
|
||||
|
||||
func AddCompanyHandler(db *sql.DB) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodPost {
|
||||
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
|
||||
var input model.CompanyInput
|
||||
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
||||
http.Error(w, "invalid json", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
if err := service.AddCompany(input, db); err != nil {
|
||||
id, err := service.InsertCompany(db, input)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.WriteHeader(http.StatusCreated)
|
||||
json.NewEncoder(w).Encode(map[string]string{"status": "created"})
|
||||
json.NewEncoder(w).Encode(map[string]any{"status": "created", "id": id})
|
||||
}
|
||||
}
|
||||
|
||||
func GetCompaniesHandler(db *sql.DB) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
companies, err := service.GetAllCompanies(db)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(companies)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user