From a7b987cca247f0f731dcb79038ef933901a88b3a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Else Date: Sun, 22 Dec 2019 21:17:11 +0100 Subject: [PATCH] More refactoring --- config.go | 42 ++++++++++++++++----------- entry.go | 6 ++-- micropub.go | 14 ++++++--- gitea.go => storage.go | 64 +++++++++++++++++++++--------------------- webmention.go | 10 ++++--- 5 files changed, 77 insertions(+), 59 deletions(-) rename gitea.go => storage.go (59%) diff --git a/config.go b/config.go index 9d0d815..d90aecd 100644 --- a/config.go +++ b/config.go @@ -9,10 +9,9 @@ import ( var ( BlogUrl string - GiteaEndpoint string - GiteaToken string IgnoredWebmentionUrls []string SyndicationTargets []SyndicationTarget + SelectedStorage Storage SelectedCdn Cdn SelectedSocials Socials ) @@ -29,17 +28,6 @@ func init() { log.Fatal(err) } BlogUrl = blogUrl - // Gitea (required) - giteaEndpoint, err := giteaEndpoint() - if err != nil { - log.Fatal(err) - } - GiteaEndpoint = giteaEndpoint - giteaToken, err := giteaToken() - if err != nil { - log.Fatal(err) - } - GiteaToken = giteaToken // Ignored Webmention URLs (optional) ignoredWebmentionUrls, err := ignoredWebmentionUrls() if err != nil { @@ -52,7 +40,23 @@ func init() { log.Println(err) } SyndicationTargets = syndicationTargets - // Find selected CDN (currently only BunnyCDN) + // Find selected storage + SelectedStorage = func() Storage { + // Gitea + giteaEndpoint, err1 := giteaEndpoint() + giteaToken, err2 := giteaToken() + if err1 == nil && err2 == nil { + return &Gitea{ + endpoint: giteaEndpoint, + token: giteaToken, + } + } + return nil + }() + if SelectedStorage == nil { + log.Fatal("No storage configured") + } + // Find selected CDN (optional) SelectedCdn = func() Cdn { // BunnyCDN (optional) bunnyCdnKey, err := bunnyCdnKey() @@ -61,9 +65,12 @@ func init() { } return nil }() - // Find configured social networks + if SelectedCdn == nil { + log.Println("No CDN configured") + } + // Find configured social networks (optional) SelectedSocials = func() Socials { - var socials []Social + var socials []Social = nil // Microblog.pub microblogUrl, err1 := microblogUrl() microblogToken, err2 := microblogToken() @@ -75,6 +82,9 @@ func init() { } return socials }() + if SelectedSocials == nil { + log.Println("No social networks configured") + } } func giteaEndpoint() (string, error) { diff --git a/entry.go b/entry.go index 5da92bc..5d08941 100644 --- a/entry.go +++ b/entry.go @@ -232,7 +232,7 @@ func WriteEntry(entry *Entry) (location string, err error) { if err != nil { return } - err = CreateFile(entry.filename, file, entry.title) + err = SelectedStorage.CreateFile(entry.filename, file, entry.title) if err != nil { return } @@ -257,8 +257,8 @@ func ReadEntry(url string) (entry *Entry, err error) { if err != nil { return } - fileContent, err := ReadFileContent(filePath) - if err != nil { + fileContent, _, exists, err := SelectedStorage.ReadFile(filePath) + if err != nil || !exists { return } entry, err = ReadHugoPost(fileContent) diff --git a/micropub.go b/micropub.go index 21a63cd..f4ec726 100644 --- a/micropub.go +++ b/micropub.go @@ -80,14 +80,20 @@ func HandleMicroPub(w http.ResponseWriter, r *http.Request) { } else { w.Header().Add("Location", location) w.WriteHeader(http.StatusAccepted) - // Purge BunnyCDN in 10 seconds + // Purge CDN in 10 seconds, send webmentions, post to social media go func() { + if SelectedCdn != nil { + time.Sleep(10 * time.Second) + SelectedCdn.Purge(location) + } time.Sleep(10 * time.Second) - SelectedCdn.Purge(location) - time.Sleep(3 * time.Second) // Send webmentions go SendWebmentions(location) - go SelectedSocials.Post(location, entry.title) + go func() { + if SelectedSocials != nil { + SelectedSocials.Post(location, entry.title) + } + }() }() return } diff --git a/gitea.go b/storage.go similarity index 59% rename from gitea.go rename to storage.go index 4081a39..8590e88 100644 --- a/gitea.go +++ b/storage.go @@ -11,24 +11,36 @@ import ( "strings" ) -type GiteaCommitRequest struct { +type Storage interface { + CreateFile(path string, file string, message string) (err error) + UpdateFile(path string, file string, message string) (err error) + ReadFile(path string) (content string, sha string, exists bool, err error) +} + +// Gitea +type Gitea struct { + endpoint string + token string +} + +type giteaCommitRequest struct { Content string `json:"content"` Message string `json:"message"` SHA string `json:"sha,omitempty"` } -type GiteaReadRequest struct { +type giteaReadResponse struct { Type string `json:"type"` Content string `json:"content"` SHA string `json:"sha"` } -type GiteaErrorResponse struct { +type giteaErrorResponse struct { Message string `json:"message"` } -func CreateFile(path string, file string, message string) error { - request := &GiteaCommitRequest{ +func (gitea *Gitea) CreateFile(path string, file string, message string) (err error) { + request := &giteaCommitRequest{ Content: base64.StdEncoding.EncodeToString([]byte(file)), Message: message, } @@ -36,32 +48,32 @@ func CreateFile(path string, file string, message string) error { if err != nil { return errors.New("failed to marshal json before committing") } - resp, err := http.Post(GiteaEndpoint+url.QueryEscape(path)+"?access_token="+GiteaToken, "application/json", bytes.NewBuffer(bytesRepresentation)) + resp, err := http.Post(gitea.endpoint+url.QueryEscape(path)+"?access_token="+gitea.token, "application/json", bytes.NewBuffer(bytesRepresentation)) if err != nil || resp.StatusCode != 201 { return errors.New("failed to create file in repo") } return nil } -func UpdateFile(path string, file string, message string) error { - existingFile, exists, err := ReadFile(path) +func (gitea *Gitea) UpdateFile(path string, file string, message string) (err error) { + _, sha, exists, err := gitea.ReadFile(path) if err != nil { return err } if !exists { // File doesn't exist, create it - return CreateFile(path, file, message) + return gitea.CreateFile(path, file, message) } - request := &GiteaCommitRequest{ + request := &giteaCommitRequest{ Content: base64.StdEncoding.EncodeToString([]byte(file)), Message: message, - SHA: existingFile.SHA, + SHA: sha, } bytesRepresentation, err := json.Marshal(request) if err != nil { return errors.New("failed to marshal json before committing") } - req, err := http.NewRequest(http.MethodPut, GiteaEndpoint+url.QueryEscape(path)+"?access_token="+GiteaToken, bytes.NewBuffer(bytesRepresentation)) + req, err := http.NewRequest(http.MethodPut, gitea.endpoint+url.QueryEscape(path)+"?access_token="+gitea.token, bytes.NewBuffer(bytesRepresentation)) if err != nil { return errors.New("error making update request") } @@ -74,9 +86,9 @@ func UpdateFile(path string, file string, message string) error { return nil } -func ReadFile(path string) (response *GiteaReadRequest, exists bool, err error) { +func (gitea *Gitea) ReadFile(path string) (content string, sha string, exists bool, err error) { exists = false - resp, err := http.Get(GiteaEndpoint + url.QueryEscape(path) + "?access_token=" + GiteaToken) + resp, err := http.Get(gitea.endpoint + url.QueryEscape(path) + "?access_token=" + gitea.token) if err != nil || resp.StatusCode != 200 { if resp != nil { defer resp.Body.Close() @@ -85,7 +97,7 @@ func ReadFile(path string) (response *GiteaReadRequest, exists bool, err error) err = errors.New("failed reading Gitea error response") return } - errorResponse := &GiteaErrorResponse{} + errorResponse := &giteaErrorResponse{} marshalErr := json.Unmarshal(body, &errorResponse) if marshalErr != nil { err = errors.New("failed parsing Gitea error response") @@ -106,29 +118,17 @@ func ReadFile(path string) (response *GiteaReadRequest, exists bool, err error) err = errors.New("failed reading file in repo") return } - response = &GiteaReadRequest{} - err = json.Unmarshal(body, &response) + readResponse := &giteaReadResponse{} + err = json.Unmarshal(body, &readResponse) if err != nil { err = errors.New("failed parsing Gitea response") return } - return -} - -func ReadFileContent(path string) (fileContent string, err error) { - giteaResponseBody, exists, err := ReadFile(path) - if err != nil { - return - } - if !exists { - // File doesn't exist, nothing to read - err = errors.New("file does not exist") - return - } - decodedBytes, err := base64.StdEncoding.DecodeString(giteaResponseBody.Content) + decodedContentBytes, err := base64.StdEncoding.DecodeString(readResponse.Content) if err != nil { err = errors.New("failed decoding file content") } - fileContent = string(decodedBytes) + content = string(decodedContentBytes) + sha = readResponse.SHA return } \ No newline at end of file diff --git a/webmention.go b/webmention.go index 56f7129..82c1351 100644 --- a/webmention.go +++ b/webmention.go @@ -162,7 +162,7 @@ func saveWebmention(mention *Mention) (err error) { return errors.New("failed to marshal json before committing") } filePath := fmt.Sprintf("data/mentions/%x/%x.json", md5.Sum([]byte(strings.ReplaceAll(mention.Target, "/", ""))), md5.Sum([]byte(mention.Source))) - err = UpdateFile(filePath, string(bytesRepresentation), "New webmention from "+mention.Source) + err = SelectedStorage.UpdateFile(filePath, string(bytesRepresentation), "New webmention from "+mention.Source) return } @@ -174,10 +174,12 @@ func returnSuccess(target string, w http.ResponseWriter, r *http.Request) { } else { w.WriteHeader(http.StatusOK) } - // Purge BunnyCDN in 10 seconds + // Purge CDN in 10 seconds go func() { - time.Sleep(10 * time.Second) - SelectedCdn.Purge(target) + if SelectedCdn != nil { + time.Sleep(10 * time.Second) + SelectedCdn.Purge(target) + } }() return } \ No newline at end of file