Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/Bookmark/Creator.php
<?php

namespace XF\Service\Bookmark;

use
XF\Entity\BookmarkItem;
use
XF\Entity\BookmarkTrait;
use
XF\Mvc\Entity\Entity;
use
XF\Service\AbstractService;
use
XF\Service\ValidateAndSavableTrait;

class
Creator extends AbstractService
{
    use
ValidateAndSavableTrait;

   
/**
     * @var Entity|BookmarkTrait
     */
   
protected $content;

   
/**
     * @var BookmarkItem
     */
   
protected $bookmark;

   
/**
     * @var Preparer
     */
   
protected $preparer;

   
/**
     * @var \XF\Service\Bookmark\LabelChanger
     */
   
protected $labelChanger;

    public function
__construct(\XF\App $app, Entity $content)
    {
       
parent::__construct($app);

       
$this->content = $content;

       
$this->setupBookmark();

       
$this->preparer = $this->service('XF:Bookmark\Preparer', $this->bookmark);
       
$this->labelChanger = $this->service('XF:Bookmark\LabelChanger', $this->bookmark, $this->bookmark->User);
    }

    protected function
setupBookmark()
    {
       
$visitor = \XF::visitor();
       
$bookmark = $this->content->getNewBookmark();
       
$bookmark->user_id = $visitor->user_id;

       
$this->bookmark = $bookmark;
    }

    public function
getContent()
    {
        return
$this->content;
    }

    public function
getBookmark()
    {
        return
$this->bookmark;
    }

    public function
getBookmarkPreparer()
    {
        return
$this->preparer;
    }

    public function
setMessage($message, $format = true)
    {
        return
$this->preparer->setMessage($message, $format);
    }

    public function
setLabels($labels)
    {
       
$this->labelChanger->setLabels($labels);
    }

    protected function
finalSetup()
    {
    }

    protected function
_validate()
    {
       
$this->finalSetup();

       
$this->bookmark->preSave();
        return
$this->bookmark->getErrors();
    }

    protected function
_save()
    {
       
$bookmark = $this->bookmark;

       
$this->db()->beginTransaction();

        try
        {
           
$saved = $bookmark->save();
        }
        catch (\
XF\Db\DuplicateKeyException $e)
        {
           
$saved = false;

           
$dupe = $this->em()->findOne('XF:BookmarkItem', [
               
'user_id' => $bookmark->user_id,
               
'content_type' => $bookmark->content_type,
               
'content_id' => $bookmark->content_id
           
]);
            if (
$dupe)
            {
               
$bookmark = $dupe;
            }
        }

        if (
$saved)
        {
           
$this->preparer->afterInsert();
           
$this->labelChanger->save();
        }

       
$this->db()->commit();

        return
$bookmark;
    }
}