diff --git a/README.md b/README.md index f9e3993..e4afd22 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,9 @@ Each directory in the `/users/` directory of a repository is considered a user. -- This will be rendered as the blog post. -- Must be present for the blog post to be valid. -- All other folders will be ignored + \- status.yml + -- Used to track various process status related to the post, + -- such as if a webmention was sent. \- media/ -- Contains all media files used in the blog post. -- All files in this folder will be publicly available @@ -59,3 +62,14 @@ aliases: Actual post ``` + + +#### status.yml + +``` +webmentions: + - target: https://example.com/post + supported: true + scanned_at: 2021-08-13T17:07:00Z + last_sent_at: 2021-08-13T17:07:00Z +``` \ No newline at end of file diff --git a/post.go b/post.go index f2a6ff9..5722c00 100644 --- a/post.go +++ b/post.go @@ -32,6 +32,10 @@ type PostMeta struct { Draft bool `yaml:"draft"` } +type PostStatus struct { + Webmentions []WebmentionOut +} + func (post Post) Id() string { return post.id } @@ -156,7 +160,7 @@ func (post *Post) WebmentionFile(source string) string { return path.Join(post.WebmentionDir(), hashStr+".yml") } -func (post *Post) PersistWebmention(webmention Webmention) error { +func (post *Post) PersistWebmention(webmention WebmentionIn) error { // ensure dir exists os.MkdirAll(post.WebmentionDir(), 0755) @@ -169,7 +173,7 @@ func (post *Post) PersistWebmention(webmention Webmention) error { return os.WriteFile(fileName, data, 0644) } -func (post *Post) Webmention(source string) (Webmention, error) { +func (post *Post) Webmention(source string) (WebmentionIn, error) { // ensure dir exists os.MkdirAll(post.WebmentionDir(), 0755) @@ -177,18 +181,18 @@ func (post *Post) Webmention(source string) (Webmention, error) { fileName := post.WebmentionFile(source) if !fileExists(fileName) { // return error if file doesn't exist - return Webmention{}, fmt.Errorf("Webmention file not found: %s", source) + return WebmentionIn{}, fmt.Errorf("Webmention file not found: %s", source) } data, err := os.ReadFile(fileName) if err != nil { - return Webmention{}, err + return WebmentionIn{}, err } - mention := Webmention{} + mention := WebmentionIn{} err = yaml.Unmarshal(data, &mention) if err != nil { - return Webmention{}, err + return WebmentionIn{}, err } return mention, nil @@ -198,7 +202,7 @@ func (post *Post) AddWebmention(source string) error { // Check if file already exists _, err := post.Webmention(source) if err != nil { - webmention := Webmention{ + webmention := WebmentionIn{ Source: source, } defer post.EnrichWebmention(source) @@ -223,17 +227,17 @@ func (post *Post) EnrichWebmention(source string) error { return err } -func (post *Post) Webmentions() []Webmention { +func (post *Post) Webmentions() []WebmentionIn { // ensure dir exists os.MkdirAll(post.WebmentionDir(), 0755) files := listDir(post.WebmentionDir()) - webmentions := []Webmention{} + webmentions := []WebmentionIn{} for _, file := range files { data, err := os.ReadFile(path.Join(post.WebmentionDir(), file)) if err != nil { continue } - mention := Webmention{} + mention := WebmentionIn{} err = yaml.Unmarshal(data, &mention) if err != nil { continue @@ -244,9 +248,9 @@ func (post *Post) Webmentions() []Webmention { return webmentions } -func (post *Post) ApprovedWebmentions() []Webmention { +func (post *Post) ApprovedWebmentions() []WebmentionIn { webmentions := post.Webmentions() - approved := []Webmention{} + approved := []WebmentionIn{} for _, webmention := range webmentions { if webmention.ApprovalStatus == "approved" { approved = append(approved, webmention) diff --git a/post_test.go b/post_test.go index 5eafb59..698c956 100644 --- a/post_test.go +++ b/post_test.go @@ -173,7 +173,7 @@ func TestPersistWebmention(t *testing.T) { repo := getTestRepo() user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost") - webmention := owl.Webmention{ + webmention := owl.WebmentionIn{ Source: "http://example.com/source", } err := post.PersistWebmention(webmention) @@ -265,25 +265,25 @@ func TestApprovedWebmentions(t *testing.T) { repo := getTestRepo() user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost") - webmention := owl.Webmention{ + webmention := owl.WebmentionIn{ Source: "http://example.com/source", ApprovalStatus: "approved", RetrievedAt: time.Now(), } post.PersistWebmention(webmention) - webmention = owl.Webmention{ + webmention = owl.WebmentionIn{ Source: "http://example.com/source2", ApprovalStatus: "", RetrievedAt: time.Now().Add(time.Hour * -1), } post.PersistWebmention(webmention) - webmention = owl.Webmention{ + webmention = owl.WebmentionIn{ Source: "http://example.com/source3", ApprovalStatus: "approved", RetrievedAt: time.Now().Add(time.Hour * -2), } post.PersistWebmention(webmention) - webmention = owl.Webmention{ + webmention = owl.WebmentionIn{ Source: "http://example.com/source4", ApprovalStatus: "rejected", RetrievedAt: time.Now().Add(time.Hour * -3), diff --git a/renderer_test.go b/renderer_test.go index c6925fa..92d9cd7 100644 --- a/renderer_test.go +++ b/renderer_test.go @@ -162,14 +162,14 @@ func TestRenderPostIncludesRelToWebMention(t *testing.T) { func TestRenderPostAddsLinksToApprovedWebmention(t *testing.T) { user := getTestUser() post, _ := user.CreateNewPost("testpost") - webmention := owl.Webmention{ + webmention := owl.WebmentionIn{ Source: "http://example.com/source3", Title: "Test Title", ApprovalStatus: "approved", RetrievedAt: time.Now().Add(time.Hour * -2), } post.PersistWebmention(webmention) - webmention = owl.Webmention{ + webmention = owl.WebmentionIn{ Source: "http://example.com/source4", ApprovalStatus: "rejected", RetrievedAt: time.Now().Add(time.Hour * -3), diff --git a/webmention.go b/webmention.go index fccd815..f8ca0b1 100644 --- a/webmention.go +++ b/webmention.go @@ -10,13 +10,20 @@ import ( "golang.org/x/net/html" ) -type Webmention struct { +type WebmentionIn struct { Source string `yaml:"source"` Title string `yaml:"title"` ApprovalStatus string `yaml:"approval_status"` RetrievedAt time.Time `yaml:"retrieved_at"` } +type WebmentionOut struct { + Target string `yaml:"target"` + Supported bool `yaml:"supported"` + ScannedAt time.Time `yaml:"scanned_at"` + LastSentAt time.Time `yaml:"last_sent_at"` +} + type HttpRetriever interface { Get(url string) ([]byte, error) }