83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
|
|
package sync
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/skip2/go-qrcode"
|
||
|
|
"net/http"
|
||
|
|
"strconv"
|
||
|
|
|
||
|
|
"github.com/Gleipnir-Technology/nidus-sync/config"
|
||
|
|
"github.com/go-chi/chi/v5"
|
||
|
|
)
|
||
|
|
|
||
|
|
func getQRCodeMailer(w http.ResponseWriter, r *http.Request) {
|
||
|
|
code := chi.URLParam(r, "code")
|
||
|
|
if code == "" {
|
||
|
|
respondError(w, "There should always be a id", nil, http.StatusBadRequest)
|
||
|
|
}
|
||
|
|
content := config.MakeURLReport("/mailer/%s", code)
|
||
|
|
writeQRCode(w, r, content)
|
||
|
|
}
|
||
|
|
|
||
|
|
func getQRCodeReport(w http.ResponseWriter, r *http.Request) {
|
||
|
|
code := chi.URLParam(r, "code")
|
||
|
|
if code == "" {
|
||
|
|
respondError(w, "There should always be a code", nil, http.StatusBadRequest)
|
||
|
|
}
|
||
|
|
content := config.MakeURLNidus("/report/%s", code)
|
||
|
|
writeQRCode(w, r, content)
|
||
|
|
}
|
||
|
|
func writeQRCode(w http.ResponseWriter, r *http.Request, content string) {
|
||
|
|
// Get optional size parameter (default to 256)
|
||
|
|
size := 256
|
||
|
|
if sizeStr := r.URL.Query().Get("size"); sizeStr != "" {
|
||
|
|
var err error
|
||
|
|
size, err = strconv.Atoi(sizeStr)
|
||
|
|
if err != nil {
|
||
|
|
http.Error(w, "Invalid 'size' parameter, must be an integer", http.StatusBadRequest)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get optional error correction level (default to Medium)
|
||
|
|
level := qrcode.Medium
|
||
|
|
if levelStr := r.URL.Query().Get("level"); levelStr != "" {
|
||
|
|
switch levelStr {
|
||
|
|
case "L", "l":
|
||
|
|
level = qrcode.Low
|
||
|
|
case "M", "m":
|
||
|
|
level = qrcode.Medium
|
||
|
|
case "Q", "q":
|
||
|
|
level = qrcode.High
|
||
|
|
case "H", "h":
|
||
|
|
level = qrcode.Highest
|
||
|
|
default:
|
||
|
|
respondError(w, "Invalid 'level' parameter, must be L, M, Q, or H", nil, http.StatusBadRequest)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Generate the QR code
|
||
|
|
var qr *qrcode.QRCode
|
||
|
|
var err error
|
||
|
|
qr, err = qrcode.New(content, level)
|
||
|
|
if err != nil {
|
||
|
|
respondError(w, "Error generating QR code", err, http.StatusInternalServerError)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// Set the appropriate content type
|
||
|
|
w.Header().Set("Content-Type", "image/png")
|
||
|
|
|
||
|
|
// Generate PNG and write directly to the response writer
|
||
|
|
png, err := qr.PNG(size)
|
||
|
|
if err != nil {
|
||
|
|
respondError(w, "Error encoding QR code to PNG", err, http.StatusInternalServerError)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
_, err = w.Write(png)
|
||
|
|
if err != nil {
|
||
|
|
respondError(w, "Error writing response", err, http.StatusInternalServerError)
|
||
|
|
}
|
||
|
|
}
|