Compare commits
No commits in common. "a49deabf078bae24dffdd46e262d37c5f86dc6c5" and "9209f227c43901f54a64392194385a800700bc67" have entirely different histories.
a49deabf07
...
9209f227c4
|
@ -40,7 +40,7 @@ var newPostCmd = &cobra.Command{
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
post, err := user.CreateNewPost(owl.PostMeta{Type: "article", Title: postTitle, Draft: true}, "")
|
post, err := user.CreateNewPost(postTitle, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
println("Error creating post: ", err.Error())
|
println("Error creating post: ", err.Error())
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
func TestRedirectOnAliases(t *testing.T) {
|
func TestRedirectOnAliases(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test\n"
|
content += "title: Test\n"
|
||||||
|
@ -39,7 +39,7 @@ func TestRedirectOnAliases(t *testing.T) {
|
||||||
func TestNoRedirectOnNonExistingAliases(t *testing.T) {
|
func TestNoRedirectOnNonExistingAliases(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test\n"
|
content += "title: Test\n"
|
||||||
|
@ -64,8 +64,8 @@ func TestNoRedirectOnNonExistingAliases(t *testing.T) {
|
||||||
func TestNoRedirectIfValidPostUrl(t *testing.T) {
|
func TestNoRedirectIfValidPostUrl(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
post2, _ := user.CreateNewPost(owl.PostMeta{Title: "post-2"}, "")
|
post2, _ := user.CreateNewPost("post-2", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test\n"
|
content += "title: Test\n"
|
||||||
|
@ -89,7 +89,7 @@ func TestNoRedirectIfValidPostUrl(t *testing.T) {
|
||||||
func TestRedirectIfInvalidPostUrl(t *testing.T) {
|
func TestRedirectIfInvalidPostUrl(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test\n"
|
content += "title: Test\n"
|
||||||
|
@ -113,7 +113,7 @@ func TestRedirectIfInvalidPostUrl(t *testing.T) {
|
||||||
func TestRedirectIfInvalidUserUrl(t *testing.T) {
|
func TestRedirectIfInvalidUserUrl(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test\n"
|
content += "title: Test\n"
|
||||||
|
@ -137,7 +137,7 @@ func TestRedirectIfInvalidUserUrl(t *testing.T) {
|
||||||
func TestRedirectIfInvalidMediaUrl(t *testing.T) {
|
func TestRedirectIfInvalidMediaUrl(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test\n"
|
content += "title: Test\n"
|
||||||
|
@ -161,7 +161,7 @@ func TestRedirectIfInvalidMediaUrl(t *testing.T) {
|
||||||
func TestDeepAliasInSingleUserMode(t *testing.T) {
|
func TestDeepAliasInSingleUserMode(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{SingleUser: "test-1"})
|
repo := getTestRepo(owl.RepoConfig{SingleUser: "test-1"})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Create tileable textures with GIMP\n"
|
content += "title: Create tileable textures with GIMP\n"
|
||||||
|
|
|
@ -245,16 +245,16 @@ func userEditorPostHandler(repo *owl.Repository) func(http.ResponseWriter, *http
|
||||||
// TODO: scrape bookmark_url for title and description
|
// TODO: scrape bookmark_url for title and description
|
||||||
|
|
||||||
// create post
|
// create post
|
||||||
post, err := user.CreateNewPost(owl.PostMeta{
|
post, err := user.CreateNewPostFull(owl.PostMeta{
|
||||||
Type: post_type,
|
Type: post_type,
|
||||||
Title: title,
|
Title: title,
|
||||||
Description: description,
|
Description: description,
|
||||||
Draft: draft == "on",
|
Draft: draft == "on",
|
||||||
Date: time.Now(),
|
Date: time.Now(),
|
||||||
Reply: owl.ReplyData{
|
Reply: owl.Reply{
|
||||||
Url: reply_url,
|
Url: reply_url,
|
||||||
},
|
},
|
||||||
Bookmark: owl.BookmarkData{
|
Bookmark: owl.Bookmark{
|
||||||
Url: bookmark_url,
|
Url: bookmark_url,
|
||||||
},
|
},
|
||||||
}, content)
|
}, content)
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package web_test
|
package web_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"h4kor/owl-blogs"
|
|
||||||
main "h4kor/owl-blogs/cmd/owl/web"
|
main "h4kor/owl-blogs/cmd/owl/web"
|
||||||
"h4kor/owl-blogs/test/assertions"
|
"h4kor/owl-blogs/test/assertions"
|
||||||
"h4kor/owl-blogs/test/mocks"
|
"h4kor/owl-blogs/test/mocks"
|
||||||
|
@ -213,7 +212,7 @@ func TestEditorSendsWebmentions(t *testing.T) {
|
||||||
repo.Parser = &mocks.MockHtmlParser{}
|
repo.Parser = &mocks.MockHtmlParser{}
|
||||||
user.ResetPassword("testpassword")
|
user.ResetPassword("testpassword")
|
||||||
|
|
||||||
mentioned_post, _ := user.CreateNewPost(owl.PostMeta{Title: "test"}, "")
|
mentioned_post, _ := user.CreateNewPost("test", false)
|
||||||
|
|
||||||
sessionId := user.CreateNewSession()
|
sessionId := user.CreateNewSession()
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,7 @@ func userWebmentionHandler(repo *owl.Repository) func(http.ResponseWriter, *http
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
tryAlias := func(target string) owl.Post {
|
tryAlias := func(target string) *owl.Post {
|
||||||
parsedTarget, _ := url.Parse(target)
|
parsedTarget, _ := url.Parse(target)
|
||||||
aliases, _ := repo.PostAliases()
|
aliases, _ := repo.PostAliases()
|
||||||
fmt.Printf("aliases %v", aliases)
|
fmt.Printf("aliases %v", aliases)
|
||||||
|
@ -155,7 +155,7 @@ func userWebmentionHandler(repo *owl.Repository) func(http.ResponseWriter, *http
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var aliasPost owl.Post
|
var aliasPost *owl.Post
|
||||||
parts := strings.Split(target[0], "/")
|
parts := strings.Split(target[0], "/")
|
||||||
if len(parts) < 2 {
|
if len(parts) < 2 {
|
||||||
aliasPost = tryAlias(target[0])
|
aliasPost = tryAlias(target[0])
|
||||||
|
@ -333,10 +333,10 @@ func userMicropubHandler(repo *owl.Repository) func(http.ResponseWriter, *http.R
|
||||||
}
|
}
|
||||||
|
|
||||||
// create post
|
// create post
|
||||||
post, err := user.CreateNewPost(
|
post, err := user.CreateNewPostFull(
|
||||||
owl.PostMeta{
|
owl.PostMeta{
|
||||||
Title: name,
|
Title: name,
|
||||||
Reply: owl.ReplyData{
|
Reply: owl.Reply{
|
||||||
Url: inReplyTo,
|
Url: inReplyTo,
|
||||||
},
|
},
|
||||||
Date: time.Now(),
|
Date: time.Now(),
|
||||||
|
|
|
@ -54,7 +54,7 @@ func TestMultiUserRepoIndexHandler(t *testing.T) {
|
||||||
func TestMultiUserUserIndexHandler(t *testing.T) {
|
func TestMultiUserUserIndexHandler(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
// Create Request and Response
|
// Create Request and Response
|
||||||
req, err := http.NewRequest("GET", user.UrlPath(), nil)
|
req, err := http.NewRequest("GET", user.UrlPath(), nil)
|
||||||
|
@ -72,7 +72,7 @@ func TestMultiUserUserIndexHandler(t *testing.T) {
|
||||||
func TestMultiUserPostHandler(t *testing.T) {
|
func TestMultiUserPostHandler(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
// Create Request and Response
|
// Create Request and Response
|
||||||
req, err := http.NewRequest("GET", post.UrlPath(), nil)
|
req, err := http.NewRequest("GET", post.UrlPath(), nil)
|
||||||
|
@ -87,7 +87,7 @@ func TestMultiUserPostHandler(t *testing.T) {
|
||||||
func TestMultiUserPostMediaHandler(t *testing.T) {
|
func TestMultiUserPostMediaHandler(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
// Create test media file
|
// Create test media file
|
||||||
path := path.Join(post.MediaDir(), "data.txt")
|
path := path.Join(post.MediaDir(), "data.txt")
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
func TestPostHandlerReturns404OnDrafts(t *testing.T) {
|
func TestPostHandlerReturns404OnDrafts(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: test\n"
|
content += "title: test\n"
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
func TestMultiUserUserRssIndexHandler(t *testing.T) {
|
func TestMultiUserUserRssIndexHandler(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
// Create Request and Response
|
// Create Request and Response
|
||||||
req, err := http.NewRequest("GET", user.UrlPath()+"index.xml", nil)
|
req, err := http.NewRequest("GET", user.UrlPath()+"index.xml", nil)
|
||||||
|
|
|
@ -19,7 +19,7 @@ func getSingleUserTestRepo() (owl.Repository, owl.User) {
|
||||||
|
|
||||||
func TestSingleUserUserIndexHandler(t *testing.T) {
|
func TestSingleUserUserIndexHandler(t *testing.T) {
|
||||||
repo, user := getSingleUserTestRepo()
|
repo, user := getSingleUserTestRepo()
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
// Create Request and Response
|
// Create Request and Response
|
||||||
req, err := http.NewRequest("GET", user.UrlPath(), nil)
|
req, err := http.NewRequest("GET", user.UrlPath(), nil)
|
||||||
|
@ -36,7 +36,7 @@ func TestSingleUserUserIndexHandler(t *testing.T) {
|
||||||
|
|
||||||
func TestSingleUserPostHandler(t *testing.T) {
|
func TestSingleUserPostHandler(t *testing.T) {
|
||||||
repo, user := getSingleUserTestRepo()
|
repo, user := getSingleUserTestRepo()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
// Create Request and Response
|
// Create Request and Response
|
||||||
req, err := http.NewRequest("GET", post.UrlPath(), nil)
|
req, err := http.NewRequest("GET", post.UrlPath(), nil)
|
||||||
|
@ -50,7 +50,7 @@ func TestSingleUserPostHandler(t *testing.T) {
|
||||||
|
|
||||||
func TestSingleUserPostMediaHandler(t *testing.T) {
|
func TestSingleUserPostMediaHandler(t *testing.T) {
|
||||||
repo, user := getSingleUserTestRepo()
|
repo, user := getSingleUserTestRepo()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
// Create test media file
|
// Create test media file
|
||||||
path := path.Join(post.MediaDir(), "data.txt")
|
path := path.Join(post.MediaDir(), "data.txt")
|
||||||
|
@ -72,7 +72,7 @@ func TestSingleUserPostMediaHandler(t *testing.T) {
|
||||||
|
|
||||||
func TestHasNoDraftsInList(t *testing.T) {
|
func TestHasNoDraftsInList(t *testing.T) {
|
||||||
repo, user := getSingleUserTestRepo()
|
repo, user := getSingleUserTestRepo()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
content := ""
|
content := ""
|
||||||
content += "---\n"
|
content += "---\n"
|
||||||
content += "title: Articles September 2019\n"
|
content += "title: Articles September 2019\n"
|
||||||
|
@ -102,11 +102,11 @@ func TestHasNoDraftsInList(t *testing.T) {
|
||||||
|
|
||||||
func TestSingleUserUserPostListHandler(t *testing.T) {
|
func TestSingleUserUserPostListHandler(t *testing.T) {
|
||||||
repo, user := getSingleUserTestRepo()
|
repo, user := getSingleUserTestRepo()
|
||||||
user.CreateNewPost(owl.PostMeta{
|
user.CreateNewPostFull(owl.PostMeta{
|
||||||
Title: "post-1",
|
Title: "post-1",
|
||||||
Type: "article",
|
Type: "article",
|
||||||
}, "hi")
|
}, "hi")
|
||||||
user.CreateNewPost(owl.PostMeta{
|
user.CreateNewPostFull(owl.PostMeta{
|
||||||
Title: "post-2",
|
Title: "post-2",
|
||||||
Type: "note",
|
Type: "note",
|
||||||
}, "hi")
|
}, "hi")
|
||||||
|
|
|
@ -38,7 +38,7 @@ func setupWebmentionTest(repo owl.Repository, user owl.User, target string, sour
|
||||||
func TestWebmentionHandleAccepts(t *testing.T) {
|
func TestWebmentionHandleAccepts(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
target := post.FullUrl()
|
target := post.FullUrl()
|
||||||
source := "https://example.com"
|
source := "https://example.com"
|
||||||
|
@ -54,7 +54,7 @@ func TestWebmentionWrittenToPost(t *testing.T) {
|
||||||
|
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
target := post.FullUrl()
|
target := post.FullUrl()
|
||||||
source := "https://example.com"
|
source := "https://example.com"
|
||||||
|
@ -77,7 +77,7 @@ func TestWebmentionSourceValidation(t *testing.T) {
|
||||||
|
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
target := post.FullUrl()
|
target := post.FullUrl()
|
||||||
source := "ftp://example.com"
|
source := "ftp://example.com"
|
||||||
|
@ -92,7 +92,7 @@ func TestWebmentionTargetValidation(t *testing.T) {
|
||||||
|
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
target := "ftp://example.com"
|
target := "ftp://example.com"
|
||||||
source := post.FullUrl()
|
source := post.FullUrl()
|
||||||
|
@ -109,7 +109,7 @@ func TestWebmentionSameTargetAndSource(t *testing.T) {
|
||||||
|
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
target := post.FullUrl()
|
target := post.FullUrl()
|
||||||
source := post.FullUrl()
|
source := post.FullUrl()
|
||||||
|
@ -126,7 +126,7 @@ func TestWebmentionSameTargetAndSource(t *testing.T) {
|
||||||
func TestValidationOfTarget(t *testing.T) {
|
func TestValidationOfTarget(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
target := post.FullUrl()
|
target := post.FullUrl()
|
||||||
target = target[:len(target)-1] + "invalid"
|
target = target[:len(target)-1] + "invalid"
|
||||||
|
@ -141,7 +141,7 @@ func TestValidationOfTarget(t *testing.T) {
|
||||||
func TestAcceptWebmentionForAlias(t *testing.T) {
|
func TestAcceptWebmentionForAlias(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("test-1")
|
user, _ := repo.CreateUser("test-1")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "post-1"}, "")
|
post, _ := user.CreateNewPost("post-1", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test\n"
|
content += "title: Test\n"
|
||||||
|
|
|
@ -46,7 +46,7 @@ var webmentionCmd = &cobra.Command{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
processPost := func(user owl.User, post owl.Post) error {
|
processPost := func(user owl.User, post *owl.Post) error {
|
||||||
println("Webmentions for post: ", post.Title())
|
println("Webmentions for post: ", post.Title())
|
||||||
|
|
||||||
err := post.ScanForLinks()
|
err := post.ScanForLinks()
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
<div class="h-entry">
|
|
||||||
<hgroup>
|
|
||||||
<h1 class="p-name">{{.Title}}</h1>
|
|
||||||
<small>
|
|
||||||
<a class="u-url" href="{{.Post.FullUrl}}">#</a>
|
|
||||||
Published:
|
|
||||||
<time class="dt-published" datetime="{{.Post.Meta.Date}}">
|
|
||||||
{{.Post.Meta.FormattedDate}}
|
|
||||||
</time>
|
|
||||||
{{ if .Post.User.Config.AuthorName }}
|
|
||||||
by
|
|
||||||
<a class="p-author h-card" href="{{.Post.User.FullUrl}}">
|
|
||||||
{{ if .Post.User.AvatarUrl }}
|
|
||||||
<img class="u-photo u-logo" style="height: 1em;" src="{{ .Post.User.AvatarUrl }}"
|
|
||||||
alt="{{ .Post.User.Config.Title }}" />
|
|
||||||
{{ end }}
|
|
||||||
{{.Post.User.Config.AuthorName}}
|
|
||||||
</a>
|
|
||||||
{{ end }}
|
|
||||||
</small>
|
|
||||||
</hgroup>
|
|
||||||
<hr>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
{{ if .Post.Meta.Bookmark.Url }}
|
|
||||||
<p style="font-style: italic;filter: opacity(80%);">
|
|
||||||
Bookmark: <a class="u-bookmark-of h-cite" href="{{.Post.Meta.Bookmark.Url}}">
|
|
||||||
{{ if .Post.Meta.Bookmark.Text }}
|
|
||||||
{{.Post.Meta.Bookmark.Text}}
|
|
||||||
{{ else }}
|
|
||||||
{{.Post.Meta.Bookmark.Url}}
|
|
||||||
{{ end }}
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="e-content">
|
|
||||||
{{.Content}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
{{if .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<h3>
|
|
||||||
Webmentions
|
|
||||||
</h3>
|
|
||||||
<ul>
|
|
||||||
{{range .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<li>
|
|
||||||
<a href="{{.Source}}">
|
|
||||||
{{if .Title}}
|
|
||||||
{{.Title}}
|
|
||||||
{{else}}
|
|
||||||
{{.Source}}
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
|
@ -1,72 +0,0 @@
|
||||||
<div class="h-entry">
|
|
||||||
<hgroup>
|
|
||||||
<h1 class="p-name">{{.Title}}</h1>
|
|
||||||
<small>
|
|
||||||
<a class="u-url" href="{{.Post.FullUrl}}">#</a>
|
|
||||||
Published:
|
|
||||||
<time class="dt-published" datetime="{{.Post.Meta.Date}}">
|
|
||||||
{{.Post.Meta.FormattedDate}}
|
|
||||||
</time>
|
|
||||||
{{ if .Post.User.Config.AuthorName }}
|
|
||||||
by
|
|
||||||
<a class="p-author h-card" href="{{.Post.User.FullUrl}}">
|
|
||||||
{{ if .Post.User.AvatarUrl }}
|
|
||||||
<img class="u-photo u-logo" style="height: 1em;" src="{{ .Post.User.AvatarUrl }}"
|
|
||||||
alt="{{ .Post.User.Config.Title }}" />
|
|
||||||
{{ end }}
|
|
||||||
{{.Post.User.Config.AuthorName}}
|
|
||||||
</a>
|
|
||||||
{{ end }}
|
|
||||||
</small>
|
|
||||||
</hgroup>
|
|
||||||
<hr>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
{{ if .Post.Meta.Reply.Url }}
|
|
||||||
<p style="font-style: italic;filter: opacity(80%);">
|
|
||||||
In reply to: <a class="u-in-reply-to h-cite" rel="in-reply-to" href="{{.Post.Meta.Reply.Url}}">
|
|
||||||
{{ if .Post.Meta.Reply.Text }}
|
|
||||||
{{.Post.Meta.Reply.Text}}
|
|
||||||
{{ else }}
|
|
||||||
{{.Post.Meta.Reply.Url}}
|
|
||||||
{{ end }}
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
{{ if .Post.Meta.Bookmark.Url }}
|
|
||||||
<p style="font-style: italic;filter: opacity(80%);">
|
|
||||||
Bookmark: <a class="u-bookmark-of h-cite" href="{{.Post.Meta.Bookmark.Url}}">
|
|
||||||
{{ if .Post.Meta.Bookmark.Text }}
|
|
||||||
{{.Post.Meta.Bookmark.Text}}
|
|
||||||
{{ else }}
|
|
||||||
{{.Post.Meta.Bookmark.Url}}
|
|
||||||
{{ end }}
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="e-content">
|
|
||||||
{{.Content}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
{{if .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<h3>
|
|
||||||
Webmentions
|
|
||||||
</h3>
|
|
||||||
<ul>
|
|
||||||
{{range .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<li>
|
|
||||||
<a href="{{.Source}}">
|
|
||||||
{{if .Title}}
|
|
||||||
{{.Title}}
|
|
||||||
{{else}}
|
|
||||||
{{.Source}}
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
|
@ -1,47 +0,0 @@
|
||||||
<div class="h-entry">
|
|
||||||
<hgroup>
|
|
||||||
<small>
|
|
||||||
<a class="u-url" href="{{.Post.FullUrl}}">#</a>
|
|
||||||
Published:
|
|
||||||
<time class="dt-published" datetime="{{.Post.Meta.Date}}">
|
|
||||||
{{.Post.Meta.FormattedDate}}
|
|
||||||
</time>
|
|
||||||
{{ if .Post.User.Config.AuthorName }}
|
|
||||||
by
|
|
||||||
<a class="p-author h-card" href="{{.Post.User.FullUrl}}">
|
|
||||||
{{ if .Post.User.AvatarUrl }}
|
|
||||||
<img class="u-photo u-logo" style="height: 1em;" src="{{ .Post.User.AvatarUrl }}"
|
|
||||||
alt="{{ .Post.User.Config.Title }}" />
|
|
||||||
{{ end }}
|
|
||||||
{{.Post.User.Config.AuthorName}}
|
|
||||||
</a>
|
|
||||||
{{ end }}
|
|
||||||
</small>
|
|
||||||
</hgroup>
|
|
||||||
<hr>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<div class="e-content">
|
|
||||||
{{.Content}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
{{if .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<h3>
|
|
||||||
Webmentions
|
|
||||||
</h3>
|
|
||||||
<ul>
|
|
||||||
{{range .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<li>
|
|
||||||
<a href="{{.Source}}">
|
|
||||||
{{if .Title}}
|
|
||||||
{{.Title}}
|
|
||||||
{{else}}
|
|
||||||
{{.Source}}
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
|
@ -1,34 +0,0 @@
|
||||||
<div class="h-entry">
|
|
||||||
<hgroup>
|
|
||||||
<h1 class="p-name">{{.Title}}</h1>
|
|
||||||
<small>
|
|
||||||
<a class="u-url" href="{{.Post.FullUrl}}">#</a>
|
|
||||||
</small>
|
|
||||||
</hgroup>
|
|
||||||
<hr>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<div class="e-content">
|
|
||||||
{{.Content}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
{{if .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<h3>
|
|
||||||
Webmentions
|
|
||||||
</h3>
|
|
||||||
<ul>
|
|
||||||
{{range .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<li>
|
|
||||||
<a href="{{.Source}}">
|
|
||||||
{{if .Title}}
|
|
||||||
{{.Title}}
|
|
||||||
{{else}}
|
|
||||||
{{.Source}}
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
|
@ -1,60 +0,0 @@
|
||||||
<div class="h-entry">
|
|
||||||
<hgroup>
|
|
||||||
<h1 class="p-name">{{.Title}}</h1>
|
|
||||||
<small>
|
|
||||||
<a class="u-url" href="{{.Post.FullUrl}}">#</a>
|
|
||||||
Published:
|
|
||||||
<time class="dt-published" datetime="{{.Post.Meta.Date}}">
|
|
||||||
{{.Post.Meta.FormattedDate}}
|
|
||||||
</time>
|
|
||||||
{{ if .Post.User.Config.AuthorName }}
|
|
||||||
by
|
|
||||||
<a class="p-author h-card" href="{{.Post.User.FullUrl}}">
|
|
||||||
{{ if .Post.User.AvatarUrl }}
|
|
||||||
<img class="u-photo u-logo" style="height: 1em;" src="{{ .Post.User.AvatarUrl }}"
|
|
||||||
alt="{{ .Post.User.Config.Title }}" />
|
|
||||||
{{ end }}
|
|
||||||
{{.Post.User.Config.AuthorName}}
|
|
||||||
</a>
|
|
||||||
{{ end }}
|
|
||||||
</small>
|
|
||||||
</hgroup>
|
|
||||||
<hr>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
{{ if .Post.Meta.Reply.Url }}
|
|
||||||
<p style="font-style: italic;filter: opacity(80%);">
|
|
||||||
In reply to: <a class="u-in-reply-to h-cite" rel="in-reply-to" href="{{.Post.Meta.Reply.Url}}">
|
|
||||||
{{ if .Post.Meta.Reply.Text }}
|
|
||||||
{{.Post.Meta.Reply.Text}}
|
|
||||||
{{ else }}
|
|
||||||
{{.Post.Meta.Reply.Url}}
|
|
||||||
{{ end }}
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="e-content">
|
|
||||||
{{.Content}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
{{if .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<h3>
|
|
||||||
Webmentions
|
|
||||||
</h3>
|
|
||||||
<ul>
|
|
||||||
{{range .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<li>
|
|
||||||
<a href="{{.Source}}">
|
|
||||||
{{if .Title}}
|
|
||||||
{{.Title}}
|
|
||||||
{{else}}
|
|
||||||
{{.Source}}
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
|
@ -1,72 +0,0 @@
|
||||||
<div class="h-entry">
|
|
||||||
<hgroup>
|
|
||||||
<h1 class="p-name">{{.Title}}</h1>
|
|
||||||
<small>
|
|
||||||
<a class="u-url" href="{{.Post.FullUrl}}">#</a>
|
|
||||||
Published:
|
|
||||||
<time class="dt-published" datetime="{{.Post.Meta.Date}}">
|
|
||||||
{{.Post.Meta.FormattedDate}}
|
|
||||||
</time>
|
|
||||||
{{ if .Post.User.Config.AuthorName }}
|
|
||||||
by
|
|
||||||
<a class="p-author h-card" href="{{.Post.User.FullUrl}}">
|
|
||||||
{{ if .Post.User.AvatarUrl }}
|
|
||||||
<img class="u-photo u-logo" style="height: 1em;" src="{{ .Post.User.AvatarUrl }}"
|
|
||||||
alt="{{ .Post.User.Config.Title }}" />
|
|
||||||
{{ end }}
|
|
||||||
{{.Post.User.Config.AuthorName}}
|
|
||||||
</a>
|
|
||||||
{{ end }}
|
|
||||||
</small>
|
|
||||||
</hgroup>
|
|
||||||
<hr>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
{{ if .Post.Meta.Reply.Url }}
|
|
||||||
<p style="font-style: italic;filter: opacity(80%);">
|
|
||||||
In reply to: <a class="u-in-reply-to h-cite" rel="in-reply-to" href="{{.Post.Meta.Reply.Url}}">
|
|
||||||
{{ if .Post.Meta.Reply.Text }}
|
|
||||||
{{.Post.Meta.Reply.Text}}
|
|
||||||
{{ else }}
|
|
||||||
{{.Post.Meta.Reply.Url}}
|
|
||||||
{{ end }}
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
{{ if .Post.Meta.Bookmark.Url }}
|
|
||||||
<p style="font-style: italic;filter: opacity(80%);">
|
|
||||||
Bookmark: <a class="u-bookmark-of h-cite" href="{{.Post.Meta.Bookmark.Url}}">
|
|
||||||
{{ if .Post.Meta.Bookmark.Text }}
|
|
||||||
{{.Post.Meta.Bookmark.Text}}
|
|
||||||
{{ else }}
|
|
||||||
{{.Post.Meta.Bookmark.Url}}
|
|
||||||
{{ end }}
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="e-content">
|
|
||||||
{{.Content}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
{{if .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<h3>
|
|
||||||
Webmentions
|
|
||||||
</h3>
|
|
||||||
<ul>
|
|
||||||
{{range .Post.ApprovedIncomingWebmentions}}
|
|
||||||
<li>
|
|
||||||
<a href="{{.Source}}">
|
|
||||||
{{if .Title}}
|
|
||||||
{{.Title}}
|
|
||||||
{{else}}
|
|
||||||
{{.Source}}
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
104
post.go
104
post.go
|
@ -17,7 +17,7 @@ import (
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GenericPost struct {
|
type Post struct {
|
||||||
user *User
|
user *User
|
||||||
id string
|
id string
|
||||||
metaLoaded bool
|
metaLoaded bool
|
||||||
|
@ -25,49 +25,11 @@ type GenericPost struct {
|
||||||
wmLock sync.Mutex
|
wmLock sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) TemplateDir() string {
|
type Reply struct {
|
||||||
return post.Meta().Type
|
|
||||||
}
|
|
||||||
|
|
||||||
type Post interface {
|
|
||||||
TemplateDir() string
|
|
||||||
|
|
||||||
// Actual Data
|
|
||||||
User() *User
|
|
||||||
Id() string
|
|
||||||
Title() string
|
|
||||||
Meta() PostMeta
|
|
||||||
Content() []byte
|
|
||||||
RenderedContent() string
|
|
||||||
Aliases() []string
|
|
||||||
|
|
||||||
// Filesystem
|
|
||||||
Dir() string
|
|
||||||
MediaDir() string
|
|
||||||
ContentFile() string
|
|
||||||
|
|
||||||
// Urls
|
|
||||||
UrlPath() string
|
|
||||||
FullUrl() string
|
|
||||||
UrlMediaPath(filename string) string
|
|
||||||
|
|
||||||
// Webmentions Support
|
|
||||||
IncomingWebmentions() []WebmentionIn
|
|
||||||
OutgoingWebmentions() []WebmentionOut
|
|
||||||
PersistIncomingWebmention(webmention WebmentionIn) error
|
|
||||||
PersistOutgoingWebmention(webmention *WebmentionOut) error
|
|
||||||
AddIncomingWebmention(source string) error
|
|
||||||
EnrichWebmention(webmention WebmentionIn) error
|
|
||||||
ApprovedIncomingWebmentions() []WebmentionIn
|
|
||||||
ScanForLinks() error
|
|
||||||
SendWebmention(webmention WebmentionOut) error
|
|
||||||
}
|
|
||||||
|
|
||||||
type ReplyData struct {
|
|
||||||
Url string `yaml:"url"`
|
Url string `yaml:"url"`
|
||||||
Text string `yaml:"text"`
|
Text string `yaml:"text"`
|
||||||
}
|
}
|
||||||
type BookmarkData struct {
|
type Bookmark struct {
|
||||||
Url string `yaml:"url"`
|
Url string `yaml:"url"`
|
||||||
Text string `yaml:"text"`
|
Text string `yaml:"text"`
|
||||||
}
|
}
|
||||||
|
@ -79,8 +41,8 @@ type PostMeta struct {
|
||||||
Aliases []string `yaml:"aliases"`
|
Aliases []string `yaml:"aliases"`
|
||||||
Date time.Time `yaml:"date"`
|
Date time.Time `yaml:"date"`
|
||||||
Draft bool `yaml:"draft"`
|
Draft bool `yaml:"draft"`
|
||||||
Reply ReplyData `yaml:"reply"`
|
Reply Reply `yaml:"reply"`
|
||||||
Bookmark BookmarkData `yaml:"bookmark"`
|
Bookmark Bookmark `yaml:"bookmark"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pm PostMeta) FormattedDate() string {
|
func (pm PostMeta) FormattedDate() string {
|
||||||
|
@ -94,8 +56,8 @@ func (pm *PostMeta) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||||
Description string `yaml:"description"`
|
Description string `yaml:"description"`
|
||||||
Aliases []string `yaml:"aliases"`
|
Aliases []string `yaml:"aliases"`
|
||||||
Draft bool `yaml:"draft"`
|
Draft bool `yaml:"draft"`
|
||||||
Reply ReplyData `yaml:"reply"`
|
Reply Reply `yaml:"reply"`
|
||||||
Bookmark BookmarkData `yaml:"bookmark"`
|
Bookmark Bookmark `yaml:"bookmark"`
|
||||||
}
|
}
|
||||||
type S struct {
|
type S struct {
|
||||||
Date string `yaml:"date"`
|
Date string `yaml:"date"`
|
||||||
|
@ -155,64 +117,64 @@ type PostWebmetions struct {
|
||||||
Outgoing []WebmentionOut `ymal:"outgoing"`
|
Outgoing []WebmentionOut `ymal:"outgoing"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) Id() string {
|
func (post *Post) Id() string {
|
||||||
return post.id
|
return post.id
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) User() *User {
|
func (post *Post) User() *User {
|
||||||
return post.user
|
return post.user
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) Dir() string {
|
func (post *Post) Dir() string {
|
||||||
return path.Join(post.user.Dir(), "public", post.id)
|
return path.Join(post.user.Dir(), "public", post.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) IncomingWebmentionsFile() string {
|
func (post *Post) IncomingWebmentionsFile() string {
|
||||||
return path.Join(post.Dir(), "incoming_webmentions.yml")
|
return path.Join(post.Dir(), "incoming_webmentions.yml")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) OutgoingWebmentionsFile() string {
|
func (post *Post) OutgoingWebmentionsFile() string {
|
||||||
return path.Join(post.Dir(), "outgoing_webmentions.yml")
|
return path.Join(post.Dir(), "outgoing_webmentions.yml")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) MediaDir() string {
|
func (post *Post) MediaDir() string {
|
||||||
return path.Join(post.Dir(), "media")
|
return path.Join(post.Dir(), "media")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) UrlPath() string {
|
func (post *Post) UrlPath() string {
|
||||||
return post.user.UrlPath() + "posts/" + post.id + "/"
|
return post.user.UrlPath() + "posts/" + post.id + "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) FullUrl() string {
|
func (post *Post) FullUrl() string {
|
||||||
return post.user.FullUrl() + "posts/" + post.id + "/"
|
return post.user.FullUrl() + "posts/" + post.id + "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) UrlMediaPath(filename string) string {
|
func (post *Post) UrlMediaPath(filename string) string {
|
||||||
return post.UrlPath() + "media/" + filename
|
return post.UrlPath() + "media/" + filename
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) Title() string {
|
func (post *Post) Title() string {
|
||||||
return post.Meta().Title
|
return post.Meta().Title
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) ContentFile() string {
|
func (post *Post) ContentFile() string {
|
||||||
return path.Join(post.Dir(), "index.md")
|
return path.Join(post.Dir(), "index.md")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) Meta() PostMeta {
|
func (post *Post) Meta() PostMeta {
|
||||||
if !post.metaLoaded {
|
if !post.metaLoaded {
|
||||||
post.LoadMeta()
|
post.LoadMeta()
|
||||||
}
|
}
|
||||||
return post.meta
|
return post.meta
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) Content() []byte {
|
func (post *Post) Content() []byte {
|
||||||
// read file
|
// read file
|
||||||
data, _ := os.ReadFile(post.ContentFile())
|
data, _ := os.ReadFile(post.ContentFile())
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) RenderedContent() string {
|
func (post *Post) RenderedContent() string {
|
||||||
data := post.Content()
|
data := post.Content()
|
||||||
|
|
||||||
// trim yaml block
|
// trim yaml block
|
||||||
|
@ -254,18 +216,16 @@ func (post *GenericPost) RenderedContent() string {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) Aliases() []string {
|
func (post *Post) Aliases() []string {
|
||||||
return post.Meta().Aliases
|
return post.Meta().Aliases
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) LoadMeta() error {
|
func (post *Post) LoadMeta() error {
|
||||||
data := post.Content()
|
data := post.Content()
|
||||||
|
|
||||||
// get yaml metadata block
|
// get yaml metadata block
|
||||||
meta := PostMeta{}
|
meta := PostMeta{}
|
||||||
trimmedData := bytes.TrimSpace(data)
|
trimmedData := bytes.TrimSpace(data)
|
||||||
// ensure that data ends with a newline
|
|
||||||
trimmedData = append(trimmedData, []byte("\n")...)
|
|
||||||
// check first line is ---
|
// check first line is ---
|
||||||
if string(trimmedData[0:4]) == "---\n" {
|
if string(trimmedData[0:4]) == "---\n" {
|
||||||
trimmedData = trimmedData[4:]
|
trimmedData = trimmedData[4:]
|
||||||
|
@ -284,7 +244,7 @@ func (post *GenericPost) LoadMeta() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) IncomingWebmentions() []WebmentionIn {
|
func (post *Post) IncomingWebmentions() []WebmentionIn {
|
||||||
// return parsed webmentions
|
// return parsed webmentions
|
||||||
fileName := post.IncomingWebmentionsFile()
|
fileName := post.IncomingWebmentionsFile()
|
||||||
if !fileExists(fileName) {
|
if !fileExists(fileName) {
|
||||||
|
@ -297,7 +257,7 @@ func (post *GenericPost) IncomingWebmentions() []WebmentionIn {
|
||||||
return webmentions
|
return webmentions
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) OutgoingWebmentions() []WebmentionOut {
|
func (post *Post) OutgoingWebmentions() []WebmentionOut {
|
||||||
// return parsed webmentions
|
// return parsed webmentions
|
||||||
fileName := post.OutgoingWebmentionsFile()
|
fileName := post.OutgoingWebmentionsFile()
|
||||||
if !fileExists(fileName) {
|
if !fileExists(fileName) {
|
||||||
|
@ -311,7 +271,7 @@ func (post *GenericPost) OutgoingWebmentions() []WebmentionOut {
|
||||||
}
|
}
|
||||||
|
|
||||||
// PersistWebmentionOutgoing persists incoming webmention
|
// PersistWebmentionOutgoing persists incoming webmention
|
||||||
func (post *GenericPost) PersistIncomingWebmention(webmention WebmentionIn) error {
|
func (post *Post) PersistIncomingWebmention(webmention WebmentionIn) error {
|
||||||
post.wmLock.Lock()
|
post.wmLock.Lock()
|
||||||
defer post.wmLock.Unlock()
|
defer post.wmLock.Unlock()
|
||||||
|
|
||||||
|
@ -340,7 +300,7 @@ func (post *GenericPost) PersistIncomingWebmention(webmention WebmentionIn) erro
|
||||||
}
|
}
|
||||||
|
|
||||||
// PersistOutgoingWebmention persists a webmention to the webmention file.
|
// PersistOutgoingWebmention persists a webmention to the webmention file.
|
||||||
func (post *GenericPost) PersistOutgoingWebmention(webmention *WebmentionOut) error {
|
func (post *Post) PersistOutgoingWebmention(webmention *WebmentionOut) error {
|
||||||
post.wmLock.Lock()
|
post.wmLock.Lock()
|
||||||
defer post.wmLock.Unlock()
|
defer post.wmLock.Unlock()
|
||||||
|
|
||||||
|
@ -368,7 +328,7 @@ func (post *GenericPost) PersistOutgoingWebmention(webmention *WebmentionOut) er
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) AddIncomingWebmention(source string) error {
|
func (post *Post) AddIncomingWebmention(source string) error {
|
||||||
// Check if file already exists
|
// Check if file already exists
|
||||||
wm := WebmentionIn{
|
wm := WebmentionIn{
|
||||||
Source: source,
|
Source: source,
|
||||||
|
@ -380,7 +340,7 @@ func (post *GenericPost) AddIncomingWebmention(source string) error {
|
||||||
return post.PersistIncomingWebmention(wm)
|
return post.PersistIncomingWebmention(wm)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) EnrichWebmention(webmention WebmentionIn) error {
|
func (post *Post) EnrichWebmention(webmention WebmentionIn) error {
|
||||||
resp, err := post.user.repo.HttpClient.Get(webmention.Source)
|
resp, err := post.user.repo.HttpClient.Get(webmention.Source)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
entry, err := post.user.repo.Parser.ParseHEntry(resp)
|
entry, err := post.user.repo.Parser.ParseHEntry(resp)
|
||||||
|
@ -392,7 +352,7 @@ func (post *GenericPost) EnrichWebmention(webmention WebmentionIn) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) ApprovedIncomingWebmentions() []WebmentionIn {
|
func (post *Post) ApprovedIncomingWebmentions() []WebmentionIn {
|
||||||
webmentions := post.IncomingWebmentions()
|
webmentions := post.IncomingWebmentions()
|
||||||
approved := []WebmentionIn{}
|
approved := []WebmentionIn{}
|
||||||
for _, webmention := range webmentions {
|
for _, webmention := range webmentions {
|
||||||
|
@ -410,7 +370,7 @@ func (post *GenericPost) ApprovedIncomingWebmentions() []WebmentionIn {
|
||||||
|
|
||||||
// ScanForLinks scans the post content for links and adds them to the
|
// ScanForLinks scans the post content for links and adds them to the
|
||||||
// `status.yml` file for the post. The links are not scanned by this function.
|
// `status.yml` file for the post. The links are not scanned by this function.
|
||||||
func (post *GenericPost) ScanForLinks() error {
|
func (post *Post) ScanForLinks() error {
|
||||||
// this could be done in markdown parsing, but I don't want to
|
// this could be done in markdown parsing, but I don't want to
|
||||||
// rely on goldmark for this (yet)
|
// rely on goldmark for this (yet)
|
||||||
postHtml := post.RenderedContent()
|
postHtml := post.RenderedContent()
|
||||||
|
@ -427,7 +387,7 @@ func (post *GenericPost) ScanForLinks() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *GenericPost) SendWebmention(webmention WebmentionOut) error {
|
func (post *Post) SendWebmention(webmention WebmentionOut) error {
|
||||||
defer post.PersistOutgoingWebmention(&webmention)
|
defer post.PersistOutgoingWebmention(&webmention)
|
||||||
|
|
||||||
// if last scan is less than 7 days ago, don't send webmention
|
// if last scan is less than 7 days ago, don't send webmention
|
||||||
|
|
58
post_test.go
58
post_test.go
|
@ -14,49 +14,49 @@ import (
|
||||||
|
|
||||||
func TestCanGetPostTitle(t *testing.T) {
|
func TestCanGetPostTitle(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
result := post.Title()
|
result := post.Title()
|
||||||
assertions.AssertEqual(t, result, "testpost")
|
assertions.AssertEqual(t, result, "testpost")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMediaDir(t *testing.T) {
|
func TestMediaDir(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
result := post.MediaDir()
|
result := post.MediaDir()
|
||||||
assertions.AssertEqual(t, result, path.Join(post.Dir(), "media"))
|
assertions.AssertEqual(t, result, path.Join(post.Dir(), "media"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPostUrlPath(t *testing.T) {
|
func TestPostUrlPath(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
expected := "/user/" + user.Name() + "/posts/" + post.Id() + "/"
|
expected := "/user/" + user.Name() + "/posts/" + post.Id() + "/"
|
||||||
assertions.AssertEqual(t, post.UrlPath(), expected)
|
assertions.AssertEqual(t, post.UrlPath(), expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPostFullUrl(t *testing.T) {
|
func TestPostFullUrl(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
expected := "http://localhost:8080/user/" + user.Name() + "/posts/" + post.Id() + "/"
|
expected := "http://localhost:8080/user/" + user.Name() + "/posts/" + post.Id() + "/"
|
||||||
assertions.AssertEqual(t, post.FullUrl(), expected)
|
assertions.AssertEqual(t, post.FullUrl(), expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPostUrlMediaPath(t *testing.T) {
|
func TestPostUrlMediaPath(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
expected := "/user/" + user.Name() + "/posts/" + post.Id() + "/media/data.png"
|
expected := "/user/" + user.Name() + "/posts/" + post.Id() + "/media/data.png"
|
||||||
assertions.AssertEqual(t, post.UrlMediaPath("data.png"), expected)
|
assertions.AssertEqual(t, post.UrlMediaPath("data.png"), expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPostUrlMediaPathWithSubDir(t *testing.T) {
|
func TestPostUrlMediaPathWithSubDir(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
expected := "/user/" + user.Name() + "/posts/" + post.Id() + "/media/foo/data.png"
|
expected := "/user/" + user.Name() + "/posts/" + post.Id() + "/media/foo/data.png"
|
||||||
assertions.AssertEqual(t, post.UrlMediaPath("foo/data.png"), expected)
|
assertions.AssertEqual(t, post.UrlMediaPath("foo/data.png"), expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDraftInMetaData(t *testing.T) {
|
func TestDraftInMetaData(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: test\n"
|
content += "title: test\n"
|
||||||
content += "draft: true\n"
|
content += "draft: true\n"
|
||||||
|
@ -71,7 +71,7 @@ func TestDraftInMetaData(t *testing.T) {
|
||||||
func TestNoRawHTMLIfDisallowedByRepo(t *testing.T) {
|
func TestNoRawHTMLIfDisallowedByRepo(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: test\n"
|
content += "title: test\n"
|
||||||
content += "draft: true\n"
|
content += "draft: true\n"
|
||||||
|
@ -86,7 +86,7 @@ func TestNoRawHTMLIfDisallowedByRepo(t *testing.T) {
|
||||||
func TestRawHTMLIfAllowedByRepo(t *testing.T) {
|
func TestRawHTMLIfAllowedByRepo(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{AllowRawHtml: true})
|
repo := getTestRepo(owl.RepoConfig{AllowRawHtml: true})
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: test\n"
|
content += "title: test\n"
|
||||||
content += "draft: true\n"
|
content += "draft: true\n"
|
||||||
|
@ -98,10 +98,10 @@ func TestRawHTMLIfAllowedByRepo(t *testing.T) {
|
||||||
assertions.AssertContains(t, html, "<script>")
|
assertions.AssertContains(t, html, "<script>")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMeta(t *testing.T) {
|
func TestLoadMeta(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{AllowRawHtml: true})
|
repo := getTestRepo(owl.RepoConfig{AllowRawHtml: true})
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: test\n"
|
content += "title: test\n"
|
||||||
|
@ -114,6 +114,10 @@ func TestMeta(t *testing.T) {
|
||||||
content += "<script>alert('foo')</script>\n"
|
content += "<script>alert('foo')</script>\n"
|
||||||
os.WriteFile(post.ContentFile(), []byte(content), 0644)
|
os.WriteFile(post.ContentFile(), []byte(content), 0644)
|
||||||
|
|
||||||
|
err := post.LoadMeta()
|
||||||
|
|
||||||
|
assertions.AssertNoError(t, err, "Error loading meta")
|
||||||
|
|
||||||
assertions.AssertEqual(t, post.Meta().Title, "test")
|
assertions.AssertEqual(t, post.Meta().Title, "test")
|
||||||
assertions.AssertLen(t, post.Meta().Aliases, 1)
|
assertions.AssertLen(t, post.Meta().Aliases, 1)
|
||||||
assertions.AssertEqual(t, post.Meta().Draft, true)
|
assertions.AssertEqual(t, post.Meta().Draft, true)
|
||||||
|
@ -128,7 +132,7 @@ func TestMeta(t *testing.T) {
|
||||||
func TestPersistIncomingWebmention(t *testing.T) {
|
func TestPersistIncomingWebmention(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
webmention := owl.WebmentionIn{
|
webmention := owl.WebmentionIn{
|
||||||
Source: "http://example.com/source",
|
Source: "http://example.com/source",
|
||||||
}
|
}
|
||||||
|
@ -144,7 +148,7 @@ func TestAddIncomingWebmentionCreatesFile(t *testing.T) {
|
||||||
repo.HttpClient = &mocks.MockHttpClient{}
|
repo.HttpClient = &mocks.MockHttpClient{}
|
||||||
repo.Parser = &mocks.MockHtmlParser{}
|
repo.Parser = &mocks.MockHtmlParser{}
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
err := post.AddIncomingWebmention("https://example.com")
|
err := post.AddIncomingWebmention("https://example.com")
|
||||||
assertions.AssertNoError(t, err, "Error adding webmention")
|
assertions.AssertNoError(t, err, "Error adding webmention")
|
||||||
|
@ -158,7 +162,7 @@ func TestAddIncomingWebmentionNotOverwritingWebmention(t *testing.T) {
|
||||||
repo.HttpClient = &mocks.MockHttpClient{}
|
repo.HttpClient = &mocks.MockHttpClient{}
|
||||||
repo.Parser = &mocks.MockHtmlParser{}
|
repo.Parser = &mocks.MockHtmlParser{}
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
post.PersistIncomingWebmention(owl.WebmentionIn{
|
post.PersistIncomingWebmention(owl.WebmentionIn{
|
||||||
Source: "https://example.com",
|
Source: "https://example.com",
|
||||||
|
@ -178,7 +182,7 @@ func TestEnrichAddsTitle(t *testing.T) {
|
||||||
repo.HttpClient = &mocks.MockHttpClient{}
|
repo.HttpClient = &mocks.MockHttpClient{}
|
||||||
repo.Parser = &mocks.MockHtmlParser{}
|
repo.Parser = &mocks.MockHtmlParser{}
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
post.AddIncomingWebmention("https://example.com")
|
post.AddIncomingWebmention("https://example.com")
|
||||||
post.EnrichWebmention(owl.WebmentionIn{Source: "https://example.com"})
|
post.EnrichWebmention(owl.WebmentionIn{Source: "https://example.com"})
|
||||||
|
@ -191,7 +195,7 @@ func TestEnrichAddsTitle(t *testing.T) {
|
||||||
func TestApprovedIncomingWebmentions(t *testing.T) {
|
func TestApprovedIncomingWebmentions(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
webmention := owl.WebmentionIn{
|
webmention := owl.WebmentionIn{
|
||||||
Source: "http://example.com/source",
|
Source: "http://example.com/source",
|
||||||
ApprovalStatus: "approved",
|
ApprovalStatus: "approved",
|
||||||
|
@ -228,7 +232,7 @@ func TestApprovedIncomingWebmentions(t *testing.T) {
|
||||||
func TestScanningForLinks(t *testing.T) {
|
func TestScanningForLinks(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: test\n"
|
content += "title: test\n"
|
||||||
|
@ -247,7 +251,7 @@ func TestScanningForLinks(t *testing.T) {
|
||||||
func TestScanningForLinksDoesNotAddDuplicates(t *testing.T) {
|
func TestScanningForLinksDoesNotAddDuplicates(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: test\n"
|
content += "title: test\n"
|
||||||
|
@ -269,7 +273,7 @@ func TestScanningForLinksDoesNotAddDuplicates(t *testing.T) {
|
||||||
func TestScanningForLinksDoesAddReplyUrl(t *testing.T) {
|
func TestScanningForLinksDoesAddReplyUrl(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: test\n"
|
content += "title: test\n"
|
||||||
|
@ -292,7 +296,7 @@ func TestCanSendWebmention(t *testing.T) {
|
||||||
repo.HttpClient = &mocks.MockHttpClient{}
|
repo.HttpClient = &mocks.MockHttpClient{}
|
||||||
repo.Parser = &mocks.MockHtmlParser{}
|
repo.Parser = &mocks.MockHtmlParser{}
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
webmention := owl.WebmentionOut{
|
webmention := owl.WebmentionOut{
|
||||||
Target: "http://example.com",
|
Target: "http://example.com",
|
||||||
|
@ -313,7 +317,7 @@ func TestSendWebmentionOnlyScansOncePerWeek(t *testing.T) {
|
||||||
repo.HttpClient = &mocks.MockHttpClient{}
|
repo.HttpClient = &mocks.MockHttpClient{}
|
||||||
repo.Parser = &mocks.MockHtmlParser{}
|
repo.Parser = &mocks.MockHtmlParser{}
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
webmention := owl.WebmentionOut{
|
webmention := owl.WebmentionOut{
|
||||||
Target: "http://example.com",
|
Target: "http://example.com",
|
||||||
|
@ -338,7 +342,7 @@ func TestSendingMultipleWebmentions(t *testing.T) {
|
||||||
repo.HttpClient = &mocks.MockHttpClient{}
|
repo.HttpClient = &mocks.MockHttpClient{}
|
||||||
repo.Parser = &mocks.MockHtmlParser{}
|
repo.Parser = &mocks.MockHtmlParser{}
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
wg := sync.WaitGroup{}
|
wg := sync.WaitGroup{}
|
||||||
wg.Add(20)
|
wg.Add(20)
|
||||||
|
@ -365,7 +369,7 @@ func TestReceivingMultipleWebmentions(t *testing.T) {
|
||||||
repo.HttpClient = &mocks.MockHttpClient{}
|
repo.HttpClient = &mocks.MockHttpClient{}
|
||||||
repo.Parser = &mocks.MockHtmlParser{}
|
repo.Parser = &mocks.MockHtmlParser{}
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
wg := sync.WaitGroup{}
|
wg := sync.WaitGroup{}
|
||||||
wg.Add(20)
|
wg.Add(20)
|
||||||
|
@ -390,7 +394,7 @@ func TestSendingAndReceivingMultipleWebmentions(t *testing.T) {
|
||||||
repo.HttpClient = &mocks.MockHttpClient{}
|
repo.HttpClient = &mocks.MockHttpClient{}
|
||||||
repo.Parser = &mocks.MockHtmlParser{}
|
repo.Parser = &mocks.MockHtmlParser{}
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
wg := sync.WaitGroup{}
|
wg := sync.WaitGroup{}
|
||||||
wg.Add(40)
|
wg.Add(40)
|
||||||
|
@ -429,7 +433,7 @@ func TestComplexParallelWebmentions(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
wg := sync.WaitGroup{}
|
wg := sync.WaitGroup{}
|
||||||
wg.Add(60)
|
wg.Add(60)
|
||||||
|
@ -464,7 +468,7 @@ func TestComplexParallelWebmentions(t *testing.T) {
|
||||||
func TestPostWithoutContent(t *testing.T) {
|
func TestPostWithoutContent(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser("testuser")
|
user, _ := repo.CreateUser("testuser")
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{}, "")
|
post, _ := user.CreateNewPostFull(owl.PostMeta{}, "")
|
||||||
|
|
||||||
result := post.RenderedContent()
|
result := post.RenderedContent()
|
||||||
assertions.AssertEqual(t, result, "")
|
assertions.AssertEqual(t, result, "")
|
||||||
|
@ -482,7 +486,7 @@ func TestPostWithoutContent(t *testing.T) {
|
||||||
// },
|
// },
|
||||||
// }
|
// }
|
||||||
// user, _ := repo.CreateUser("testuser")
|
// user, _ := repo.CreateUser("testuser")
|
||||||
// post, _ := user.CreateNewPostFull(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
// post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
// wg := sync.WaitGroup{}
|
// wg := sync.WaitGroup{}
|
||||||
// wg.Add(40)
|
// wg.Add(40)
|
||||||
|
|
16
renderer.go
16
renderer.go
|
@ -3,7 +3,6 @@ package owl
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"fmt"
|
|
||||||
"html/template"
|
"html/template"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
@ -18,7 +17,7 @@ type PageContent struct {
|
||||||
|
|
||||||
type PostRenderData struct {
|
type PostRenderData struct {
|
||||||
Title string
|
Title string
|
||||||
Post Post
|
Post *Post
|
||||||
Content template.HTML
|
Content template.HTML
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,26 +118,23 @@ func renderIntoBaseTemplate(user User, data PageContent) (string, error) {
|
||||||
return html.String(), err
|
return html.String(), err
|
||||||
}
|
}
|
||||||
|
|
||||||
func renderPostContent(post Post) (string, error) {
|
func renderPostContent(post *Post) (string, error) {
|
||||||
buf := post.RenderedContent()
|
buf := post.RenderedContent()
|
||||||
postHtml, err := renderEmbedTemplate(
|
postHtml, err := renderEmbedTemplate("embed/post.html", PostRenderData{
|
||||||
fmt.Sprintf("embed/%s/detail.html", post.TemplateDir()),
|
|
||||||
PostRenderData{
|
|
||||||
Title: post.Title(),
|
Title: post.Title(),
|
||||||
Post: post,
|
Post: post,
|
||||||
Content: template.HTML(buf),
|
Content: template.HTML(buf),
|
||||||
},
|
})
|
||||||
)
|
|
||||||
return postHtml, err
|
return postHtml, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func RenderPost(post Post) (string, error) {
|
func RenderPost(post *Post) (string, error) {
|
||||||
postHtml, err := renderPostContent(post)
|
postHtml, err := renderPostContent(post)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return renderIntoBaseTemplate(*post.User(), PageContent{
|
return renderIntoBaseTemplate(*post.user, PageContent{
|
||||||
Title: post.Title(),
|
Title: post.Title(),
|
||||||
Description: post.Meta().Description,
|
Description: post.Meta().Description,
|
||||||
Content: template.HTML(postHtml),
|
Content: template.HTML(postHtml),
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
|
|
||||||
func TestCanRenderPost(t *testing.T) {
|
func TestCanRenderPost(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
result, err := owl.RenderPost(post)
|
result, err := owl.RenderPost(post)
|
||||||
|
|
||||||
assertions.AssertNoError(t, err, "Error rendering post")
|
assertions.AssertNoError(t, err, "Error rendering post")
|
||||||
|
@ -28,7 +28,7 @@ func TestRenderOneMe(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
user.SetConfig(config)
|
user.SetConfig(config)
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
result, err := owl.RenderPost(post)
|
result, err := owl.RenderPost(post)
|
||||||
|
|
||||||
assertions.AssertNoError(t, err, "Error rendering post")
|
assertions.AssertNoError(t, err, "Error rendering post")
|
||||||
|
@ -49,7 +49,7 @@ func TestRenderTwoMe(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
user.SetConfig(config)
|
user.SetConfig(config)
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
result, err := owl.RenderPost(post)
|
result, err := owl.RenderPost(post)
|
||||||
|
|
||||||
assertions.AssertNoError(t, err, "Error rendering post")
|
assertions.AssertNoError(t, err, "Error rendering post")
|
||||||
|
@ -60,7 +60,7 @@ func TestRenderTwoMe(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderPostHEntry(t *testing.T) {
|
func TestRenderPostHEntry(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
result, _ := owl.RenderPost(post)
|
result, _ := owl.RenderPost(post)
|
||||||
assertions.AssertContains(t, result, "class=\"h-entry\"")
|
assertions.AssertContains(t, result, "class=\"h-entry\"")
|
||||||
assertions.AssertContains(t, result, "class=\"p-name\"")
|
assertions.AssertContains(t, result, "class=\"p-name\"")
|
||||||
|
@ -70,7 +70,7 @@ func TestRenderPostHEntry(t *testing.T) {
|
||||||
|
|
||||||
func TestRendererUsesBaseTemplate(t *testing.T) {
|
func TestRendererUsesBaseTemplate(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
result, err := owl.RenderPost(post)
|
result, err := owl.RenderPost(post)
|
||||||
|
|
||||||
assertions.AssertNoError(t, err, "Error rendering post")
|
assertions.AssertNoError(t, err, "Error rendering post")
|
||||||
|
@ -79,8 +79,8 @@ func TestRendererUsesBaseTemplate(t *testing.T) {
|
||||||
|
|
||||||
func TestCanRenderPostList(t *testing.T) {
|
func TestCanRenderPostList(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost1"}, "")
|
user.CreateNewPost("testpost1", false)
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost2"}, "")
|
user.CreateNewPost("testpost2", false)
|
||||||
result, err := owl.RenderPostList(user, &owl.PostList{
|
result, err := owl.RenderPostList(user, &owl.PostList{
|
||||||
Id: "testlist",
|
Id: "testlist",
|
||||||
Title: "Test List",
|
Title: "Test List",
|
||||||
|
@ -95,8 +95,8 @@ func TestCanRenderPostList(t *testing.T) {
|
||||||
|
|
||||||
func TestCanRenderPostListNotIncludeOther(t *testing.T) {
|
func TestCanRenderPostListNotIncludeOther(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Title: "testpost1", Type: "article"}, "testpost1")
|
user.CreateNewPostFull(owl.PostMeta{Title: "testpost1", Type: "article"}, "testpost1")
|
||||||
user.CreateNewPost(owl.PostMeta{Title: "testpost2", Type: "note"}, "testpost2")
|
user.CreateNewPostFull(owl.PostMeta{Title: "testpost2", Type: "note"}, "testpost2")
|
||||||
result, _ := owl.RenderPostList(user, &owl.PostList{
|
result, _ := owl.RenderPostList(user, &owl.PostList{
|
||||||
Id: "testlist",
|
Id: "testlist",
|
||||||
Title: "Test List",
|
Title: "Test List",
|
||||||
|
@ -110,9 +110,9 @@ func TestCanRenderPostListNotIncludeOther(t *testing.T) {
|
||||||
|
|
||||||
func TestCanRenderPostListNotIncludeMultiple(t *testing.T) {
|
func TestCanRenderPostListNotIncludeMultiple(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Title: "testpost1", Type: "article"}, "testpost1")
|
user.CreateNewPostFull(owl.PostMeta{Title: "testpost1", Type: "article"}, "testpost1")
|
||||||
user.CreateNewPost(owl.PostMeta{Title: "testpost2", Type: "note"}, "testpost2")
|
user.CreateNewPostFull(owl.PostMeta{Title: "testpost2", Type: "note"}, "testpost2")
|
||||||
user.CreateNewPost(owl.PostMeta{Title: "testpost3", Type: "recipe"}, "testpost3")
|
user.CreateNewPostFull(owl.PostMeta{Title: "testpost3", Type: "recipe"}, "testpost3")
|
||||||
result, _ := owl.RenderPostList(user, &owl.PostList{
|
result, _ := owl.RenderPostList(user, &owl.PostList{
|
||||||
Id: "testlist",
|
Id: "testlist",
|
||||||
Title: "Test List",
|
Title: "Test List",
|
||||||
|
@ -127,8 +127,8 @@ func TestCanRenderPostListNotIncludeMultiple(t *testing.T) {
|
||||||
|
|
||||||
func TestCanRenderIndexPage(t *testing.T) {
|
func TestCanRenderIndexPage(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost1"}, "")
|
user.CreateNewPost("testpost1", false)
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost2"}, "")
|
user.CreateNewPost("testpost2", false)
|
||||||
result, _ := owl.RenderIndexPage(user)
|
result, _ := owl.RenderIndexPage(user)
|
||||||
assertions.AssertContains(t, result, "testpost1")
|
assertions.AssertContains(t, result, "testpost1")
|
||||||
assertions.AssertContains(t, result, "testpost2")
|
assertions.AssertContains(t, result, "testpost2")
|
||||||
|
@ -136,14 +136,14 @@ func TestCanRenderIndexPage(t *testing.T) {
|
||||||
|
|
||||||
func TestCanRenderIndexPageNoTitle(t *testing.T) {
|
func TestCanRenderIndexPageNoTitle(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{}, "hi")
|
post, _ := user.CreateNewPostFull(owl.PostMeta{}, "hi")
|
||||||
result, _ := owl.RenderIndexPage(user)
|
result, _ := owl.RenderIndexPage(user)
|
||||||
assertions.AssertContains(t, result, post.Id())
|
assertions.AssertContains(t, result, post.Id())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRenderNoteAsFullContent(t *testing.T) {
|
func TestRenderNoteAsFullContent(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "note"}, "This is a note")
|
user.CreateNewPostFull(owl.PostMeta{Type: "note"}, "This is a note")
|
||||||
result, _ := owl.RenderPostList(user, &owl.PostList{
|
result, _ := owl.RenderPostList(user, &owl.PostList{
|
||||||
Include: []string{"note"},
|
Include: []string{"note"},
|
||||||
})
|
})
|
||||||
|
@ -153,7 +153,7 @@ func TestRenderNoteAsFullContent(t *testing.T) {
|
||||||
|
|
||||||
func TestIndexPageContainsHFeedContainer(t *testing.T) {
|
func TestIndexPageContainsHFeedContainer(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost1"}, "")
|
user.CreateNewPost("testpost1", false)
|
||||||
|
|
||||||
result, _ := owl.RenderIndexPage(user)
|
result, _ := owl.RenderIndexPage(user)
|
||||||
assertions.AssertContains(t, result, "<div class=\"h-feed\">")
|
assertions.AssertContains(t, result, "<div class=\"h-feed\">")
|
||||||
|
@ -161,7 +161,7 @@ func TestIndexPageContainsHFeedContainer(t *testing.T) {
|
||||||
|
|
||||||
func TestIndexPageContainsHEntryAndUUrl(t *testing.T) {
|
func TestIndexPageContainsHEntryAndUUrl(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost1"}, "")
|
user.CreateNewPost("testpost1", false)
|
||||||
|
|
||||||
result, _ := owl.RenderIndexPage(user)
|
result, _ := owl.RenderIndexPage(user)
|
||||||
assertions.AssertContains(t, result, "class=\"h-entry\"")
|
assertions.AssertContains(t, result, "class=\"h-entry\"")
|
||||||
|
@ -171,7 +171,7 @@ func TestIndexPageContainsHEntryAndUUrl(t *testing.T) {
|
||||||
|
|
||||||
func TestIndexPageDoesNotContainsArticle(t *testing.T) {
|
func TestIndexPageDoesNotContainsArticle(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article"}, "hi")
|
user.CreateNewPostFull(owl.PostMeta{Type: "article"}, "hi")
|
||||||
|
|
||||||
result, _ := owl.RenderIndexPage(user)
|
result, _ := owl.RenderIndexPage(user)
|
||||||
assertions.AssertContains(t, result, "class=\"h-entry\"")
|
assertions.AssertContains(t, result, "class=\"h-entry\"")
|
||||||
|
@ -180,7 +180,7 @@ func TestIndexPageDoesNotContainsArticle(t *testing.T) {
|
||||||
|
|
||||||
func TestIndexPageDoesNotContainsReply(t *testing.T) {
|
func TestIndexPageDoesNotContainsReply(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "reply", Reply: owl.ReplyData{Url: "https://example.com/post"}}, "hi")
|
user.CreateNewPostFull(owl.PostMeta{Type: "reply", Reply: owl.Reply{Url: "https://example.com/post"}}, "hi")
|
||||||
|
|
||||||
result, _ := owl.RenderIndexPage(user)
|
result, _ := owl.RenderIndexPage(user)
|
||||||
assertions.AssertContains(t, result, "class=\"h-entry\"")
|
assertions.AssertContains(t, result, "class=\"h-entry\"")
|
||||||
|
@ -189,8 +189,8 @@ func TestIndexPageDoesNotContainsReply(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderIndexPageWithBrokenBaseTemplate(t *testing.T) {
|
func TestRenderIndexPageWithBrokenBaseTemplate(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost1"}, "")
|
user.CreateNewPost("testpost1", false)
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost2"}, "")
|
user.CreateNewPost("testpost2", false)
|
||||||
|
|
||||||
os.WriteFile(path.Join(user.Dir(), "meta/base.html"), []byte("{{content}}"), 0644)
|
os.WriteFile(path.Join(user.Dir(), "meta/base.html"), []byte("{{content}}"), 0644)
|
||||||
|
|
||||||
|
@ -216,7 +216,7 @@ func TestRendersHeaderTitle(t *testing.T) {
|
||||||
SubTitle: "Test SubTitle",
|
SubTitle: "Test SubTitle",
|
||||||
HeaderColor: "#ff1337",
|
HeaderColor: "#ff1337",
|
||||||
})
|
})
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
result, _ := owl.RenderPost(post)
|
result, _ := owl.RenderPost(post)
|
||||||
assertions.AssertContains(t, result, "Test Title")
|
assertions.AssertContains(t, result, "Test Title")
|
||||||
|
@ -226,7 +226,7 @@ func TestRendersHeaderTitle(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderPostIncludesRelToWebMention(t *testing.T) {
|
func TestRenderPostIncludesRelToWebMention(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
result, _ := owl.RenderPost(post)
|
result, _ := owl.RenderPost(post)
|
||||||
assertions.AssertContains(t, result, "rel=\"webmention\"")
|
assertions.AssertContains(t, result, "rel=\"webmention\"")
|
||||||
|
@ -236,7 +236,7 @@ func TestRenderPostIncludesRelToWebMention(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderPostAddsLinksToApprovedWebmention(t *testing.T) {
|
func TestRenderPostAddsLinksToApprovedWebmention(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
webmention := owl.WebmentionIn{
|
webmention := owl.WebmentionIn{
|
||||||
Source: "http://example.com/source3",
|
Source: "http://example.com/source3",
|
||||||
Title: "Test Title",
|
Title: "Test Title",
|
||||||
|
@ -260,7 +260,7 @@ func TestRenderPostAddsLinksToApprovedWebmention(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderPostNotMentioningWebmentionsIfNoAvail(t *testing.T) {
|
func TestRenderPostNotMentioningWebmentionsIfNoAvail(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
result, _ := owl.RenderPost(post)
|
result, _ := owl.RenderPost(post)
|
||||||
|
|
||||||
assertions.AssertNotContains(t, result, "Webmention")
|
assertions.AssertNotContains(t, result, "Webmention")
|
||||||
|
@ -269,7 +269,7 @@ func TestRenderPostNotMentioningWebmentionsIfNoAvail(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderIncludesFullUrl(t *testing.T) {
|
func TestRenderIncludesFullUrl(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
result, _ := owl.RenderPost(post)
|
result, _ := owl.RenderPost(post)
|
||||||
|
|
||||||
assertions.AssertContains(t, result, "class=\"u-url\"")
|
assertions.AssertContains(t, result, "class=\"u-url\"")
|
||||||
|
@ -292,7 +292,7 @@ func TestAuthorNameInPost(t *testing.T) {
|
||||||
HeaderColor: "#ff1337",
|
HeaderColor: "#ff1337",
|
||||||
AuthorName: "Test Author",
|
AuthorName: "Test Author",
|
||||||
})
|
})
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
result, _ := owl.RenderPost(post)
|
result, _ := owl.RenderPost(post)
|
||||||
assertions.AssertContains(t, result, "Test Author")
|
assertions.AssertContains(t, result, "Test Author")
|
||||||
|
@ -301,12 +301,17 @@ func TestAuthorNameInPost(t *testing.T) {
|
||||||
func TestRenderReplyWithoutText(t *testing.T) {
|
func TestRenderReplyWithoutText(t *testing.T) {
|
||||||
|
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
Type: "reply",
|
|
||||||
Reply: owl.ReplyData{
|
content := "---\n"
|
||||||
Url: "https://example.com/post",
|
content += "title: test\n"
|
||||||
},
|
content += "date: Wed, 17 Aug 2022 10:50:02 +0000\n"
|
||||||
}, "Hi ")
|
content += "reply: \n"
|
||||||
|
content += " url: https://example.com/post\n"
|
||||||
|
content += "---\n"
|
||||||
|
content += "\n"
|
||||||
|
content += "Hi \n"
|
||||||
|
os.WriteFile(post.ContentFile(), []byte(content), 0644)
|
||||||
|
|
||||||
result, _ := owl.RenderPost(post)
|
result, _ := owl.RenderPost(post)
|
||||||
assertions.AssertContains(t, result, "https://example.com/post")
|
assertions.AssertContains(t, result, "https://example.com/post")
|
||||||
|
@ -315,13 +320,17 @@ func TestRenderReplyWithoutText(t *testing.T) {
|
||||||
func TestRenderReplyWithText(t *testing.T) {
|
func TestRenderReplyWithText(t *testing.T) {
|
||||||
|
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
Type: "reply",
|
|
||||||
Reply: owl.ReplyData{
|
content := "---\n"
|
||||||
Url: "https://example.com/post",
|
content += "title: test\n"
|
||||||
Text: "This is a reply",
|
content += "date: Wed, 17 Aug 2022 10:50:02 +0000\n"
|
||||||
},
|
content += "reply: \n"
|
||||||
}, "Hi ")
|
content += " url: https://example.com/post\n"
|
||||||
|
content += " text: \"This is a reply\"\n"
|
||||||
|
content += "---\n"
|
||||||
|
content += "Hi \n"
|
||||||
|
os.WriteFile(post.ContentFile(), []byte(content), 0644)
|
||||||
|
|
||||||
result, _ := owl.RenderPost(post)
|
result, _ := owl.RenderPost(post)
|
||||||
assertions.AssertContains(t, result, "https://example.com/post")
|
assertions.AssertContains(t, result, "https://example.com/post")
|
||||||
|
@ -331,7 +340,7 @@ func TestRenderReplyWithText(t *testing.T) {
|
||||||
|
|
||||||
func TestRengerPostContainsBookmark(t *testing.T) {
|
func TestRengerPostContainsBookmark(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "bookmark", Bookmark: owl.BookmarkData{Url: "https://example.com/post"}}, "hi")
|
post, _ := user.CreateNewPostFull(owl.PostMeta{Type: "bookmark", Bookmark: owl.Bookmark{Url: "https://example.com/post"}}, "hi")
|
||||||
|
|
||||||
result, _ := owl.RenderPost(post)
|
result, _ := owl.RenderPost(post)
|
||||||
assertions.AssertContains(t, result, "https://example.com/post")
|
assertions.AssertContains(t, result, "https://example.com/post")
|
||||||
|
@ -339,7 +348,7 @@ func TestRengerPostContainsBookmark(t *testing.T) {
|
||||||
|
|
||||||
func TestOpenGraphTags(t *testing.T) {
|
func TestOpenGraphTags(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: The Rock\n"
|
content += "title: The Rock\n"
|
||||||
|
@ -430,7 +439,7 @@ func TestRenderHeaderMenuUrlItem(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderHeaderMenuPost(t *testing.T) {
|
func TestRenderHeaderMenuPost(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
user.AddHeaderMenuItem(owl.MenuItem{
|
user.AddHeaderMenuItem(owl.MenuItem{
|
||||||
Title: "Test Entry",
|
Title: "Test Entry",
|
||||||
Post: post.Id(),
|
Post: post.Id(),
|
||||||
|
@ -464,7 +473,7 @@ func TestRenderFooterMenuUrlItem(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderFooterMenuPost(t *testing.T) {
|
func TestRenderFooterMenuPost(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{
|
post, _ := user.CreateNewPostFull(owl.PostMeta{
|
||||||
Type: "private",
|
Type: "private",
|
||||||
}, "")
|
}, "")
|
||||||
result, _ := owl.RenderIndexPage(user)
|
result, _ := owl.RenderIndexPage(user)
|
||||||
|
|
|
@ -158,12 +158,12 @@ func (repo Repository) GetUser(name string) (User, error) {
|
||||||
return user, nil
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo Repository) PostAliases() (map[string]Post, error) {
|
func (repo Repository) PostAliases() (map[string]*Post, error) {
|
||||||
users, err := repo.Users()
|
users, err := repo.Users()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
aliases := make(map[string]Post)
|
aliases := make(map[string]*Post)
|
||||||
for _, user := range users {
|
for _, user := range users {
|
||||||
user_aliases, err := user.PostAliases()
|
user_aliases, err := user.PostAliases()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -199,7 +199,7 @@ func TestSingleUserRepoUserUrlPathIsSimple(t *testing.T) {
|
||||||
func TestCanGetMapWithAllPostAliases(t *testing.T) {
|
func TestCanGetMapWithAllPostAliases(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "test-1"}, "")
|
post, _ := user.CreateNewPost("test-1", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test\n"
|
content += "title: Test\n"
|
||||||
|
@ -213,7 +213,7 @@ func TestCanGetMapWithAllPostAliases(t *testing.T) {
|
||||||
posts, _ := user.PublishedPosts()
|
posts, _ := user.PublishedPosts()
|
||||||
assertions.AssertLen(t, posts, 1)
|
assertions.AssertLen(t, posts, 1)
|
||||||
|
|
||||||
var aliases map[string]owl.Post
|
var aliases map[string]*owl.Post
|
||||||
aliases, err := repo.PostAliases()
|
aliases, err := repo.PostAliases()
|
||||||
assertions.AssertNoError(t, err, "Error getting post aliases: ")
|
assertions.AssertNoError(t, err, "Error getting post aliases: ")
|
||||||
assertions.AssertMapLen(t, aliases, 2)
|
assertions.AssertMapLen(t, aliases, 2)
|
||||||
|
@ -225,8 +225,8 @@ func TestCanGetMapWithAllPostAliases(t *testing.T) {
|
||||||
func TestAliasesHaveCorrectPost(t *testing.T) {
|
func TestAliasesHaveCorrectPost(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
post1, _ := user.CreateNewPost(owl.PostMeta{Title: "test-1"}, "")
|
post1, _ := user.CreateNewPost("test-1", false)
|
||||||
post2, _ := user.CreateNewPost(owl.PostMeta{Title: "test-2"}, "")
|
post2, _ := user.CreateNewPost("test-2", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test\n"
|
content += "title: Test\n"
|
||||||
|
@ -247,7 +247,7 @@ func TestAliasesHaveCorrectPost(t *testing.T) {
|
||||||
posts, _ := user.PublishedPosts()
|
posts, _ := user.PublishedPosts()
|
||||||
assertions.AssertLen(t, posts, 2)
|
assertions.AssertLen(t, posts, 2)
|
||||||
|
|
||||||
var aliases map[string]owl.Post
|
var aliases map[string]*owl.Post
|
||||||
aliases, err := repo.PostAliases()
|
aliases, err := repo.PostAliases()
|
||||||
assertions.AssertNoError(t, err, "Error getting post aliases: ")
|
assertions.AssertNoError(t, err, "Error getting post aliases: ")
|
||||||
assertions.AssertMapLen(t, aliases, 2)
|
assertions.AssertMapLen(t, aliases, 2)
|
||||||
|
|
|
@ -35,7 +35,7 @@ func TestRenderRSSFeedUserData(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderRSSFeedPostData(t *testing.T) {
|
func TestRenderRSSFeedPostData(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test Post\n"
|
content += "title: Test Post\n"
|
||||||
|
@ -53,7 +53,7 @@ func TestRenderRSSFeedPostData(t *testing.T) {
|
||||||
|
|
||||||
func TestRenderRSSFeedPostDataWithoutDate(t *testing.T) {
|
func TestRenderRSSFeedPostDataWithoutDate(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test Post\n"
|
content += "title: Test Post\n"
|
||||||
|
|
47
user.go
47
user.go
|
@ -197,9 +197,9 @@ func (user User) FaviconUrl() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user User) AllPosts() ([]Post, error) {
|
func (user User) AllPosts() ([]*Post, error) {
|
||||||
postFiles := listDir(path.Join(user.Dir(), "public"))
|
postFiles := listDir(path.Join(user.Dir(), "public"))
|
||||||
posts := make([]Post, 0)
|
posts := make([]*Post, 0)
|
||||||
for _, id := range postFiles {
|
for _, id := range postFiles {
|
||||||
// if is a directory and has index.md, add to posts
|
// if is a directory and has index.md, add to posts
|
||||||
if dirExists(path.Join(user.Dir(), "public", id)) {
|
if dirExists(path.Join(user.Dir(), "public", id)) {
|
||||||
|
@ -211,7 +211,7 @@ func (user User) AllPosts() ([]Post, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type PostWithDate struct {
|
type PostWithDate struct {
|
||||||
post Post
|
post *Post
|
||||||
date time.Time
|
date time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,7 +233,7 @@ func (user User) AllPosts() ([]Post, error) {
|
||||||
return posts, nil
|
return posts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user User) PublishedPosts() ([]Post, error) {
|
func (user User) PublishedPosts() ([]*Post, error) {
|
||||||
posts, _ := user.AllPosts()
|
posts, _ := user.AllPosts()
|
||||||
|
|
||||||
// remove drafts
|
// remove drafts
|
||||||
|
@ -249,7 +249,7 @@ func (user User) PublishedPosts() ([]Post, error) {
|
||||||
return posts, nil
|
return posts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user User) PrimaryFeedPosts() ([]Post, error) {
|
func (user User) PrimaryFeedPosts() ([]*Post, error) {
|
||||||
config := user.Config()
|
config := user.Config()
|
||||||
include := config.PrimaryListInclude
|
include := config.PrimaryListInclude
|
||||||
if len(include) == 0 {
|
if len(include) == 0 {
|
||||||
|
@ -262,7 +262,7 @@ func (user User) PrimaryFeedPosts() ([]Post, error) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user User) GetPostsOfList(list PostList) ([]Post, error) {
|
func (user User) GetPostsOfList(list PostList) ([]*Post, error) {
|
||||||
posts, _ := user.PublishedPosts()
|
posts, _ := user.PublishedPosts()
|
||||||
|
|
||||||
// remove posts not included
|
// remove posts not included
|
||||||
|
@ -278,17 +278,17 @@ func (user User) GetPostsOfList(list PostList) ([]Post, error) {
|
||||||
return posts, nil
|
return posts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user User) GetPost(id string) (Post, error) {
|
func (user User) GetPost(id string) (*Post, error) {
|
||||||
// check if posts index.md exists
|
// check if posts index.md exists
|
||||||
if !fileExists(path.Join(user.Dir(), "public", id, "index.md")) {
|
if !fileExists(path.Join(user.Dir(), "public", id, "index.md")) {
|
||||||
return &GenericPost{}, fmt.Errorf("post %s does not exist", id)
|
return &Post{}, fmt.Errorf("post %s does not exist", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
post := GenericPost{user: &user, id: id}
|
post := Post{user: &user, id: id}
|
||||||
return &post, nil
|
return &post, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user User) CreateNewPost(meta PostMeta, content string) (Post, error) {
|
func (user User) CreateNewPostFull(meta PostMeta, content string) (*Post, error) {
|
||||||
slugHint := meta.Title
|
slugHint := meta.Title
|
||||||
if slugHint == "" {
|
if slugHint == "" {
|
||||||
slugHint = "note"
|
slugHint = "note"
|
||||||
|
@ -307,19 +307,14 @@ func (user User) CreateNewPost(meta PostMeta, content string) (Post, error) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post := GenericPost{user: &user, id: folder_name}
|
post := Post{user: &user, id: folder_name}
|
||||||
|
|
||||||
// if date is not set, set it to now
|
|
||||||
if meta.Date.IsZero() {
|
|
||||||
meta.Date = time.Now()
|
|
||||||
}
|
|
||||||
|
|
||||||
initial_content := ""
|
initial_content := ""
|
||||||
initial_content += "---\n"
|
initial_content += "---\n"
|
||||||
// write meta
|
// write meta
|
||||||
meta_bytes, err := yaml.Marshal(meta) // TODO: this should be down by the Post
|
meta_bytes, err := yaml.Marshal(meta)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &GenericPost{}, err
|
return &Post{}, err
|
||||||
}
|
}
|
||||||
initial_content += string(meta_bytes)
|
initial_content += string(meta_bytes)
|
||||||
initial_content += "---\n"
|
initial_content += "---\n"
|
||||||
|
@ -331,7 +326,17 @@ func (user User) CreateNewPost(meta PostMeta, content string) (Post, error) {
|
||||||
os.WriteFile(post.ContentFile(), []byte(initial_content), 0644)
|
os.WriteFile(post.ContentFile(), []byte(initial_content), 0644)
|
||||||
// create media dir
|
// create media dir
|
||||||
os.Mkdir(post.MediaDir(), 0755)
|
os.Mkdir(post.MediaDir(), 0755)
|
||||||
return user.GetPost(post.Id())
|
return &post, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (user User) CreateNewPost(title string, draft bool) (*Post, error) {
|
||||||
|
meta := PostMeta{
|
||||||
|
Title: title,
|
||||||
|
Date: time.Now(),
|
||||||
|
Aliases: []string{},
|
||||||
|
Draft: draft,
|
||||||
|
}
|
||||||
|
return user.CreateNewPostFull(meta, title)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user User) Template() (string, error) {
|
func (user User) Template() (string, error) {
|
||||||
|
@ -354,8 +359,8 @@ func (user User) SetConfig(new_config UserConfig) error {
|
||||||
return saveToYaml(user.ConfigFile(), new_config)
|
return saveToYaml(user.ConfigFile(), new_config)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user User) PostAliases() (map[string]Post, error) {
|
func (user User) PostAliases() (map[string]*Post, error) {
|
||||||
post_aliases := make(map[string]Post)
|
post_aliases := make(map[string]*Post)
|
||||||
posts, err := user.PublishedPosts()
|
posts, err := user.PublishedPosts()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return post_aliases, err
|
return post_aliases, err
|
||||||
|
|
42
user_test.go
42
user_test.go
|
@ -14,7 +14,7 @@ func TestCreateNewPostCreatesEntryInPublic(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
// Create a new post
|
// Create a new post
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
files, err := os.ReadDir(path.Join(user.Dir(), "public"))
|
files, err := os.ReadDir(path.Join(user.Dir(), "public"))
|
||||||
assertions.AssertNoError(t, err, "Error reading directory")
|
assertions.AssertNoError(t, err, "Error reading directory")
|
||||||
assertions.AssertLen(t, files, 1)
|
assertions.AssertLen(t, files, 1)
|
||||||
|
@ -25,7 +25,7 @@ func TestCreateNewPostCreatesMediaDir(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
// Create a new post
|
// Create a new post
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
_, err := os.Stat(post.MediaDir())
|
_, err := os.Stat(post.MediaDir())
|
||||||
assertions.AssertNot(t, os.IsNotExist(err), "Media directory not created")
|
assertions.AssertNot(t, os.IsNotExist(err), "Media directory not created")
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ func TestCreateNewPostCreatesMediaDir(t *testing.T) {
|
||||||
func TestCreateNewPostAddsDateToMetaBlock(t *testing.T) {
|
func TestCreateNewPostAddsDateToMetaBlock(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
// Create a new post
|
// Create a new post
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
posts, _ := user.PublishedPosts()
|
posts, _ := user.PublishedPosts()
|
||||||
post, _ := user.GetPost(posts[0].Id())
|
post, _ := user.GetPost(posts[0].Id())
|
||||||
meta := post.Meta()
|
meta := post.Meta()
|
||||||
|
@ -45,9 +45,9 @@ func TestCreateNewPostMultipleCalls(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
// Create a new post
|
// Create a new post
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
files, err := os.ReadDir(path.Join(user.Dir(), "public"))
|
files, err := os.ReadDir(path.Join(user.Dir(), "public"))
|
||||||
assertions.AssertNoError(t, err, "Error reading directory")
|
assertions.AssertNoError(t, err, "Error reading directory")
|
||||||
assertions.AssertEqual(t, len(files), 3)
|
assertions.AssertEqual(t, len(files), 3)
|
||||||
|
@ -58,9 +58,9 @@ func TestCanListUserPosts(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
// Create a new post
|
// Create a new post
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
posts, err := user.PublishedPosts()
|
posts, err := user.PublishedPosts()
|
||||||
assertions.AssertNoError(t, err, "Error reading posts")
|
assertions.AssertNoError(t, err, "Error reading posts")
|
||||||
assertions.AssertLen(t, posts, 3)
|
assertions.AssertLen(t, posts, 3)
|
||||||
|
@ -71,7 +71,7 @@ func TestCannotListUserPostsInSubdirectories(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
// Create a new post
|
// Create a new post
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
os.Mkdir(path.Join(user.PostDir(), "foo"), 0755)
|
os.Mkdir(path.Join(user.PostDir(), "foo"), 0755)
|
||||||
os.Mkdir(path.Join(user.PostDir(), "foo/bar"), 0755)
|
os.Mkdir(path.Join(user.PostDir(), "foo/bar"), 0755)
|
||||||
content := ""
|
content := ""
|
||||||
|
@ -108,7 +108,7 @@ func TestCannotListUserPostsWithoutIndexMd(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
// Create a new post
|
// Create a new post
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
os.Mkdir(path.Join(user.PostDir(), "foo"), 0755)
|
os.Mkdir(path.Join(user.PostDir(), "foo"), 0755)
|
||||||
os.Mkdir(path.Join(user.PostDir(), "foo/bar"), 0755)
|
os.Mkdir(path.Join(user.PostDir(), "foo/bar"), 0755)
|
||||||
content := ""
|
content := ""
|
||||||
|
@ -137,7 +137,7 @@ func TestListUserPostsDoesNotIncludeDrafts(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
// Create a new post
|
// Create a new post
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
content := ""
|
content := ""
|
||||||
content += "---\n"
|
content += "---\n"
|
||||||
content += "title: test\n"
|
content += "title: test\n"
|
||||||
|
@ -156,7 +156,7 @@ func TestListUsersDraftsExcludedRealWorld(t *testing.T) {
|
||||||
repo := getTestRepo(owl.RepoConfig{})
|
repo := getTestRepo(owl.RepoConfig{})
|
||||||
user, _ := repo.CreateUser(randomUserName())
|
user, _ := repo.CreateUser(randomUserName())
|
||||||
// Create a new post
|
// Create a new post
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
content := ""
|
content := ""
|
||||||
content += "---\n"
|
content += "---\n"
|
||||||
content += "title: Articles September 2019\n"
|
content += "title: Articles September 2019\n"
|
||||||
|
@ -180,7 +180,7 @@ func TestListUsersDraftsExcludedRealWorld(t *testing.T) {
|
||||||
func TestCanLoadPost(t *testing.T) {
|
func TestCanLoadPost(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
// Create a new post
|
// Create a new post
|
||||||
user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
user.CreateNewPost("testpost", false)
|
||||||
|
|
||||||
posts, _ := user.PublishedPosts()
|
posts, _ := user.PublishedPosts()
|
||||||
post, _ := user.GetPost(posts[0].Id())
|
post, _ := user.GetPost(posts[0].Id())
|
||||||
|
@ -200,8 +200,8 @@ func TestUserFullUrl(t *testing.T) {
|
||||||
func TestPostsSortedByPublishingDateLatestFirst(t *testing.T) {
|
func TestPostsSortedByPublishingDateLatestFirst(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
// Create a new post
|
// Create a new post
|
||||||
post1, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post1, _ := user.CreateNewPost("testpost", false)
|
||||||
post2, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost2"}, "")
|
post2, _ := user.CreateNewPost("testpost2", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test Post\n"
|
content += "title: Test Post\n"
|
||||||
|
@ -225,9 +225,9 @@ func TestPostsSortedByPublishingDateLatestFirst(t *testing.T) {
|
||||||
func TestPostsSortedByPublishingDateLatestFirst2(t *testing.T) {
|
func TestPostsSortedByPublishingDateLatestFirst2(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
// Create a new post
|
// Create a new post
|
||||||
posts := []owl.Post{}
|
posts := []*owl.Post{}
|
||||||
for i := 59; i >= 0; i-- {
|
for i := 59; i >= 0; i-- {
|
||||||
post, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post, _ := user.CreateNewPost("testpost", false)
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test Post\n"
|
content += "title: Test Post\n"
|
||||||
content += fmt.Sprintf("date: Wed, 17 Aug 2022 10:%02d:02 +0000\n", i)
|
content += fmt.Sprintf("date: Wed, 17 Aug 2022 10:%02d:02 +0000\n", i)
|
||||||
|
@ -246,8 +246,8 @@ func TestPostsSortedByPublishingDateLatestFirst2(t *testing.T) {
|
||||||
func TestPostsSortedByPublishingDateBrokenAtBottom(t *testing.T) {
|
func TestPostsSortedByPublishingDateBrokenAtBottom(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
// Create a new post
|
// Create a new post
|
||||||
post1, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost"}, "")
|
post1, _ := user.CreateNewPost("testpost", false)
|
||||||
post2, _ := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost2"}, "")
|
post2, _ := user.CreateNewPost("testpost2", false)
|
||||||
|
|
||||||
content := "---\n"
|
content := "---\n"
|
||||||
content += "title: Test Post\n"
|
content += "title: Test Post\n"
|
||||||
|
@ -281,7 +281,7 @@ func TestAvatarSetIfFileExist(t *testing.T) {
|
||||||
|
|
||||||
func TestPostNameIllegalFileName(t *testing.T) {
|
func TestPostNameIllegalFileName(t *testing.T) {
|
||||||
user := getTestUser()
|
user := getTestUser()
|
||||||
_, err := user.CreateNewPost(owl.PostMeta{Type: "article", Title: "testpost?///"}, "")
|
_, err := user.CreateNewPost("testpost?///", false)
|
||||||
assertions.AssertNoError(t, err, "Should not have failed")
|
assertions.AssertNoError(t, err, "Should not have failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue