Compare commits
3 commits
c2fb2b6dfc
...
b413934d35
Author | SHA1 | Date | |
---|---|---|---|
b413934d35 | |||
042d119cea | |||
392ead9b3e |
|
@ -3,6 +3,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\DataFixtures;
|
namespace App\DataFixtures;
|
||||||
|
|
||||||
|
use App\Enum\Blog\PostTypeEnum;
|
||||||
use Doctrine\Bundle\FixturesBundle\Fixture;
|
use Doctrine\Bundle\FixturesBundle\Fixture;
|
||||||
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
|
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
|
||||||
use Doctrine\Persistence\ObjectManager;
|
use Doctrine\Persistence\ObjectManager;
|
||||||
|
@ -28,31 +29,31 @@ class LoadPostData extends Fixture implements OrderedFixtureInterface
|
||||||
/** @var User $prWlUser */
|
/** @var User $prWlUser */
|
||||||
$prWlUser = $this->getReference('test_user_'.LoadUserData::USER_PRWL_ID);
|
$prWlUser = $this->getReference('test_user_'.LoadUserData::USER_PRWL_ID);
|
||||||
|
|
||||||
$longPost = (new Post(self::POST_ID_LONG, $mainUser, new \DateTime(), Post::TYPE_POST))
|
$longPost = (new Post(self::POST_ID_LONG, $mainUser, new \DateTime(), PostTypeEnum::Post))
|
||||||
->setText('Test post with many comments')
|
->setText('Test post with many comments')
|
||||||
->setPrivate(false)
|
->setPrivate(false)
|
||||||
->setDeleted(false)
|
->setDeleted(false)
|
||||||
;
|
;
|
||||||
|
|
||||||
$shortPost = (new Post(self::POST_ID_SHORT, $mainUser, new \DateTime(), Post::TYPE_POST))
|
$shortPost = (new Post(self::POST_ID_SHORT, $mainUser, new \DateTime(), PostTypeEnum::Post))
|
||||||
->setText('Test short post')
|
->setText('Test short post')
|
||||||
->setPrivate(false)
|
->setPrivate(false)
|
||||||
->setDeleted(false)
|
->setDeleted(false)
|
||||||
;
|
;
|
||||||
|
|
||||||
$privateUserPost = (new Post(self::POST_ID_PR_USER, $privateUser, new \DateTime(), Post::TYPE_POST))
|
$privateUserPost = (new Post(self::POST_ID_PR_USER, $privateUser, new \DateTime(), PostTypeEnum::Post))
|
||||||
->setText('Post from private user. Should not be visible in the public feed.')
|
->setText('Post from private user. Should not be visible in the public feed.')
|
||||||
->setPrivate(false)
|
->setPrivate(false)
|
||||||
->setDeleted(false)
|
->setDeleted(false)
|
||||||
;
|
;
|
||||||
|
|
||||||
$wlUserPost = (new Post(self::POST_ID_WL_USER, $wlUser, new \DateTime(), Post::TYPE_POST))
|
$wlUserPost = (new Post(self::POST_ID_WL_USER, $wlUser, new \DateTime(), PostTypeEnum::Post))
|
||||||
->setText('Post from whitelist-only user. Should only be visible for whitelisted users.')
|
->setText('Post from whitelist-only user. Should only be visible for whitelisted users.')
|
||||||
->setPrivate(false)
|
->setPrivate(false)
|
||||||
->setDeleted(false)
|
->setDeleted(false)
|
||||||
;
|
;
|
||||||
|
|
||||||
$privateWlUserPost = (new Post(self::POST_ID_PR_WL_USER, $prWlUser, new \DateTime(), Post::TYPE_POST))
|
$privateWlUserPost = (new Post(self::POST_ID_PR_WL_USER, $prWlUser, new \DateTime(), PostTypeEnum::Post))
|
||||||
->setText('Post from private AND whitelist-only user. Should not be visible in the public feed.')
|
->setText('Post from private AND whitelist-only user. Should not be visible in the public feed.')
|
||||||
->setPrivate(false)
|
->setPrivate(false)
|
||||||
->setDeleted(false)
|
->setDeleted(false)
|
||||||
|
|
|
@ -4,9 +4,9 @@ declare(strict_types=1);
|
||||||
namespace App\Entity\Blog;
|
namespace App\Entity\Blog;
|
||||||
|
|
||||||
use App\Entity\User;
|
use App\Entity\User;
|
||||||
|
use App\Enum\Blog\PostTypeEnum;
|
||||||
use App\Repository\Blog\TagRepository;
|
use App\Repository\Blog\TagRepository;
|
||||||
use Doctrine\Common\Collections\ArrayCollection;
|
use Doctrine\Common\Collections\{ArrayCollection, Collection};
|
||||||
use Doctrine\Common\Collections\Collection;
|
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
|
||||||
#[ORM\Entity(repositoryClass: TagRepository::class)]
|
#[ORM\Entity(repositoryClass: TagRepository::class)]
|
||||||
|
@ -14,9 +14,6 @@ use Doctrine\ORM\Mapping as ORM;
|
||||||
#[ORM\Table(name: 'tags', schema: 'posts')]
|
#[ORM\Table(name: 'tags', schema: 'posts')]
|
||||||
class Post
|
class Post
|
||||||
{
|
{
|
||||||
public const TYPE_POST = 'post';
|
|
||||||
public const TYPE_FEED = 'feed';
|
|
||||||
|
|
||||||
#[ORM\Id]
|
#[ORM\Id]
|
||||||
#[ORM\Column(name: 'id', type: 'text')]
|
#[ORM\Column(name: 'id', type: 'text')]
|
||||||
private string $id;
|
private string $id;
|
||||||
|
@ -30,9 +27,8 @@ class Post
|
||||||
#[ORM\Column(name: 'updated_at', type: 'datetime', nullable: true)]
|
#[ORM\Column(name: 'updated_at', type: 'datetime', nullable: true)]
|
||||||
private ?\DateTime $updatedAt;
|
private ?\DateTime $updatedAt;
|
||||||
|
|
||||||
// TODO: Native Enum
|
#[ORM\Column(name: 'type', type: 'string', length: 6, enumType: PostTypeEnum::class)]
|
||||||
#[ORM\Column(name: 'type', type: 'string', length: 6)]
|
private PostTypeEnum $type;
|
||||||
private string $type = self::TYPE_POST;
|
|
||||||
|
|
||||||
#[ORM\Column(name: 'private', type: 'boolean', nullable: true)]
|
#[ORM\Column(name: 'private', type: 'boolean', nullable: true)]
|
||||||
private bool $private;
|
private bool $private;
|
||||||
|
@ -60,7 +56,7 @@ class Post
|
||||||
private Collection $comments;
|
private Collection $comments;
|
||||||
|
|
||||||
|
|
||||||
public function __construct(string $id, User $author, \DateTime $createdAt, string $type)
|
public function __construct(string $id, User $author, \DateTime $createdAt, PostTypeEnum $type)
|
||||||
{
|
{
|
||||||
$this->id = $id;
|
$this->id = $id;
|
||||||
$this->author = $author;
|
$this->author = $author;
|
||||||
|
@ -105,7 +101,7 @@ class Post
|
||||||
return $this->updatedAt;
|
return $this->updatedAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getType(): string
|
public function getType(): PostTypeEnum
|
||||||
{
|
{
|
||||||
return $this->type;
|
return $this->type;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,7 @@ declare(strict_types=1);
|
||||||
namespace App\Entity;
|
namespace App\Entity;
|
||||||
|
|
||||||
use App\Repository\UserRepository;
|
use App\Repository\UserRepository;
|
||||||
use Doctrine\Common\Collections\ArrayCollection;
|
use Doctrine\Common\Collections\{ArrayCollection, Collection};
|
||||||
use Doctrine\Common\Collections\Collection;
|
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
|
||||||
#[ORM\Entity(repositoryClass: UserRepository::class)]
|
#[ORM\Entity(repositoryClass: UserRepository::class)]
|
||||||
|
@ -16,10 +15,6 @@ use Doctrine\ORM\Mapping as ORM;
|
||||||
#[ORM\Index(columns: ['is_removed'], name: 'idx_user_removed')]
|
#[ORM\Index(columns: ['is_removed'], name: 'idx_user_removed')]
|
||||||
class User
|
class User
|
||||||
{
|
{
|
||||||
public const AVATAR_SIZE_SMALL = '24';
|
|
||||||
public const AVATAR_SIZE_MEDIUM = '40';
|
|
||||||
public const AVATAR_SIZE_LARGE = '80';
|
|
||||||
|
|
||||||
#[ORM\Id]
|
#[ORM\Id]
|
||||||
#[ORM\Column(name: 'id', type: 'integer')]
|
#[ORM\Column(name: 'id', type: 'integer')]
|
||||||
private ?int $id = null;
|
private ?int $id = null;
|
||||||
|
|
11
src/Enum/AvatarSizeEnum.php
Normal file
11
src/Enum/AvatarSizeEnum.php
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Enum;
|
||||||
|
|
||||||
|
enum AvatarSizeEnum: int
|
||||||
|
{
|
||||||
|
case Small = 24;
|
||||||
|
case Medium = 40;
|
||||||
|
case Large = 80;
|
||||||
|
}
|
10
src/Enum/Blog/PostTypeEnum.php
Normal file
10
src/Enum/Blog/PostTypeEnum.php
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Enum\Blog;
|
||||||
|
|
||||||
|
enum PostTypeEnum: string
|
||||||
|
{
|
||||||
|
case Post = 'post';
|
||||||
|
case Feed = 'feed';
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Factory\Blog;
|
namespace App\Factory\Blog;
|
||||||
|
|
||||||
|
use App\Enum\Blog\PostTypeEnum;
|
||||||
use App\Factory\AbstractFactory;
|
use App\Factory\AbstractFactory;
|
||||||
use App\Factory\UserFactory;
|
use App\Factory\UserFactory;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
@ -117,7 +118,7 @@ class PostFactory extends AbstractFactory
|
||||||
$postData->getId(),
|
$postData->getId(),
|
||||||
$author,
|
$author,
|
||||||
new \DateTime($postData->getCreated()),
|
new \DateTime($postData->getCreated()),
|
||||||
$postData->getType() ?: Post::TYPE_POST
|
PostTypeEnum::tryFrom($postData->getType()) ?? PostTypeEnum::Post,
|
||||||
);
|
);
|
||||||
$this->postRepository->save($post);
|
$this->postRepository->save($post);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,9 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Twig;
|
namespace App\Twig;
|
||||||
|
|
||||||
use App\Entity\User;
|
use App\Enum\AvatarSizeEnum;
|
||||||
use Twig\Extension\AbstractExtension;
|
use Twig\Extension\AbstractExtension;
|
||||||
use Twig\TwigFilter;
|
use Twig\{TwigFilter, TwigFunction};
|
||||||
use Twig\TwigFunction;
|
|
||||||
|
|
||||||
class PointUrlExtension extends AbstractExtension
|
class PointUrlExtension extends AbstractExtension
|
||||||
{
|
{
|
||||||
|
@ -16,7 +15,7 @@ class PointUrlExtension extends AbstractExtension
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFunctions()
|
public function getFunctions(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
new TwigFunction('point_avatar', [$this, 'avatarFunction']),
|
new TwigFunction('point_avatar', [$this, 'avatarFunction']),
|
||||||
|
@ -29,7 +28,7 @@ class PointUrlExtension extends AbstractExtension
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFilters()
|
public function getFilters(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
new TwigFilter('point_avatar', [$this, 'avatarFunction']),
|
new TwigFilter('point_avatar', [$this, 'avatarFunction']),
|
||||||
|
@ -44,20 +43,20 @@ class PointUrlExtension extends AbstractExtension
|
||||||
|
|
||||||
public function avatarSmallFunction(string $login): string
|
public function avatarSmallFunction(string $login): string
|
||||||
{
|
{
|
||||||
return $this->avatarFunction($login, User::AVATAR_SIZE_SMALL);
|
return $this->avatarFunction($login, AvatarSizeEnum::Small);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function avatarMediumFunction(string $login): string
|
public function avatarMediumFunction(string $login): string
|
||||||
{
|
{
|
||||||
return $this->avatarFunction($login, User::AVATAR_SIZE_MEDIUM);
|
return $this->avatarFunction($login, AvatarSizeEnum::Medium);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function avatarLargeFunction(string $login): string
|
public function avatarLargeFunction(string $login): string
|
||||||
{
|
{
|
||||||
return $this->avatarFunction($login, User::AVATAR_SIZE_LARGE);
|
return $this->avatarFunction($login, AvatarSizeEnum::Large);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function avatarFunction(string $login, $size): string
|
public function avatarFunction(string $login, AvatarSizeEnum $size): string
|
||||||
{
|
{
|
||||||
return $this->getAvatarUrlByLogin($login, $size);
|
return $this->getAvatarUrlByLogin($login, $size);
|
||||||
}
|
}
|
||||||
|
@ -77,12 +76,8 @@ class PointUrlExtension extends AbstractExtension
|
||||||
return sprintf('%s://%s/%s', $this->pointScheme, $this->pointDomain, $postId);
|
return sprintf('%s://%s/%s', $this->pointScheme, $this->pointDomain, $postId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getAvatarUrlByLogin(string $login, string $size): string
|
private function getAvatarUrlByLogin(string $login, AvatarSizeEnum $size): string
|
||||||
{
|
{
|
||||||
if (!in_array($size, [User::AVATAR_SIZE_SMALL, User::AVATAR_SIZE_MEDIUM, User::AVATAR_SIZE_LARGE], true)) {
|
return sprintf('%s://%s/avatar/%s/%s', $this->pointScheme, $this->pointDomain, \urlencode($login), $size->value);
|
||||||
throw new \InvalidArgumentException('Avatar size must be one of restricted variants. See User::AVATAR_SIZE_* constants.');
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('%s://%s/avatar/%s/%s', $this->pointScheme, $this->pointDomain, urlencode($login), $size);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue