Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
CreatesNewMarkdownPostFile
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
2 / 2
7
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 save
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2
3namespace Hyde\Framework\Actions;
4
5use Hyde\Framework\Exceptions\FileConflictException;
6use Hyde\Framework\Hyde;
7use Illuminate\Support\Str;
8
9/**
10 * Offloads logic for the make:post command.
11 *
12 * This class is executed when creating a new Markdown Post
13 * using the Hyde command, and converts and formats the
14 * data input by the user, and then saves the file.
15 *
16 * @see \Hyde\Framework\Commands\HydeMakePostCommand
17 */
18class CreatesNewMarkdownPostFile
19{
20    /**
21     * The Post Title.
22     *
23     * @var string
24     */
25    public string $title;
26
27    /**
28     * The Post Meta Description.
29     *
30     * @var string
31     */
32    public string $description;
33
34    /**
35     * The Primary Post Category.
36     *
37     * @var string
38     */
39    public string $category;
40
41    /**
42     * The Username of the Author.
43     *
44     * @var string
45     */
46    public string $author;
47
48    /**
49     * The Publishing Date.
50     *
51     * @var string
52     */
53    public string $date;
54
55    /**
56     * The Post Slug.
57     *
58     * @var string
59     */
60    public string $slug;
61
62    /**
63     * Construct the class.
64     *
65     * @param  string  $title  The Post Title.
66     * @param  string|null  $description  The Post Meta Description.
67     * @param  string|null  $category  The Primary Post Category.
68     * @param  string|null  $author  The Username of the Author.
69     * @param  string|null  $date  The Publishing Date.
70     * @param  string|null  $slug  The Post Slug.
71     */
72    public function __construct(
73        string $title,
74        ?string $description,
75        ?string $category,
76        ?string $author,
77        ?string $date = null,
78        ?string $slug = null
79    ) {
80        $this->title = $title ?? 'My Awesome Blog Post';
81        $this->description = $description ?? 'A short description used in previews and SEO';
82        $this->category = $category ?? 'blog';
83        $this->author = $author ?? 'Mr. Hyde';
84        if ($date === null) {
85            $this->date = date('Y-m-d H:i');
86        }
87        if ($slug === null) {
88            $this->slug = Str::slug($title);
89        }
90    }
91
92    /**
93     * Save the class object to a Markdown file.
94     *
95     * @param  bool  $force  Should the file be created even if a file with the same path already exists?
96     * @return string|false Returns the path to the file if successful, or false if the file could not be saved.
97     *
98     * @throws FileConflictException if a file with the same slug already exists and the force flag is not set.
99     */
100    public function save(bool $force = false): string|false
101    {
102        $path = Hyde::path("_posts/$this->slug.md");
103
104        if ($force !== true && file_exists($path)) {
105            throw new FileConflictException($path);
106        }
107
108        $arrayWithoutSlug = ((array) $this);
109
110        unset($arrayWithoutSlug['slug']);
111
112        $contents = (new ConvertsArrayToFrontMatter)->execute($arrayWithoutSlug).
113            "\n## Write something awesome.\n\n";
114
115        return file_put_contents($path, $contents) ? $path : false;
116    }
117}