diff --git a/Controller/ApiController.php b/Controller/ApiController.php index f2e4827..8a2530a 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -89,7 +89,7 @@ final class ApiController extends Controller */ public function apiNewsUpdate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - $old = clone NewsArticleMapper::get((int) $request->getData('id')); + $old = clone NewsArticleMapper::get()->where('id', (int) $request->getData('id'))->execute(); $new = $this->updateNewsFromRequest($request); $this->updateModel($request->header->account, $old, $new, NewsArticleMapper::class, 'news', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'News', 'News successfully updated', $new); @@ -107,7 +107,7 @@ final class ApiController extends Controller private function updateNewsFromRequest(RequestAbstract $request) : NewsArticle { /** @var NewsArticle $newsArticle */ - $newsArticle = NewsArticleMapper::get((int) $request->getData('id')); + $newsArticle = NewsArticleMapper::get()->where('id', (int) $request->getData('id'))->execute(); $newsArticle->publich = new \DateTime((string) ($request->getData('publish') ?? $newsArticle->publish->format('Y-m-d H:i:s'))); $newsArticle->title = (string) ($request->getData('title') ?? $newsArticle->title); $newsArticle->plain = $request->getData('plain') ?? $newsArticle->plain; @@ -234,7 +234,7 @@ final class ApiController extends Controller */ public function apiNewsGet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - $news = NewsArticleMapper::get((int) $request->getData('id')); + $news = NewsArticleMapper::get()->where('id', (int) $request->getData('id'))->execute(); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'News', 'News successfully returned', $news); } @@ -253,7 +253,7 @@ final class ApiController extends Controller */ public function apiNewsDelete(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - $news = NewsArticleMapper::get((int) $request->getData('id')); + $news = NewsArticleMapper::get()->with('media')->with('tags')->where('id', (int) $request->getData('id'))->execute(); $this->deleteModel($request->header->account, $news, NewsArticleMapper::class, 'news', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'News', 'News successfully deleted', $news); } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index ee7df19..4544cd1 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -24,6 +24,7 @@ use Modules\News\Models\NullNewsSeen; use Modules\News\Models\PermissionState; use phpOMS\Account\PermissionType; use phpOMS\Contract\RenderableInterface; +use phpOMS\DataStorage\Database\Query\OrderType; use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; @@ -59,47 +60,48 @@ final class BackendController extends Controller implements DashboardElementInte $view->setTemplate('/Modules/News/Theme/Backend/news-dashboard'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000601001, $request, $response)); + $mapperQuery = NewsArticleMapper::getAll() + ->with('createdBy') + ->with('tags') + ->with('tags/title') + ->where('status', NewsStatus::VISIBLE) + ->where('publish', new \DateTime('now'), '<=') + ->where('language', $response->getLanguage()) + ->where('tags/title/language', $response->getLanguage()); + if ($request->getData('ptype') === 'p') { $view->setData('news', - NewsArticleMapper::with('language', $response->getLanguage()) - ::with('comments', models: null) - ::with('status', NewsStatus::VISIBLE, [NewsArticle::class]) - ::with('publish', new \DateTime('now'), [NewsArticle::class], '<=') - ::getBeforePivot((int) ($request->getData('id') ?? 0), null, 10) + $mapperQuery->where('id', (int) ($request->getData('id') ?? 0), '<') + ->limit(25)->execute() ); } elseif ($request->getData('ptype') === 'n') { $view->setData('news', - NewsArticleMapper::with('language', $response->getLanguage()) - ::with('comments', models: null) - ::with('status', NewsStatus::VISIBLE, [NewsArticle::class]) - ::with('publish', new \DateTime('now'), [NewsArticle::class], '<=') - ::getAfterPivot((int) ($request->getData('id') ?? 0), null, 10) + $mapperQuery->where('id', (int) ($request->getData('id') ?? 0), '>') + ->limit(25)->execute() ); } else { $view->setData('news', - NewsArticleMapper::with('language', $response->getLanguage()) - ::with('comments', models: null) - ::with('status', NewsStatus::VISIBLE, [NewsArticle::class]) - ::with('publish', new \DateTime('now'), [NewsArticle::class], '<=') - ::getAfterPivot(0, null, 10) + $mapperQuery->where('id', 0, '>') + ->limit(25)->execute() ); } - $seen = NewsSeenMapper::getFor($request->header->account, 'seenBy'); + $seen = NewsSeenMapper::get()->where('seenBy', $request->header->account)->execute(); $view->setData('seen', $seen->seenAt); // @async + // @todo: Seen needs field which defines which news article is seen!!!! if ($seen instanceof NullNewsSeen) { $seen = new NewsSeen(); $seen->seenBy = (int) $request->header->account; $seen->seenAt = new \DateTime('now'); - NewsSeenMapper::create($seen); + NewsSeenMapper::create()->execute($seen); } else { $newSeen = clone $seen; $newSeen->seenAt = new \DateTime('now'); - NewsSeenMapper::update($newSeen); + NewsSeenMapper::update()->execute($newSeen); } return $view; @@ -114,9 +116,15 @@ final class BackendController extends Controller implements DashboardElementInte $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/News/Theme/Backend/dashboard-news'); - $news = NewsArticleMapper::with('language', $response->getLanguage()) - ::with('publish', new \DateTime('now'), [NewsArticle::class], '<=') - ::getNewest(5); + $news = NewsArticleMapper::getAll() + ->with('createdBy') + ->with('tags') + ->with('tags/title') + ->where('status', NewsStatus::VISIBLE) + ->where('publish', new \DateTime('now'), '<=') + ->where('language', $response->getLanguage()) + ->where('tags/title/language', $response->getLanguage()) + ->limit(5)->sort('publish', OrderType::DESC)->execute(); $view->addData('news', $news); @@ -139,8 +147,20 @@ final class BackendController extends Controller implements DashboardElementInte { $view = new View($this->app->l11nManager, $request, $response); - $article = NewsArticleMapper::with('language', $response->getLanguage()) - ::get((int) $request->getData('id')); + $article = NewsArticleMapper::get() + ->with('createdBy') + ->with('comments') + ->with('comments/comments') + ->with('comments/comments/createdBy') + ->with('comments/comments/media') + ->with('tags') + ->with('tags/title') + ->where('status', NewsStatus::VISIBLE) + ->where('publish', new \DateTime('now'), '<=') + ->where('language', $response->getLanguage()) + ->where('tags/title/language', $response->getLanguage()) + ->where('id', (int) $request->getData('id')) + ->execute(); $accountId = $request->header->account; @@ -193,22 +213,30 @@ final class BackendController extends Controller implements DashboardElementInte $view->setTemplate('/Modules/News/Theme/Backend/news-archive'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000601001, $request, $response)); + $mapperQuery = NewsArticleMapper::getAll() + ->with('createdBy') + ->with('tags') + ->with('tags/title') + ->where('status', NewsStatus::VISIBLE) + ->where('publish', new \DateTime('now'), '<=') + ->where('language', $response->getLanguage()) + ->where('tags/title/language', $response->getLanguage()); + if ($request->getData('ptype') === 'p') { $view->setData('news', - NewsArticleMapper::with('status', NewsStatus::VISIBLE, [NewsArticle::class]) - ::with('publish', new \DateTime('now'), [NewsArticle::class], '<=') - ::getBeforePivot((int) ($request->getData('id') ?? 0), null, 25) + $mapperQuery->where('id', (int) ($request->getData('id') ?? 0), '<') + ->limit(25)->execute() ); } elseif ($request->getData('ptype') === 'n') { $view->setData('news', - NewsArticleMapper::with('status', NewsStatus::VISIBLE, [NewsArticle::class]) - ::with('publish', new \DateTime('now'), [NewsArticle::class], '<=') - ::getAfterPivot((int) ($request->getData('id') ?? 0), null, 25) + $mapperQuery->where('id', (int) ($request->getData('id') ?? 0), '>') + ->limit(25)->execute() ); } else { - $view->setData('news', NewsArticleMapper::with('status', NewsStatus::VISIBLE, [NewsArticle::class]) - ::with('publish', new \DateTime('now'), [NewsArticle::class], '<=') - ::getAfterPivot(0, null, 25)); + $view->setData('news', + $mapperQuery->where('id', 0, '>') + ->limit(25)->execute() + ); } return $view; @@ -235,14 +263,14 @@ final class BackendController extends Controller implements DashboardElementInte if ($request->getData('ptype') === 'p') { $view->setData('news', - NewsArticleMapper::getBeforePivot((int) ($request->getData('id') ?? 0), null, 25) + NewsArticleMapper::getAll()->where('id', (int) ($request->getData('id') ?? 0), '<')->limit(25)->execute() ); } elseif ($request->getData('ptype') === 'n') { $view->setData('news', - NewsArticleMapper::getAfterPivot((int) ($request->getData('id') ?? 0), null, 25) + NewsArticleMapper::getAll()->where('id', (int) ($request->getData('id') ?? 0), '>')->limit(25)->execute() ); } else { - $view->setData('news', NewsArticleMapper::getAfterPivot(0, null, 25)); + $view->setData('news', NewsArticleMapper::getAll()->where('id', 0, '>')->limit(25)->execute()); } return $view; @@ -307,7 +335,7 @@ final class BackendController extends Controller implements DashboardElementInte $tagSelector = new \Modules\Tag\Theme\Backend\Components\TagSelector\BaseView($this->app->l11nManager, $request, $response); $view->addData('tagSelector', $tagSelector); - $view->addData('news', NewsArticleMapper::get((int) ($request->getData('id') ?? 0))); + $view->addData('news', NewsArticleMapper::get()->where('id', (int) ($request->getData('id') ?? 0))->execute()); return $view; } diff --git a/Models/NewsArticleMapper.php b/Models/NewsArticleMapper.php index ccc106b..e4bd0c7 100755 --- a/Models/NewsArticleMapper.php +++ b/Models/NewsArticleMapper.php @@ -18,7 +18,7 @@ use Modules\Admin\Models\AccountMapper; use Modules\Comments\Models\CommentListMapper; use Modules\Media\Models\MediaMapper; use Modules\Tag\Models\TagMapper; -use phpOMS\DataStorage\Database\DataMapperAbstract; +use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; /** * News mapper class. @@ -28,7 +28,7 @@ use phpOMS\DataStorage\Database\DataMapperAbstract; * @link https://orange-management.org * @since 1.0.0 */ -final class NewsArticleMapper extends DataMapperAbstract +final class NewsArticleMapper extends DataMapperFactory { /** * Columns. @@ -36,7 +36,7 @@ final class NewsArticleMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $columns = [ + public const COLUMNS = [ 'news_id' => ['name' => 'news_id', 'type' => 'int', 'internal' => 'id'], 'news_publish' => ['name' => 'news_publish', 'type' => 'DateTime', 'internal' => 'publish'], 'news_title' => ['name' => 'news_title', 'type' => 'string', 'internal' => 'title'], @@ -57,7 +57,7 @@ final class NewsArticleMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $ownsOne = [ + public const OWNS_ONE = [ 'comments' => [ 'mapper' => CommentListMapper::class, 'external' => 'news_comment_list', @@ -70,7 +70,7 @@ final class NewsArticleMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $belongsTo = [ + public const BELONGS_TO = [ 'createdBy' => [ 'mapper' => AccountMapper::class, 'external' => 'news_created_by', @@ -83,7 +83,7 @@ final class NewsArticleMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $hasMany = [ + public const HAS_MANY = [ 'tags' => [ 'mapper' => TagMapper::class, 'table' => 'news_tag', @@ -104,7 +104,7 @@ final class NewsArticleMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $table = 'news'; + public const TABLE = 'news'; /** * Primary field name. @@ -112,5 +112,5 @@ final class NewsArticleMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $primaryField = 'news_id'; + public const PRIMARYFIELD ='news_id'; } diff --git a/Models/NewsSeenMapper.php b/Models/NewsSeenMapper.php index d44bc20..69e70a1 100755 --- a/Models/NewsSeenMapper.php +++ b/Models/NewsSeenMapper.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Modules\News\Models; -use phpOMS\DataStorage\Database\DataMapperAbstract; +use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; /** * News mapper class. @@ -29,7 +29,7 @@ use phpOMS\DataStorage\Database\DataMapperAbstract; * I think the default getAll etc. is too complicated and has too many joins which are not really required. * Check and fix! */ -final class NewsSeenMapper extends DataMapperAbstract +final class NewsSeenMapper extends DataMapperFactory { /** * Columns. @@ -37,7 +37,7 @@ final class NewsSeenMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $columns = [ + public const COLUMNS = [ 'news_seen_id' => ['name' => 'news_seen_id', 'type' => 'int', 'internal' => 'id'], 'news_seen_at' => ['name' => 'news_seen_at', 'type' => 'DateTime', 'internal' => 'seenAt'], 'news_seen_by' => ['name' => 'news_seen_by', 'type' => 'int', 'internal' => 'seenBy'], @@ -49,7 +49,7 @@ final class NewsSeenMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $table = 'news_seen'; + public const TABLE = 'news_seen'; /** * Primary field name. @@ -57,5 +57,5 @@ final class NewsSeenMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $primaryField = 'news_seen_id'; + public const PRIMARYFIELD ='news_seen_id'; } diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index f5fc99c..252a62f 100755 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -12,7 +12,7 @@ require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/Autoloader.php'; use phpOMS\DataStorage\Database\DatabasePool; -use phpOMS\DataStorage\Database\DataMapperAbstract; +use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; use phpOMS\DataStorage\Session\HttpSession; $CONFIG = [ @@ -329,7 +329,7 @@ $GLOBALS['dbpool']->create('delete', $CONFIG['db']['core']['masters']['delete']) $GLOBALS['dbpool']->create('insert', $CONFIG['db']['core']['masters']['insert']); $GLOBALS['dbpool']->create('schema', $CONFIG['db']['core']['masters']['schema']); -DataMapperAbstract::setConnection($GLOBALS['dbpool']->get()); +DataMapperFactory::db($GLOBALS['dbpool']->get()); $GLOBALS['frameworkpath'] = '/phpOMS/'; diff --git a/tests/Controller/Api/ApiControllerNewsArticleTrait.php b/tests/Controller/Api/ApiControllerNewsArticleTrait.php index e4f5440..56a9fb5 100755 --- a/tests/Controller/Api/ApiControllerNewsArticleTrait.php +++ b/tests/Controller/Api/ApiControllerNewsArticleTrait.php @@ -138,6 +138,6 @@ trait ApiControllerNewsArticleTrait $this->module->apiNewsDelete($request, $response); self::assertEquals(1, $response->get('')['response']->getId()); - self::assertInstanceOf(NullNewsArticle::class, NewsArticleMapper::get(1)); + self::assertInstanceOf(NullNewsArticle::class, NewsArticleMapper::get()->where('id', 1)->execute()); } } diff --git a/tests/Models/NewsArticleMapperTest.php b/tests/Models/NewsArticleMapperTest.php index c78f3d0..4dea78c 100755 --- a/tests/Models/NewsArticleMapperTest.php +++ b/tests/Models/NewsArticleMapperTest.php @@ -49,11 +49,11 @@ final class NewsArticleMapperTest extends \PHPUnit\Framework\TestCase $news->setStatus(NewsStatus::VISIBLE); $news->setType(NewsType::HEADLINE); - $id = NewsArticleMapper::create($news); + $id = NewsArticleMapper::create()->execute($news); self::assertGreaterThan(0, $news->getId()); self::assertEquals($id, $news->getId()); - $newsR = NewsArticleMapper::get($news->getId()); + $newsR = NewsArticleMapper::get()->where('id', $news->getId())->execute(); self::assertEquals($news->createdAt->format('Y-m-d'), $newsR->createdAt->format('Y-m-d')); self::assertEquals($news->createdBy->getId(), $newsR->createdBy->getId()); self::assertEquals($news->content, $newsR->content); @@ -87,7 +87,7 @@ final class NewsArticleMapperTest extends \PHPUnit\Framework\TestCase $news->setStatus(NewsStatus::VISIBLE); $news->setType(NewsType::HEADLINE); - $id = NewsArticleMapper::create($news); + $id = NewsArticleMapper::create()->execute($news); $news = new NewsArticle(); $news->createdBy = new NullAccount(1); @@ -99,7 +99,7 @@ final class NewsArticleMapperTest extends \PHPUnit\Framework\TestCase $news->setStatus(NewsStatus::DRAFT); $news->setType(NewsType::HEADLINE); - $id = NewsArticleMapper::create($news); + $id = NewsArticleMapper::create()->execute($news); // Created by me @@ -113,7 +113,7 @@ final class NewsArticleMapperTest extends \PHPUnit\Framework\TestCase $news->setStatus(NewsStatus::VISIBLE); $news->setType(NewsType::ARTICLE); - $id = NewsArticleMapper::create($news); + $id = NewsArticleMapper::create()->execute($news); $news = new NewsArticle(); $news->createdBy = new NullAccount(1); @@ -125,7 +125,7 @@ final class NewsArticleMapperTest extends \PHPUnit\Framework\TestCase $news->setStatus(NewsStatus::VISIBLE); $news->setType(NewsType::LINK); - $id = NewsArticleMapper::create($news); + $id = NewsArticleMapper::create()->execute($news); $news = new NewsArticle(); $news->createdBy = new NullAccount(1); @@ -137,7 +137,7 @@ final class NewsArticleMapperTest extends \PHPUnit\Framework\TestCase $news->setStatus(NewsStatus::DRAFT); $news->setType(NewsType::ARTICLE); - $id = NewsArticleMapper::create($news); + $id = NewsArticleMapper::create()->execute($news); // Language @@ -151,7 +151,7 @@ final class NewsArticleMapperTest extends \PHPUnit\Framework\TestCase $news->setStatus(NewsStatus::VISIBLE); $news->setType(NewsType::ARTICLE); - $id = NewsArticleMapper::create($news); + $id = NewsArticleMapper::create()->execute($news); // Publish @@ -168,6 +168,6 @@ final class NewsArticleMapperTest extends \PHPUnit\Framework\TestCase $news->setStatus(NewsStatus::VISIBLE); $news->setType(NewsType::ARTICLE); - $id = NewsArticleMapper::create($news); + $id = NewsArticleMapper::create()->execute($news); } }