reworked backups

This commit is contained in:
d34dscene
2025-01-27 00:34:38 +01:00
parent e1c00557b3
commit a4515080d8
27 changed files with 665 additions and 717 deletions
+16 -9
View File
@@ -1,6 +1,7 @@
package handler
import (
"database/sql"
"encoding/json"
"net/http"
"strconv"
@@ -11,8 +12,9 @@ import (
"github.com/google/uuid"
)
func ListAgents(q *db.Queries) http.HandlerFunc {
func ListAgents(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
agents, err := q.ListAgents(r.Context())
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -23,8 +25,9 @@ func ListAgents(q *db.Queries) http.HandlerFunc {
}
}
func ListAgentsByProfile(q *db.Queries) http.HandlerFunc {
func ListAgentsByProfile(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
profileID, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -41,8 +44,9 @@ func ListAgentsByProfile(q *db.Queries) http.HandlerFunc {
}
}
func GetAgent(q *db.Queries) http.HandlerFunc {
func GetAgent(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
agent, err := q.GetAgent(r.Context(), r.PathValue("id"))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -71,8 +75,8 @@ func CreateAgent(a *config.App) http.HandlerFunc {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if err := a.DB.CreateAgent(r.Context(), db.CreateAgentParams{
q := db.New(a.DB)
if err := q.CreateAgent(r.Context(), db.CreateAgentParams{
ID: uuid.New().String(),
ProfileID: profileID,
Token: token,
@@ -84,8 +88,9 @@ func CreateAgent(a *config.App) http.HandlerFunc {
}
}
func UpdateAgent(q *db.Queries) http.HandlerFunc {
func UpdateAgent(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var agent db.UpdateAgentParams
if err := json.NewDecoder(r.Body).Decode(&agent); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -99,8 +104,9 @@ func UpdateAgent(q *db.Queries) http.HandlerFunc {
}
}
func DeleteAgent(q *db.Queries) http.HandlerFunc {
func DeleteAgent(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
agent, err := q.GetAgent(r.Context(), r.PathValue("id"))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -116,7 +122,8 @@ func DeleteAgent(q *db.Queries) http.HandlerFunc {
func RotateAgentToken(a *config.App) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
dbAgent, err := a.DB.GetAgent(r.Context(), r.PathValue("id"))
q := db.New(a.DB)
dbAgent, err := q.GetAgent(r.Context(), r.PathValue("id"))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
@@ -134,7 +141,7 @@ func RotateAgentToken(a *config.App) http.HandlerFunc {
return
}
if err := a.DB.UpdateAgentToken(r.Context(), db.UpdateAgentTokenParams{
if err := q.UpdateAgentToken(r.Context(), db.UpdateAgentTokenParams{
ID: dbAgent.ID,
Token: token,
}); err != nil {
+16 -7
View File
@@ -1,13 +1,14 @@
package handler
import (
"database/sql"
"encoding/json"
"fmt"
"net/http"
"strings"
"time"
"github.com/MizuchiLabs/mantrae/internal/config"
"github.com/MizuchiLabs/mantrae/internal/app"
"github.com/MizuchiLabs/mantrae/internal/db"
"github.com/MizuchiLabs/mantrae/internal/mail"
"github.com/MizuchiLabs/mantrae/internal/util"
@@ -15,8 +16,9 @@ import (
)
// Login verifies user credentials using a normal password and returns a JWT token if successful.
func Login(q *db.Queries, secret string) http.HandlerFunc {
func Login(DB *sql.DB, secret string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var user db.User
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
http.Error(w, "Failed to decode credentials", http.StatusBadRequest)
@@ -60,8 +62,9 @@ func Login(q *db.Queries, secret string) http.HandlerFunc {
}
// VerifyToken checks the validity of a JWT token provided in cookies or Authorization header.
func VerifyToken(q *db.Queries, secret string) http.HandlerFunc {
func VerifyToken(DB *sql.DB, secret string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var token string
// Check for token in cookies and Authorization header
@@ -95,8 +98,9 @@ func VerifyToken(q *db.Queries, secret string) http.HandlerFunc {
}
// ResetPassword allows users to reset their password using a valid JWT token.
func ResetPassword(q *db.Queries, secret string) http.HandlerFunc {
func ResetPassword(DB *sql.DB, secret string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var data struct {
Password string `json:"password"`
}
@@ -150,8 +154,9 @@ func ResetPassword(q *db.Queries, secret string) http.HandlerFunc {
}
// SendResetEmail sends an email with a password reset link to the user's registered email address.
func SendResetEmail(q *db.Queries, secret string) http.HandlerFunc {
func SendResetEmail(DB *sql.DB, secret string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
user, err := q.GetUserByUsername(r.Context(), r.PathValue("name"))
if err != nil {
http.Error(w, "User not found", http.StatusNotFound)
@@ -159,7 +164,11 @@ func SendResetEmail(q *db.Queries, secret string) http.HandlerFunc {
}
if user.Email == nil {
http.Error(w, fmt.Sprintf("%s has no email address", user.Username), http.StatusBadRequest)
http.Error(
w,
fmt.Sprintf("%s has no email address", user.Username),
http.StatusBadRequest,
)
return
}
@@ -175,7 +184,7 @@ func SendResetEmail(q *db.Queries, secret string) http.HandlerFunc {
return
}
var config config.EmailConfig
var config app.EmailConfig
var resetLink string
for _, setting := range settings {
switch setting.Key {
+111 -34
View File
@@ -5,46 +5,99 @@ import (
"fmt"
"io"
"net/http"
"os"
"path/filepath"
"time"
"github.com/MizuchiLabs/mantrae/internal/config"
"github.com/MizuchiLabs/mantrae/internal/backup"
)
// DownloadBackup creates a backup of the database and returns it as a JSON response.
func DownloadBackup(bm *config.BackupManager) http.HandlerFunc {
// DownloadBackup fetches the latest backup of the database and returns it
func DownloadBackup(bm *backup.BackupManager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
filename, err := bm.GetLatestBackup()
files, err := bm.Backend.List(r.Context())
if err != nil {
bm.CreateBackup(r.Context())
filename, err = bm.GetLatestBackup()
http.Error(
w,
fmt.Sprintf("Failed to list backups: %v", err),
http.StatusInternalServerError,
)
return
}
if len(files) == 0 {
bm.Create(r.Context())
files, err = bm.Backend.List(r.Context())
if err != nil {
http.Error(
w,
fmt.Sprintf("Failed to create backup: %v", err),
fmt.Sprintf("Failed to list backups: %v", err),
http.StatusInternalServerError,
)
return
}
}
backupPath := filepath.Join(bm.Config.Dir, filename)
// Validate filename to prevent directory traversal
if !bm.IsValidBackupFile(filename) {
http.Error(w, "Invalid backup file", http.StatusBadRequest)
filename := files[0].Name
reader, err := bm.Backend.Retrieve(r.Context(), filename)
if err != nil {
http.Error(
w,
fmt.Sprintf("Failed to retrieve backup: %v", err),
http.StatusInternalServerError,
)
return
}
defer reader.Close()
w.Header().Set("Content-Disposition", "attachment; filename="+filename)
w.Header().Set("Content-Type", "application/octet-stream")
http.ServeFile(w, r, backupPath)
if _, err := io.Copy(w, reader); err != nil {
http.Error(
w,
fmt.Sprintf("Failed to write backup data: %v", err),
http.StatusInternalServerError,
)
return
}
}
}
func CreateBackup(bm *config.BackupManager) http.HandlerFunc {
func DownloadBackupByName(bm *backup.BackupManager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
err := bm.CreateBackup(r.Context())
filename := r.PathValue("filename")
if !bm.IsValidBackupFile(filename) {
http.Error(w, "Invalid backup filename", http.StatusBadRequest)
return
}
reader, err := bm.Backend.Retrieve(r.Context(), filename)
if err != nil {
http.Error(
w,
fmt.Sprintf("Failed to retrieve backup: %v", err),
http.StatusInternalServerError,
)
return
}
defer reader.Close()
w.Header().Set("Content-Disposition", "attachment; filename="+filename)
w.Header().Set("Content-Type", "application/octet-stream")
if _, err := io.Copy(w, reader); err != nil {
http.Error(
w,
fmt.Sprintf("Failed to write backup data: %v", err),
http.StatusInternalServerError,
)
return
}
}
}
func CreateBackup(bm *backup.BackupManager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
err := bm.Create(r.Context())
if err != nil {
http.Error(
w,
@@ -58,7 +111,7 @@ func CreateBackup(bm *config.BackupManager) http.HandlerFunc {
}
// RestoreBackup restores a backup from a provided file.
func RestoreBackup(bm *config.BackupManager) http.HandlerFunc {
func RestoreBackup(bm *backup.BackupManager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// Limit request size to prevent memory issues
r.Body = http.MaxBytesReader(w, r.Body, 100<<20) // 100MB limit
@@ -80,30 +133,27 @@ func RestoreBackup(bm *config.BackupManager) http.HandlerFunc {
time.Now().UTC().Format("20060102_150405"),
filepath.Ext(header.Filename))
backupPath := filepath.Join(bm.Config.Dir, filename)
// Create destination file
dst, err := os.Create(backupPath)
if err != nil {
// Store the uploaded backup using the backend
if err = bm.Backend.Store(r.Context(), filename, file); err != nil {
http.Error(
w,
fmt.Sprintf("Failed to create backup file: %v", err),
fmt.Sprintf("Failed to store backup file: %v", err),
http.StatusInternalServerError,
)
return
}
defer dst.Close()
// Copy uploaded file to destination
if _, err := io.Copy(dst, file); err != nil {
http.Error(w, "Failed to save backup file", http.StatusInternalServerError)
return
}
// Attempt to restore the backup
if err := bm.RestoreBackup(r.Context(), backupPath); err != nil {
// Clean up the uploaded file if restore fails.
os.Remove(backupPath)
if err := bm.Restore(r.Context(), filename); err != nil {
// Clean up the uploaded file if restore fails
if err = bm.Backend.Delete(r.Context(), filename); err != nil {
http.Error(
w,
fmt.Sprintf("Failed to delete backup file: %v", err),
http.StatusInternalServerError,
)
return
}
http.Error(
w,
fmt.Sprintf("Failed to restore backup: %v", err),
@@ -112,6 +162,18 @@ func RestoreBackup(bm *config.BackupManager) http.HandlerFunc {
return
}
time.Sleep(100 * time.Millisecond)
// Test the connection
if err := bm.DB.PingContext(r.Context()); err != nil {
http.Error(
w,
"Database connection failed after restore",
http.StatusInternalServerError,
)
return
}
response := map[string]string{"message": "Backup restored successfully"}
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(response); err != nil {
@@ -121,9 +183,9 @@ func RestoreBackup(bm *config.BackupManager) http.HandlerFunc {
}
}
func ListBackups(bm *config.BackupManager) http.HandlerFunc {
func ListBackups(bm *backup.BackupManager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
backups, err := bm.ListBackups()
backups, err := bm.Backend.List(r.Context())
if err != nil {
http.Error(
w,
@@ -144,3 +206,18 @@ func ListBackups(bm *config.BackupManager) http.HandlerFunc {
}
}
}
func DeleteBackup(bm *backup.BackupManager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
filename := r.PathValue("filename")
if err := bm.Backend.Delete(r.Context(), filename); err != nil {
http.Error(
w,
fmt.Sprintf("Failed to delete backup: %v", err),
http.StatusInternalServerError,
)
return
}
w.WriteHeader(http.StatusNoContent)
}
}
+21 -11
View File
@@ -1,6 +1,7 @@
package handler
import (
"database/sql"
"encoding/json"
"log/slog"
"net/http"
@@ -10,8 +11,9 @@ import (
"github.com/MizuchiLabs/mantrae/internal/dns"
)
func ListDNSProviders(q *db.Queries) http.HandlerFunc {
func ListDNSProviders(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
dns_providers, err := q.ListDNSProviders(r.Context())
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -22,8 +24,9 @@ func ListDNSProviders(q *db.Queries) http.HandlerFunc {
}
}
func GetDNSProvider(q *db.Queries) http.HandlerFunc {
func GetDNSProvider(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
dns_provider_id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -39,8 +42,9 @@ func GetDNSProvider(q *db.Queries) http.HandlerFunc {
}
}
func CreateDNSProvider(q *db.Queries) http.HandlerFunc {
func CreateDNSProvider(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var dns_provider db.CreateDNSProviderParams
if err := json.NewDecoder(r.Body).Decode(&dns_provider); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -54,8 +58,9 @@ func CreateDNSProvider(q *db.Queries) http.HandlerFunc {
}
}
func UpdateDNSProvider(q *db.Queries) http.HandlerFunc {
func UpdateDNSProvider(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var dns_provider db.UpdateDNSProviderParams
if err := json.NewDecoder(r.Body).Decode(&dns_provider); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -69,8 +74,9 @@ func UpdateDNSProvider(q *db.Queries) http.HandlerFunc {
}
}
func DeleteDNSProvider(q *db.Queries) http.HandlerFunc {
func DeleteDNSProvider(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
dns_provider_id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -85,8 +91,9 @@ func DeleteDNSProvider(q *db.Queries) http.HandlerFunc {
}
}
func ListRouterDNSProviders(q *db.Queries) http.HandlerFunc {
func ListRouterDNSProviders(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
traefik_id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -102,8 +109,9 @@ func ListRouterDNSProviders(q *db.Queries) http.HandlerFunc {
}
}
func SetRouterDNSProvider(q *db.Queries) http.HandlerFunc {
func SetRouterDNSProvider(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var dns_provider db.UpsertRouterDNSProviderParams
if err := json.NewDecoder(r.Body).Decode(&dns_provider); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -129,7 +137,7 @@ func SetRouterDNSProvider(q *db.Queries) http.HandlerFunc {
// Update DNS
go func() {
err := dns.UpdateDNS(q)
err := dns.UpdateDNS(DB)
if err != nil {
slog.Error("Failed to delete DNS record", "error", err)
}
@@ -138,8 +146,9 @@ func SetRouterDNSProvider(q *db.Queries) http.HandlerFunc {
}
}
func GetRouterDNSProvider(q *db.Queries) http.HandlerFunc {
func GetRouterDNSProvider(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var dns_provider db.GetRouterDNSProviderParams
if err := json.NewDecoder(r.Body).Decode(&dns_provider); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -155,15 +164,16 @@ func GetRouterDNSProvider(q *db.Queries) http.HandlerFunc {
}
}
func DeleteRouterDNSProvider(q *db.Queries) http.HandlerFunc {
func DeleteRouterDNSProvider(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var dns_provider db.DeleteRouterDNSProviderParams
if err := json.NewDecoder(r.Body).Decode(&dns_provider); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
go func() {
err := dns.DeleteDNS(q, dns_provider.TraefikID, dns_provider.RouterName)
err := dns.DeleteDNS(DB, dns_provider.TraefikID, dns_provider.RouterName)
if err != nil {
slog.Error("Failed to delete DNS record", "error", err)
}
+5 -2
View File
@@ -1,6 +1,7 @@
package handler
import (
"database/sql"
"encoding/json"
"fmt"
"net/http"
@@ -42,8 +43,9 @@ type PluginSnippet struct {
}
// UpsertMiddleware
func UpsertMiddleware(q *db.Queries) http.HandlerFunc {
func UpsertMiddleware(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var params UpsertMiddlewareParams
if err := json.NewDecoder(r.Body).Decode(&params); err != nil {
http.Error(w, "Invalid request body", http.StatusBadRequest)
@@ -124,8 +126,9 @@ func UpsertMiddleware(q *db.Queries) http.HandlerFunc {
}
// DeleteMiddleware
func DeleteMiddleware(q *db.Queries) http.HandlerFunc {
func DeleteMiddleware(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
profileID, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, "Invalid profile ID", http.StatusBadRequest)
+11 -5
View File
@@ -1,6 +1,7 @@
package handler
import (
"database/sql"
"encoding/json"
"net/http"
"strconv"
@@ -9,8 +10,9 @@ import (
"github.com/MizuchiLabs/mantrae/internal/source"
)
func ListProfiles(q *db.Queries) http.HandlerFunc {
func ListProfiles(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
profiles, err := q.ListProfiles(r.Context())
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -21,8 +23,9 @@ func ListProfiles(q *db.Queries) http.HandlerFunc {
}
}
func GetProfile(q *db.Queries) http.HandlerFunc {
func GetProfile(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
profile_id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -38,8 +41,9 @@ func GetProfile(q *db.Queries) http.HandlerFunc {
}
}
func CreateProfile(q *db.Queries) http.HandlerFunc {
func CreateProfile(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var profile db.CreateProfileParams
if err := json.NewDecoder(r.Body).Decode(&profile); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -70,8 +74,9 @@ func CreateProfile(q *db.Queries) http.HandlerFunc {
}
}
func UpdateProfile(q *db.Queries) http.HandlerFunc {
func UpdateProfile(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var profile db.UpdateProfileParams
if err := json.NewDecoder(r.Body).Decode(&profile); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -85,8 +90,9 @@ func UpdateProfile(q *db.Queries) http.HandlerFunc {
}
}
func DeleteProfile(q *db.Queries) http.HandlerFunc {
func DeleteProfile(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
profile_id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
+5 -2
View File
@@ -1,6 +1,7 @@
package handler
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
@@ -25,8 +26,9 @@ type UpsertRouterParams struct {
}
// UpsertRouter handles both creation and updates of router/service pairs
func UpsertRouter(q *db.Queries) http.HandlerFunc {
func UpsertRouter(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var params UpsertRouterParams
if err := json.NewDecoder(r.Body).Decode(&params); err != nil {
http.Error(w, "Invalid request body", http.StatusBadRequest)
@@ -123,8 +125,9 @@ func UpsertRouter(q *db.Queries) http.HandlerFunc {
}
// DeleteRouter handles the removal of router/service pairs
func DeleteRouter(q *db.Queries) http.HandlerFunc {
func DeleteRouter(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
profileID, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, "Invalid profile ID", http.StatusBadRequest)
+11 -5
View File
@@ -1,6 +1,7 @@
package handler
import (
"database/sql"
"encoding/json"
"net/http"
"strconv"
@@ -9,8 +10,9 @@ import (
"github.com/MizuchiLabs/mantrae/internal/source"
)
func CreateTraefikConfig(q *db.Queries) http.HandlerFunc {
func CreateTraefikConfig(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var config db.CreateTraefikConfigParams
if err := json.NewDecoder(r.Body).Decode(&config); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
@@ -29,8 +31,9 @@ func CreateTraefikConfig(q *db.Queries) http.HandlerFunc {
}
}
func GetTraefikConfig(q *db.Queries) http.HandlerFunc {
func GetTraefikConfig(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
profile_id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -53,8 +56,9 @@ func GetTraefikConfig(q *db.Queries) http.HandlerFunc {
}
}
func UpdateTraefikConfig(q *db.Queries) http.HandlerFunc {
func UpdateTraefikConfig(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var config db.UpdateTraefikConfigParams
if err := json.NewDecoder(r.Body).Decode(&config); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
@@ -74,8 +78,9 @@ func UpdateTraefikConfig(q *db.Queries) http.HandlerFunc {
}
}
func DeleteTraefikConfig(q *db.Queries) http.HandlerFunc {
func DeleteTraefikConfig(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
profile_id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -90,8 +95,9 @@ func DeleteTraefikConfig(q *db.Queries) http.HandlerFunc {
}
}
func PublishTraefikConfig(q *db.Queries) http.HandlerFunc {
func PublishTraefikConfig(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
profile, err := q.GetProfileByName(r.Context(), r.PathValue("name"))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
+11 -5
View File
@@ -1,6 +1,7 @@
package handler
import (
"database/sql"
"encoding/json"
"net/http"
"strconv"
@@ -9,8 +10,9 @@ import (
"github.com/MizuchiLabs/mantrae/internal/util"
)
func ListUsers(q *db.Queries) http.HandlerFunc {
func ListUsers(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
users, err := q.ListUsers(r.Context())
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -21,8 +23,9 @@ func ListUsers(q *db.Queries) http.HandlerFunc {
}
}
func GetUser(q *db.Queries) http.HandlerFunc {
func GetUser(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
user_id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -38,8 +41,9 @@ func GetUser(q *db.Queries) http.HandlerFunc {
}
}
func CreateUser(q *db.Queries) http.HandlerFunc {
func CreateUser(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var user db.CreateUserParams
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -57,8 +61,9 @@ func CreateUser(q *db.Queries) http.HandlerFunc {
}
}
func UpdateUser(q *db.Queries) http.HandlerFunc {
func UpdateUser(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
var user db.UpdateUserParams
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -93,8 +98,9 @@ func UpdateUser(q *db.Queries) http.HandlerFunc {
}
}
func DeleteUser(q *db.Queries) http.HandlerFunc {
func DeleteUser(DB *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := db.New(DB)
user_id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)