91 lines
1.9 KiB
Go
Raw Normal View History

2024-08-18 05:54:08 +07:00
package utils
import (
"encoding/json"
2025-09-25 17:35:50 -03:00
"log"
2024-08-18 05:54:08 +07:00
"net/http"
"os"
2025-09-25 17:35:50 -03:00
"strings"
"sync"
2024-08-18 05:54:08 +07:00
)
2025-09-25 17:35:50 -03:00
var envMutex sync.RWMutex
2024-08-18 05:54:08 +07:00
func GetEnv(key, defaultValue string) string {
value := os.Getenv(key)
if len(value) == 0 {
return defaultValue
}
return value
}
2025-09-25 17:35:50 -03:00
// SetEnv sets an environment variable (thread-safe)
func SetEnv(key, value string) error {
envMutex.Lock()
defer envMutex.Unlock()
return os.Setenv(key, value)
}
// GetAllEnv returns all environment variables as a map
func GetAllEnv() map[string]string {
envMutex.RLock()
defer envMutex.RUnlock()
result := make(map[string]string)
for _, env := range os.Environ() {
parts := strings.SplitN(env, "=", 2)
if len(parts) == 2 {
result[parts[0]] = parts[1]
}
}
return result
}
2024-08-18 05:54:08 +07:00
func LastString(str []string) string {
return str[len(str)-1]
}
func ResponseError(w http.ResponseWriter, err error) {
2025-09-25 17:35:50 -03:00
ResponseErrorStatus(w, err, http.StatusInternalServerError)
2024-08-18 05:54:08 +07:00
}
2024-08-18 22:57:08 +07:00
func ResponseErrorStatus(w http.ResponseWriter, err error, status int) {
2025-09-25 17:35:50 -03:00
w.Header().Set("Content-Type", "application/json")
w.Header().Set("X-Content-Type-Options", "nosniff")
w.Header().Set("X-Frame-Options", "DENY")
w.Header().Set("X-XSS-Protection", "1; mode=block")
2024-08-18 22:57:08 +07:00
w.WriteHeader(status)
2025-09-25 17:35:50 -03:00
message := "Internal server error"
if err != nil {
message = err.Error()
}
response := map[string]interface{}{
"success": false,
"message": message,
}
// Add error details for development (remove in production)
if status >= 500 && err != nil {
log.Printf("Server error: %v", err)
}
json.NewEncoder(w).Encode(response)
2024-08-18 22:57:08 +07:00
}
2024-08-18 05:54:08 +07:00
func ResponseSuccess(w http.ResponseWriter, data interface{}) {
w.Header().Set("Content-Type", "application/json")
2025-09-25 17:35:50 -03:00
w.Header().Set("X-Content-Type-Options", "nosniff")
w.Header().Set("X-Frame-Options", "DENY")
w.Header().Set("X-XSS-Protection", "1; mode=block")
2024-08-18 05:54:08 +07:00
w.WriteHeader(http.StatusOK)
2025-09-25 17:35:50 -03:00
response := map[string]interface{}{
"success": true,
"data": data,
}
json.NewEncoder(w).Encode(response)
2024-08-18 05:54:08 +07:00
}