From 42fb7a2003f608375b0d4150631f19322466cc75 Mon Sep 17 00:00:00 2001 From: Justin Hawkins Date: Sat, 6 Nov 2021 22:56:27 +1030 Subject: [PATCH] Continue changes to allow uploads to be "pending" so a decision can be made to either upload or skip them (and ultimately, edit as well). --- go.mod | 1 + go.sum | 2 + upload/upload.go | 39 +++++++----- upload/upload_test.go | 4 +- web/data/config.html | 1 - web/data/uploads.html | 134 ++++++++++++++++++++++++++++++++++-------- web/data/wrapper.tmpl | 2 +- web/server.go | 118 +++++++++++++++++++++++++++++-------- 8 files changed, 233 insertions(+), 68 deletions(-) diff --git a/go.mod b/go.mod index 7d06244..f285ca3 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.16 require ( github.com/fogleman/gg v1.3.0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/gorilla/mux v1.8.0 // indirect github.com/mitchellh/go-homedir v1.1.0 golang.org/x/image v0.0.0-20210504121937-7319ad40d33e golang.org/x/mod v0.4.2 diff --git a/go.sum b/go.sum index 9892b01..d2e5d2f 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/upload/upload.go b/upload/upload.go index b40d79d..2c6114e 100644 --- a/upload/upload.go +++ b/upload/upload.go @@ -15,6 +15,7 @@ import ( "net/http" "os" "path/filepath" + "sync/atomic" "time" "github.com/fogleman/gg" @@ -26,13 +27,16 @@ import ( type State string const ( - StatePending State = "Pending" - StateQueued State = "Queued" - StateUploading State = "Uploading" - StateComplete State = "Complete" - StateFailed State = "Failed" + StatePending State = "Pending" // waiting for decision to upload (could be edited) + StateQueued State = "Queued" // ready for upload + StateUploading State = "Uploading" // uploading + StateComplete State = "Complete" // finished successfully + StateFailed State = "Failed" // failed + StateSkipped State = "Skipped" // user did not want to upload ) +var currentId int32 + type HTTPClient interface { Do(req *http.Request) (*http.Response, error) } @@ -42,10 +46,11 @@ type Uploader struct { } type Upload struct { + Id int32 `json:"id"` UploadedAt time.Time `json:"uploaded_at"` - originalFilename string // path on the local disk - filenameToUpload string // post-watermark, or just original if unwatermarked + OriginalFilename string `json:"original_file"` // path on the local disk + TemporaryFileToUpload string // post-watermark, or just original if unwatermarked webhookURL string @@ -71,8 +76,10 @@ func NewUploader() *Uploader { } func (u *Uploader) AddFile(file string, conf config.Watcher) { + atomic.AddInt32(¤tId, 1) thisUpload := Upload{ - originalFilename: file, + Id: currentId, + OriginalFilename: file, watermark: !conf.NoWatermark, webhookURL: conf.WebHookURL, usernameOverride: conf.Username, @@ -92,7 +99,7 @@ func (u *Uploader) Upload() { } func (u *Upload) processUpload() error { - daulog.SendLog(fmt.Sprintf("Uploading: %s", u.originalFilename), daulog.LogTypeInfo) + daulog.SendLog(fmt.Sprintf("Uploading: %s", u.OriginalFilename), daulog.LogTypeInfo) if u.webhookURL == "" { daulog.SendLog("WebHookURL is not configured - cannot upload!", daulog.LogTypeError) @@ -103,7 +110,7 @@ func (u *Upload) processUpload() error { daulog.SendLog("Watermarking image", daulog.LogTypeInfo) u.applyWatermark() } else { - u.filenameToUpload = u.originalFilename + u.TemporaryFileToUpload = u.OriginalFilename } extraParams := map[string]string{} @@ -130,7 +137,7 @@ func (u *Upload) processUpload() error { var retriesRemaining = 5 for retriesRemaining > 0 { - request, err := newfileUploadRequest(u.webhookURL, extraParams, "file", u.filenameToUpload) + request, err := newfileUploadRequest(u.webhookURL, extraParams, "file", u.TemporaryFileToUpload) if err != nil { log.Printf("error creating upload request: %s", err) return fmt.Errorf("could not create upload request: %s", err) @@ -216,8 +223,8 @@ func (u *Upload) processUpload() error { } if u.watermark { - daulog.SendLog(fmt.Sprintf("Removing temporary file: %s", u.filenameToUpload), daulog.LogTypeDebug) - os.Remove(u.filenameToUpload) + daulog.SendLog(fmt.Sprintf("Removing temporary file: %s", u.TemporaryFileToUpload), daulog.LogTypeDebug) + os.Remove(u.TemporaryFileToUpload) } if retriesRemaining == 0 { @@ -261,7 +268,7 @@ func newfileUploadRequest(uri string, params map[string]string, paramName, path func (u *Upload) applyWatermark() { - reader, err := os.Open(u.originalFilename) + reader, err := os.Open(u.OriginalFilename) if err != nil { log.Fatal(err) } @@ -271,7 +278,7 @@ func (u *Upload) applyWatermark() { if err != nil { daulog.SendLog(fmt.Sprintf("Cannot decode image: %v - skipping watermarking", err), daulog.LogTypeError) u.watermark = false - u.filenameToUpload = u.originalFilename + u.TemporaryFileToUpload = u.OriginalFilename return } bounds := im.Bounds() @@ -302,7 +309,7 @@ func (u *Upload) applyWatermark() { actualName := tempfile.Name() + ".png" dc.SavePNG(actualName) - u.filenameToUpload = actualName + u.TemporaryFileToUpload = actualName } func sleepForRetries(retry int) { diff --git a/upload/upload_test.go b/upload/upload_test.go index c840bdd..89dfd14 100644 --- a/upload/upload_test.go +++ b/upload/upload_test.go @@ -43,7 +43,7 @@ func TestSuccessfulUpload(t *testing.T) { // we will not really be uploading it here f, _ := os.CreateTemp("", "dautest-upload-*") defer os.Remove(f.Name()) - u := Upload{webhookURL: "https://127.0.0.1/", originalFilename: f.Name()} + u := Upload{webhookURL: "https://127.0.0.1/", OriginalFilename: f.Name()} u.Client = &MockClient{DoFunc: DoGoodUpload} err := u.processUpload() if err != nil { @@ -62,7 +62,7 @@ func TestTooBigUpload(t *testing.T) { // we will not really be uploading it here f, _ := os.CreateTemp("", "dautest-upload-*") defer os.Remove(f.Name()) - u := Upload{webhookURL: "https://127.0.0.1/", originalFilename: f.Name()} + u := Upload{webhookURL: "https://127.0.0.1/", OriginalFilename: f.Name()} u.Client = &MockClient{DoFunc: DoTooBigUpload} err := u.processUpload() if err == nil { diff --git a/web/data/config.html b/web/data/config.html index 7c79ccd..36d4425 100644 --- a/web/data/config.html +++ b/web/data/config.html @@ -160,7 +160,6 @@ {{ end }} {{ define "js" }} - {{ end }} diff --git a/web/data/wrapper.tmpl b/web/data/wrapper.tmpl index 3678a26..7e2229d 100644 --- a/web/data/wrapper.tmpl +++ b/web/data/wrapper.tmpl @@ -10,7 +10,7 @@ - +