mirror of
https://github.com/hanzoskill/ecto.git
synced 2026-10-30 21:03:34 +00:00
259 lines
5.9 KiB
Go
259 lines
5.9 KiB
Go
package cmd
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/visionik/ecto/internal/config"
|
|
"github.com/visionik/libecto"
|
|
)
|
|
|
|
var pagesCmd = &cobra.Command{
|
|
Use: "pages",
|
|
Short: "List pages",
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
client, err := config.GetActiveClient(siteName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
status, _ := cmd.Flags().GetString("status")
|
|
limit, _ := cmd.Flags().GetInt("limit")
|
|
asJSON, _ := cmd.Flags().GetBool("json")
|
|
|
|
resp, err := client.ListPages(status, limit)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if asJSON {
|
|
return outputJSON(resp)
|
|
}
|
|
|
|
if len(resp.Pages) == 0 {
|
|
println("No pages found")
|
|
return nil
|
|
}
|
|
|
|
for _, p := range resp.Pages {
|
|
printf("[%s] %s - %s (%s)\n", p.Status, p.ID, p.Title, p.Slug)
|
|
}
|
|
return nil
|
|
},
|
|
}
|
|
|
|
var pageCmd = &cobra.Command{
|
|
Use: "page <id|slug>",
|
|
Short: "Get a single page",
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
client, err := config.GetActiveClient(siteName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
asJSON, _ := cmd.Flags().GetBool("json")
|
|
|
|
page, err := client.GetPage(args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if asJSON {
|
|
return outputJSON(map[string]interface{}{"pages": []interface{}{page}})
|
|
}
|
|
|
|
printf("ID: %s\n", page.ID)
|
|
printf("Title: %s\n", page.Title)
|
|
printf("Slug: %s\n", page.Slug)
|
|
printf("Status: %s\n", page.Status)
|
|
printf("Created: %s\n", page.CreatedAt)
|
|
if page.PublishedAt != "" {
|
|
printf("Published: %s\n", page.PublishedAt)
|
|
}
|
|
return nil
|
|
},
|
|
}
|
|
|
|
var pageCreateCmd = &cobra.Command{
|
|
Use: "create",
|
|
Short: "Create a new page",
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
client, err := config.GetActiveClient(siteName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
title, _ := cmd.Flags().GetString("title")
|
|
status, _ := cmd.Flags().GetString("status")
|
|
mdFile, _ := cmd.Flags().GetString("markdown-file")
|
|
stdinFormat, _ := cmd.Flags().GetString("stdin-format")
|
|
|
|
if title == "" {
|
|
return fmt.Errorf("--title is required")
|
|
}
|
|
|
|
page := &libecto.Page{
|
|
Title: title,
|
|
Status: status,
|
|
}
|
|
|
|
// Read content
|
|
var content []byte
|
|
if mdFile != "" {
|
|
content, err = os.ReadFile(mdFile)
|
|
if err != nil {
|
|
return fmt.Errorf("reading markdown file: %w", err)
|
|
}
|
|
} else if stdinFormat == "markdown" {
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
var lines []string
|
|
for scanner.Scan() {
|
|
lines = append(lines, scanner.Text())
|
|
}
|
|
content = []byte(strings.Join(lines, "\n"))
|
|
}
|
|
|
|
if len(content) > 0 {
|
|
page.HTML = libecto.MarkdownToHTML(content)
|
|
}
|
|
|
|
created, err := client.CreatePage(page)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
printf("Created page: %s (%s)\n", created.ID, created.Slug)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
var pageEditCmd = &cobra.Command{
|
|
Use: "edit <id|slug>",
|
|
Short: "Edit a page",
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
client, err := config.GetActiveClient(siteName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
existing, err := client.GetPage(args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
update := &libecto.Page{
|
|
UpdatedAt: existing.UpdatedAt,
|
|
}
|
|
|
|
if title, _ := cmd.Flags().GetString("title"); title != "" {
|
|
update.Title = title
|
|
}
|
|
if status, _ := cmd.Flags().GetString("status"); status != "" {
|
|
update.Status = status
|
|
}
|
|
if mdFile, _ := cmd.Flags().GetString("markdown-file"); mdFile != "" {
|
|
content, err := os.ReadFile(mdFile)
|
|
if err != nil {
|
|
return fmt.Errorf("reading markdown file: %w", err)
|
|
}
|
|
update.HTML = libecto.MarkdownToHTML(content)
|
|
}
|
|
|
|
updated, err := client.UpdatePage(existing.ID, update)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
printf("Updated page: %s\n", updated.ID)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
var pageDeleteCmd = &cobra.Command{
|
|
Use: "delete <id|slug>",
|
|
Short: "Delete a page",
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
client, err := config.GetActiveClient(siteName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
force, _ := cmd.Flags().GetBool("force")
|
|
|
|
page, err := client.GetPage(args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if !force {
|
|
printf("Delete page %q (%s)? [y/N]: ", page.Title, page.ID)
|
|
var answer string
|
|
fmt.Scanln(&answer)
|
|
if strings.ToLower(answer) != "y" {
|
|
println("Cancelled")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
if err := client.DeletePage(page.ID); err != nil {
|
|
return err
|
|
}
|
|
|
|
printf("Deleted page: %s\n", page.ID)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
var pagePublishCmd = &cobra.Command{
|
|
Use: "publish <id|slug>",
|
|
Short: "Publish a page",
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
client, err := config.GetActiveClient(siteName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
updated, err := client.PublishPage(args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
printf("Published page: %s\n", updated.ID)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
pagesCmd.Flags().String("status", "", "Filter by status (draft|published|all)")
|
|
pagesCmd.Flags().Int("limit", 15, "Number of pages to return")
|
|
pagesCmd.Flags().Bool("json", false, "Output as JSON")
|
|
|
|
pageCmd.Flags().Bool("json", false, "Output as JSON")
|
|
|
|
pageCreateCmd.Flags().String("title", "", "Page title (required)")
|
|
pageCreateCmd.Flags().String("status", "draft", "Page status (draft|published)")
|
|
pageCreateCmd.Flags().String("markdown-file", "", "Path to markdown file for content")
|
|
pageCreateCmd.Flags().String("stdin-format", "", "Read content from stdin (markdown)")
|
|
|
|
pageEditCmd.Flags().String("title", "", "New title")
|
|
pageEditCmd.Flags().String("status", "", "New status")
|
|
pageEditCmd.Flags().String("markdown-file", "", "Path to markdown file for new content")
|
|
|
|
pageDeleteCmd.Flags().Bool("force", false, "Delete without confirmation")
|
|
|
|
pageCmd.AddCommand(pageCreateCmd)
|
|
pageCmd.AddCommand(pageEditCmd)
|
|
pageCmd.AddCommand(pageDeleteCmd)
|
|
pageCmd.AddCommand(pagePublishCmd)
|
|
|
|
rootCmd.AddCommand(pagesCmd)
|
|
rootCmd.AddCommand(pageCmd)
|
|
}
|