new datamapper mostly implemented

This commit is contained in:
Dennis Eichhorn 2021-12-11 11:54:17 +01:00
parent e8f2c78bbb
commit 791ffd110b
7 changed files with 93 additions and 65 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?: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<string, array{mapper:string, external:string, by?:string, column?:string, conditional?:bool}>
* @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<string, array{mapper:string, external:string}>
* @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<string, array{mapper:string, table:string, self?:?string, external?:?string, column?:string}>
* @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';
}

View File

@ -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<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?: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';
}

View File

@ -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/';

View File

@ -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());
}
}

View File

@ -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);
}
}