mirror of
https://github.com/MizuchiLabs/mantrae.git
synced 2026-05-08 00:49:49 -05:00
reworked backups
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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(¶ms); 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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(¶ms); 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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user