58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"git.warky.dev/wdevs/whatshooked/pkg/logging"
|
|
"git.warky.dev/wdevs/whatshooked/pkg/whatsapp/whatsmeow"
|
|
)
|
|
|
|
// ServeQRCode serves the QR code image for a WhatsApp account
|
|
func (h *Handlers) ServeQRCode(w http.ResponseWriter, r *http.Request) {
|
|
// Expected path format: /api/qr/{accountID}
|
|
path := r.URL.Path[len("/api/qr/"):]
|
|
accountID := path
|
|
|
|
if accountID == "" {
|
|
http.Error(w, "Invalid QR code path", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// Get client from manager
|
|
client, exists := h.whatsappMgr.GetClient(accountID)
|
|
if !exists {
|
|
http.Error(w, "Account not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
// Type assert to whatsmeow client (only whatsmeow clients have QR codes)
|
|
whatsmeowClient, ok := client.(*whatsmeow.Client)
|
|
if !ok {
|
|
http.Error(w, "QR codes are only available for whatsmeow clients", http.StatusBadRequest)
|
|
logging.Warn("QR code requested for non-whatsmeow client", "account_id", accountID)
|
|
return
|
|
}
|
|
|
|
// Get QR code PNG
|
|
pngData, err := whatsmeowClient.GetQRCodePNG()
|
|
if err != nil {
|
|
if err.Error() == "no QR code available" {
|
|
http.Error(w, "No QR code available. The account may already be connected or pairing has not started yet.", http.StatusNotFound)
|
|
} else {
|
|
logging.Error("Failed to generate QR code PNG", "account_id", accountID, "error", err)
|
|
http.Error(w, "Failed to generate QR code", http.StatusInternalServerError)
|
|
}
|
|
return
|
|
}
|
|
|
|
// Set headers
|
|
w.Header().Set("Content-Type", "image/png")
|
|
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
|
|
w.Header().Set("Pragma", "no-cache")
|
|
w.Header().Set("Expires", "0")
|
|
|
|
// Write PNG data
|
|
writeBytes(w, pngData)
|
|
logging.Debug("QR code served", "account_id", accountID)
|
|
}
|