I added some DB schema to track logos and to relate reports to organizations. I reworked how GPS data comes from EXIF data on images because it wasn't working for JPEGs. I might have broken PNGs in the process. Also made the config options for domain names more standardized.
145 lines
5.4 KiB
Go
145 lines
5.4 KiB
Go
package sync
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/config"
|
|
"github.com/Gleipnir-Technology/nidus-sync/htmlpage"
|
|
"github.com/go-chi/chi/v5"
|
|
"github.com/rs/zerolog/log"
|
|
"github.com/skip2/go-qrcode"
|
|
)
|
|
|
|
// Unauthenticated pages
|
|
var (
|
|
admin = buildTemplate("admin", "base")
|
|
dataEntry = buildTemplate("data-entry", "base")
|
|
dataEntryGood = buildTemplate("data-entry-good", "base")
|
|
dataEntryBad = buildTemplate("data-entry-bad", "base")
|
|
dispatch = buildTemplate("dispatch", "base")
|
|
dispatchResults = buildTemplate("dispatch-results", "base")
|
|
mockRoot = buildTemplate("mock-root", "base")
|
|
reportPage = buildTemplate("report", "base")
|
|
reportConfirmation = buildTemplate("report-confirmation", "base")
|
|
reportContribute = buildTemplate("report-contribute", "base")
|
|
reportDetail = buildTemplate("report-detail", "base")
|
|
reportEvidence = buildTemplate("report-evidence", "base")
|
|
reportSchedule = buildTemplate("report-schedule", "base")
|
|
reportUpdate = buildTemplate("report-update", "base")
|
|
serviceRequest = buildTemplate("service-request", "base")
|
|
serviceRequestDetail = buildTemplate("service-request-detail", "base")
|
|
serviceRequestLocation = buildTemplate("service-request-location", "base")
|
|
serviceRequestMosquito = buildTemplate("service-request-mosquito", "base")
|
|
serviceRequestPool = buildTemplate("service-request-pool", "base")
|
|
serviceRequestQuick = buildTemplate("service-request-quick", "base")
|
|
serviceRequestQuickConfirmation = buildTemplate("service-request-quick-confirmation", "base")
|
|
serviceRequestUpdates = buildTemplate("service-request-updates", "base")
|
|
settingRoot = buildTemplate("setting-mock", "base")
|
|
settingIntegration = buildTemplate("setting-integration", "base")
|
|
settingPesticide = buildTemplate("setting-pesticide", "base")
|
|
settingPesticideAdd = buildTemplate("setting-pesticide-add", "base")
|
|
settingUsers = buildTemplate("setting-user", "base")
|
|
settingUsersAdd = buildTemplate("setting-user-add", "base")
|
|
)
|
|
|
|
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)
|
|
// 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)
|
|
}
|
|
}
|
|
|
|
func mock(t string, w http.ResponseWriter, code string) {
|
|
data := ContentMock{
|
|
DistrictName: "Delta MVCD",
|
|
URLs: ContentMockURLs{
|
|
Dispatch: "/mock/dispatch",
|
|
DispatchResults: "/mock/dispatch-results",
|
|
ReportConfirmation: fmt.Sprintf("/mock/report/%s/confirm", code),
|
|
ReportDetail: fmt.Sprintf("/mock/report/%s", code),
|
|
ReportContribute: fmt.Sprintf("/mock/report/%s/contribute", code),
|
|
ReportEvidence: fmt.Sprintf("/mock/report/%s/evidence", code),
|
|
ReportSchedule: fmt.Sprintf("/mock/report/%s/schedule", code),
|
|
ReportUpdate: fmt.Sprintf("/mock/report/%s/update", code),
|
|
Root: "/mock",
|
|
Setting: "/mock/setting",
|
|
SettingIntegration: "/mock/setting/integration",
|
|
SettingPesticide: "/mock/setting/pesticide",
|
|
SettingPesticideAdd: "/mock/setting/pesticide/add",
|
|
SettingUser: "/mock/setting/user",
|
|
SettingUserAdd: "/mock/setting/user/add",
|
|
},
|
|
}
|
|
template, ok := htmlpage.TemplatesByFilename[t+".html"]
|
|
if !ok {
|
|
log.Error().Str("template", t).Msg("Failed to find template")
|
|
respondError(w, "Failed to render template", nil, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
htmlpage.RenderOrError(w, &template, data)
|
|
}
|
|
|
|
func renderMock(templateName string) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
code := chi.URLParam(r, "code")
|
|
if code == "" {
|
|
code = "abc-123"
|
|
}
|
|
mock(templateName, w, code)
|
|
}
|
|
}
|