diff --git a/README.md b/README.md index 96af260b..ef9cbab1 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,13 @@ Also, optional following headers are supported: reading; * plain: content will fill all page; +```markdown + +``` + +* (default) page: normal Confluence page - defaults to this if omitted +* blogpost: [Blog post](https://confluence.atlassian.com/doc/blog-posts-834222533.html) in `Space`. Cannot have `Parent`(s) + Mark supports Go templates, which can be included into article by using path to the template relative to current working dir, e.g.: diff --git a/main.go b/main.go index a98a6c20..0d977044 100644 --- a/main.go +++ b/main.go @@ -191,16 +191,18 @@ func main() { if err != nil { log.Fatalf( karma.Describe("title", meta.Title).Reason(err), - "unable to resolve page", + "unable to resolve %s", + meta.Type, ) } if page == nil { - page, err = api.CreatePage(meta.Space, parent, meta.Title, ``) + page, err = api.CreatePage(meta.Space, meta.Type, parent, meta.Title, ``) if err != nil { log.Fatalf( err, - "can't create page %q", + "can't create %s %q", + meta.Type, meta.Title, ) } diff --git a/pkg/confluence/api.go b/pkg/confluence/api.go index e96f8c9e..b99802dc 100644 --- a/pkg/confluence/api.go +++ b/pkg/confluence/api.go @@ -33,6 +33,7 @@ type API struct { type PageInfo struct { ID string `json:"id"` Title string `json:"title"` + Type string `json:"type"` Version struct { Number int64 `json:"number"` @@ -95,7 +96,7 @@ func NewAPI(baseURL string, username string, password string) *API { } func (api *API) FindRootPage(space string) (*PageInfo, error) { - page, err := api.FindPage(space, ``) + page, err := api.FindPage(space, ``, "page") if err != nil { return nil, karma.Format( err, @@ -121,7 +122,7 @@ func (api *API) FindRootPage(space string) (*PageInfo, error) { }, nil } -func (api *API) FindPage(space string, title string) (*PageInfo, error) { +func (api *API) FindPage(space string, title string, pageType string) (*PageInfo, error) { result := struct { Results []PageInfo `json:"results"` }{} @@ -129,6 +130,7 @@ func (api *API) FindPage(space string, title string) (*PageInfo, error) { payload := map[string]string{ "spaceKey": space, "expand": "ancestors,version", + "type": pageType, } if title != "" { @@ -388,12 +390,13 @@ func (api *API) GetPageByID(pageID string) (*PageInfo, error) { func (api *API) CreatePage( space string, + pageType string, parent *PageInfo, title string, body string, ) (*PageInfo, error) { payload := map[string]interface{}{ - "type": "page", + "type": pageType, "title": title, "space": map[string]interface{}{ "key": space, @@ -437,17 +440,20 @@ func (api *API) UpdatePage( page *PageInfo, newContent string, minorEdit bool, newLabels []string, ) error { nextPageVersion := page.Version.Number + 1 + oldAncestors := []map[string]interface{}{} - if len(page.Ancestors) == 0 { - return fmt.Errorf( - "page %q info does not contain any information about parents", - page.ID, - ) - } + if page.Type != "blogpost" { + if len(page.Ancestors) == 0 { + return fmt.Errorf( + "page %q info does not contain any information about parents", + page.ID, + ) + } - // picking only the last one, which is required by confluence - oldAncestors := []map[string]interface{}{ - {"id": page.Ancestors[len(page.Ancestors)-1].Id}, + // picking only the last one, which is required by confluence + oldAncestors = []map[string]interface{}{ + {"id": page.Ancestors[len(page.Ancestors)-1].Id}, + } } labels := []map[string]interface{}{} @@ -463,7 +469,7 @@ func (api *API) UpdatePage( payload := map[string]interface{}{ "id": page.ID, - "type": "page", + "type": page.Type, "title": page.Title, "version": map[string]interface{}{ "number": nextPageVersion, diff --git a/pkg/mark/ancestry.go b/pkg/mark/ancestry.go index 1a438fb0..6873ee87 100644 --- a/pkg/mark/ancestry.go +++ b/pkg/mark/ancestry.go @@ -20,7 +20,7 @@ func EnsureAncestry( rest := ancestry for i, title := range ancestry { - page, err := api.FindPage(space, title) + page, err := api.FindPage(space, title, "page") if err != nil { return nil, karma.Format( err, @@ -66,7 +66,7 @@ func EnsureAncestry( if !dryRun { for _, title := range rest { - page, err := api.CreatePage(space, parent, title, ``) + page, err := api.CreatePage(space, "page", parent, title, ``) if err != nil { return nil, karma.Format( err, @@ -95,7 +95,7 @@ func ValidateAncestry( space string, ancestry []string, ) (*confluence.PageInfo, error) { - page, err := api.FindPage(space, ancestry[len(ancestry)-1]) + page, err := api.FindPage(space, ancestry[len(ancestry)-1], "page") if err != nil { return nil, err } diff --git a/pkg/mark/link.go b/pkg/mark/link.go index 492c9661..57f4409e 100644 --- a/pkg/mark/link.go +++ b/pkg/mark/link.go @@ -163,7 +163,7 @@ func getConfluenceLink(api *confluence.API, space, title string) (string, error) url.QueryEscape(title), ) - page, err := api.FindPage(space, title) + page, err := api.FindPage(space, title, "page") if err != nil { return "", karma.Format(err, "api: find page") } diff --git a/pkg/mark/mark.go b/pkg/mark/mark.go index f63f7c04..1247bf86 100644 --- a/pkg/mark/mark.go +++ b/pkg/mark/mark.go @@ -13,7 +13,7 @@ func ResolvePage( api *confluence.API, meta *Meta, ) (*confluence.PageInfo, *confluence.PageInfo, error) { - page, err := api.FindPage(meta.Space, meta.Title) + page, err := api.FindPage(meta.Space, meta.Title, meta.Type) if err != nil { return nil, nil, karma.Format( err, @@ -22,6 +22,16 @@ func ResolvePage( ) } + if meta.Type == "blogpost" { + log.Infof( + nil, + "Blog post will be stored as: %s", + meta.Title, + ) + + return nil, page, nil + } + ancestry := meta.Parents if page != nil { ancestry = append(ancestry, page.Title) diff --git a/pkg/mark/meta.go b/pkg/mark/meta.go index c2a05e40..d998d037 100644 --- a/pkg/mark/meta.go +++ b/pkg/mark/meta.go @@ -13,6 +13,7 @@ import ( const ( HeaderParent = `Parent` HeaderSpace = `Space` + HeaderType = `Type` HeaderTitle = `Title` HeaderLayout = `Layout` HeaderAttachment = `Attachment` @@ -23,6 +24,7 @@ const ( type Meta struct { Parents []string Space string + Type string Title string Layout string Attachments map[string]string @@ -67,6 +69,7 @@ func ExtractMeta(data []byte) (*Meta, []byte, error) { if meta == nil { meta = &Meta{} + meta.Type = "page" //Default if not specified meta.Attachments = make(map[string]string) } @@ -84,6 +87,9 @@ func ExtractMeta(data []byte) (*Meta, []byte, error) { case HeaderSpace: meta.Space = strings.TrimSpace(value) + case HeaderType: + meta.Type = strings.TrimSpace(value) + case HeaderTitle: meta.Title = strings.TrimSpace(value)