You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
5.1 KiB
176 lines
5.1 KiB
<?php |
|
|
|
namespace core\services\post; |
|
|
|
use core\entities\Meta; |
|
use core\entities\post\Post; |
|
use core\entities\post\PostTag; |
|
use core\forms\post\PostForm; |
|
use core\helpers\PostHelper; |
|
use core\repositories\post\PostCategoryRepository; |
|
use core\repositories\post\PostRepository; |
|
use core\repositories\post\PostTagRepository; |
|
use core\services\TransactionManager; |
|
use Yii; |
|
use yii\base\Exception; |
|
use yii\base\Security; |
|
use yii\helpers\Inflector; |
|
|
|
class PostManageService |
|
{ |
|
private PostRepository $posts; |
|
private PostCategoryRepository $categories; |
|
private PostTagRepository $tags; |
|
private TransactionManager $transaction; |
|
|
|
public function __construct( |
|
PostRepository $posts, |
|
PostCategoryRepository $categories, |
|
PostTagRepository $tags, |
|
TransactionManager $transaction |
|
) |
|
{ |
|
$this->posts = $posts; |
|
$this->categories = $categories; |
|
$this->tags = $tags; |
|
$this->transaction = $transaction; |
|
} |
|
|
|
/** |
|
* @param PostForm $form |
|
* @return Post |
|
* @throws Exception |
|
* @throws \yii\db\Exception |
|
*/ |
|
public function create(PostForm $form): Post |
|
{ |
|
$category = $this->categories->get($form->category_id); |
|
|
|
$post = Post::create( |
|
$category->id, |
|
$form->title, |
|
$form->slug, |
|
$form->description, |
|
$form->content, |
|
$form->type_id, |
|
$form->published_at, |
|
$form->video, |
|
new Meta( |
|
$form->meta->title, |
|
$form->meta->description, |
|
$form->meta->keywords |
|
) |
|
); |
|
|
|
if ($form->image) { |
|
$post->setImage($form->image); |
|
} |
|
else if ($form->video) { |
|
$src = 'https://i.ytimg.com/vi/' . PostHelper::parseYoutubeUrl($post->video) . '/maxresdefault.jpg'; |
|
$filename = (new Security())->generateRandomString(15) . '.jpg'; |
|
copy($src, Yii::getAlias(Post::FILE_ORIGINAL_PATH . '/' . $post->id . '.jpg')); |
|
$post->image = $filename; |
|
} |
|
|
|
$this->transaction->wrap(function () use ($post, $form) { |
|
|
|
if (is_array($form->tags->new_tags) && !empty($form->tags->new_tags)) { |
|
foreach ( $form->tags->new_tags as $tag_name ) { |
|
if ( !$tag = $this->tags->findByName( $tag_name, $form->type_id ) ) { |
|
$tag = PostTag::create( $tag_name, Inflector::slug( $tag_name, '_' ), $form->type_id ); |
|
$this->tags->save( $tag ); |
|
} |
|
$post->assignTag( $tag->id ); |
|
} |
|
} |
|
$this->posts->save($post); |
|
}); |
|
|
|
return $post; |
|
} |
|
|
|
/** |
|
* @param $id |
|
* @param PostForm $form |
|
* @throws Exception |
|
* @throws \yii\db\Exception |
|
*/ |
|
public function edit($id, PostForm $form): void |
|
{ |
|
$post = $this->posts->get($id); |
|
$category = $this->categories->get($form->category_id); |
|
|
|
$post->edit( |
|
$category->id, |
|
$form->title, |
|
$form->slug, |
|
$form->description, |
|
$form->content, |
|
$form->published_at, |
|
$form->video, |
|
new Meta( |
|
$form->meta->title, |
|
$form->meta->description, |
|
$form->meta->keywords |
|
) |
|
); |
|
|
|
if ($form->image) { |
|
$post->cleanFiles(); |
|
$post->setImage($form->image); |
|
} |
|
elseif ($form->video && (!$post->image || $form->reset_image)) { |
|
$post->cleanFiles(); |
|
$src = 'https://i.ytimg.com/vi/' . PostHelper::parseYoutubeUrl($post->video) . '/maxresdefault.jpg'; |
|
$filename = (new Security())->generateRandomString(15) . '.jpg'; |
|
copy($src, Yii::getAlias(Post::FILE_ORIGINAL_PATH . '/' . $post->id . '.jpg')); |
|
$post->image = $filename; |
|
} |
|
elseif ($post->image && $form->reset_image) { |
|
$post->cleanFiles(); |
|
$post->image = null; |
|
$post->updateAttributes(['image']); |
|
} |
|
|
|
$this->transaction->wrap(function () use ($post, $form) { |
|
$post->revokeTags(); |
|
$this->posts->save($post); |
|
|
|
$tag_updated = false; |
|
if (is_array($form->tags->new_tags) && !empty($form->tags->new_tags)) { |
|
foreach ( $form->tags->new_tags as $tag_name ) { |
|
if ( ! $tag = $this->tags->findByName( $tag_name, $form->type_id ) ) { |
|
$tag = PostTag::create( $tag_name, Inflector::slug( $tag_name, '_' ), $form->type_id ); |
|
$this->tags->save( $tag ); |
|
} |
|
$post->assignTag( $tag->id ); |
|
$tag_updated = true; |
|
} |
|
} |
|
|
|
if ($tag_updated) { |
|
$this->posts->save( $post ); |
|
} |
|
}); |
|
} |
|
|
|
public function activate($id): void |
|
{ |
|
$post = $this->posts->get($id); |
|
$post->activate(); |
|
$this->posts->save($post); |
|
} |
|
|
|
public function draft($id): void |
|
{ |
|
$post = $this->posts->get($id); |
|
$post->draft(); |
|
$this->posts->save($post); |
|
} |
|
|
|
public function remove($id): void |
|
{ |
|
$post = $this->posts->get($id); |
|
$this->posts->remove($post); |
|
} |
|
}
|
|
|