Passed
Push — master ( 147f66...7138a8 )
by Richard
17:47 queued 12:18
created

StubViewsCommand::writeBlade()   C

Complexity

Conditions 12
Paths 12

Size

Total Lines 40
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 12
eloc 34
c 1
b 0
f 0
nc 12
nop 3
dl 0
loc 40
rs 6.9666

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Riclep\Storyblok\Console;
4
5
use Illuminate\Console\Command;
6
use Illuminate\Support\Facades\File;
7
use Riclep\Storyblok\Traits\HasChildClasses;
8
use Storyblok\ApiException;
9
use Storyblok\ManagementClient;
10
11
class StubViewsCommand extends Command
12
{
13
	use HasChildClasses;
14
15
    /**
16
     * The name and signature of the console command.
17
     *
18
     * @var string
19
     */
20
    protected $signature = 'ls:stub-views {--O|overwrite}';
21
22
    /**
23
     * The console command description.
24
     *
25
     * @var string
26
     */
27
    protected $description = 'Command description';
28
29
    /**
30
     * Create a new command instance.
31
     *
32
     * @return void
33
     */
34
    public function __construct()
35
    {
36
        parent::__construct();
37
    }
38
39
	/**
40
	 * Execute the console command.
41
	 *
42
	 * @return void
43
	 * @throws ApiException
44
	 */
45
    public function handle(): void
46
    {
47
	    $this->makeDirectories();
48
49
	    $client = new ManagementClient(config('storyblok.oauth_token'));
50
51
		$components = collect($client->get('spaces/' . config('storyblok.space_id') . '/components/')->getBody()['components']);
0 ignored issues
show
Bug introduced by
The method getBody() does not exist on stdClass. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

51
		$components = collect($client->get('spaces/' . config('storyblok.space_id') . '/components/')->/** @scrutinizer ignore-call */ getBody()['components']);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
52
53
		$components->each(function ($component) {
54
			$path = resource_path('views/' . str_replace('.', '/', config('storyblok.view_path')) . 'blocks/');
55
			$filename =  $component['name'] . '.blade.php';
56
57
			if ($this->option('overwrite') || !file_exists($path . $filename)) {
58
				$content = file_get_contents(__DIR__ . '/stubs/blade.stub');
59
				$content = str_replace([
60
					'#NAME#',
61
					'#CLASS#'
62
				], [
63
					$component['name'],
64
					$this->getChildClassName('Block', $component['name'])
65
				], $content);
66
67
				$body = '';
68
69
				foreach ($component['schema'] as $name => $field) {
70
					$body = $this->writeBlade($field, $name, $body);
71
				}
72
73
				$content = str_replace('#BODY#', $body, $content);
74
75
				file_put_contents($path . $filename, $content);
76
77
				$this->info('Created: '. $component['name'] . '.blade.php');
78
			}
79
		});
80
    }
81
82
	/**
83
	 * @return void
84
	 */
85
	protected function makeDirectories(): void
86
	{
87
		if (!file_exists(resource_path('views/' . rtrim(config('storyblok.view_path'), '.')))) {
88
			File::makeDirectory(resource_path('views/' . rtrim(config('storyblok.view_path'), '.')));
89
		}
90
91
		if (!file_exists(resource_path('views/' . rtrim(config('storyblok.view_path'), '.') . '/blocks'))) {
92
			File::makeDirectory(resource_path('views/' . rtrim(config('storyblok.view_path'), '.') . '/blocks'));
93
		}
94
	}
95
96
	/**
97
	 * @param $field
98
	 * @param int|string $name
99
	 * @param string $body
100
	 * @return string
101
	 */
102
	protected function writeBlade($field, int|string $name, string $body): string
103
	{
104
		if (!str_starts_with($name, 'tab-')) {
105
			switch ($field['type']) {
106
				case 'options':
107
				case 'bloks':
108
					$body .= "\t" . '@foreach ($block->' . $name . ' as $childBlock)' . "\n";
109
					$body .= "\t\t" . '{{ $childBlock->render() }}' . "\n";
110
					$body .= "\t" . '@endforeach' . "\n";
111
					break;
112
				case 'datetime':
113
					$body .= "\t" . '<time datetime="{{ $block->' . $name . '->content()->toIso8601String() }}">{{ $block->' . $name . ' }}</time>' . "\n";
114
					break;
115
				case 'number':
116
				case 'text':
117
					$body .= "\t" . '<p>{{ $block->' . $name . ' }}</p>' . "\n";
118
					break;
119
				case 'multilink':
120
					$body .= "\t" . '<a href="{{ $block->' . $name . '->cached_url }}"></a>' . "\n";
121
					break;
122
				case 'textarea':
123
				case 'richtext':
124
					$body .= "\t" . '<div>{!! $block->' . $name . ' !!}</div>' . "\n";
125
					break;
126
				case 'asset':
127
					if (in_array('images', $field['filetypes'], true)) {
128
						$body .= "\t" . '@if ($block->' . $name . '->hasFile())' . "\n";
129
						$body .= "\t\t" . '<img src="{{ $block->' . $name . '->transform()->resize(100, 100) }}" alt>' . "\n";
130
						$body .= "\t" . '@endif' . "\n";
131
					} else {
132
						$body .= "\t" . '{{ $block->' . $name . ' }}' . "\n";
133
					}
134
					break;
135
				default:
136
					$body .= "\t" . '{{ $block->' . $name . ' }}' . "\n";
137
			}
138
		}
139
140
		$body .= "\n";
141
		return $body;
142
	}
143
}
144