Compare commits
5 commits
0a8c6b0395
...
ab3a54bde9
Author | SHA1 | Date | |
---|---|---|---|
ab3a54bde9 | |||
2673272fc7 | |||
a58cd2a1ea | |||
b7cf85fbcd | |||
34718ceaf4 |
|
@ -19,7 +19,7 @@ doctrine:
|
||||||
dql:
|
dql:
|
||||||
string_functions:
|
string_functions:
|
||||||
# TODO fix to receive correct DateTime instead of string
|
# TODO fix to receive correct DateTime instead of string
|
||||||
DAY: App\DQL\Day
|
DAY: App\Doctrine\DQL\Day
|
||||||
|
|
||||||
when@test:
|
when@test:
|
||||||
doctrine:
|
doctrine:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# https://github.com/KnpLabs/KnpPaginatorBundle#yaml
|
# https://github.com/KnpLabs/KnpPaginatorBundle#yaml
|
||||||
knp_paginator:
|
knp_paginator:
|
||||||
template:
|
template:
|
||||||
pagination: 'KnpPaginatorBundle:Pagination:twitter_bootstrap_v3_pagination.html.twig'
|
pagination: '@KnpPaginator/Pagination/bootstrap_v5_pagination.html.twig'
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
index:
|
index:
|
||||||
path: /
|
path: /
|
||||||
defaults: { _controller: App\Controller\MainController::indexAction }
|
defaults: { _controller: App\Controller\MainController::index }
|
||||||
methods: [POST, GET]
|
methods: [POST, GET]
|
||||||
|
|
||||||
user_search_ajax:
|
user_search_ajax:
|
||||||
|
|
|
@ -15,7 +15,7 @@ class ApiController
|
||||||
*
|
*
|
||||||
* @ParamConverter("user", class="SkobkinPointToolsBundle:User")
|
* @ParamConverter("user", class="SkobkinPointToolsBundle:User")
|
||||||
*/
|
*/
|
||||||
public function lastUserSubscribersByIdAction(User $user, SubscriptionEventRepository $subscriptionEventRepository): Response
|
public function lastUserSubscribersById(User $user, SubscriptionEventRepository $subscriptionEventRepository): Response
|
||||||
{
|
{
|
||||||
$qb = $subscriptionEventRepository->createQueryBuilder('se');
|
$qb = $subscriptionEventRepository->createQueryBuilder('se');
|
||||||
$qb
|
$qb
|
||||||
|
|
|
@ -10,7 +10,7 @@ use Symfony\Component\HttpFoundation\{Request, Response};
|
||||||
|
|
||||||
class EventsController extends AbstractController
|
class EventsController extends AbstractController
|
||||||
{
|
{
|
||||||
public function lastAction(Request $request, SubscriptionEventRepository $eventRepository, PaginatorInterface $paginator): Response
|
public function last(Request $request, SubscriptionEventRepository $eventRepository, PaginatorInterface $paginator): Response
|
||||||
{
|
{
|
||||||
$eventsPagination = $paginator->paginate(
|
$eventsPagination = $paginator->paginate(
|
||||||
$eventRepository->createLastSubscriptionEventsQuery(),
|
$eventRepository->createLastSubscriptionEventsQuery(),
|
||||||
|
|
|
@ -19,7 +19,7 @@ class MainController extends AbstractController
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function indexAction(
|
public function index(
|
||||||
Request $request,
|
Request $request,
|
||||||
UserRepository $userRepository,
|
UserRepository $userRepository,
|
||||||
SubscriptionRepository $subscriptionRepository,
|
SubscriptionRepository $subscriptionRepository,
|
||||||
|
@ -56,7 +56,7 @@ class MainController extends AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns user search autocomplete data in JSON */
|
/** Returns user search autocomplete data in JSON */
|
||||||
public function searchUserAjaxAction(string $login, UserRepository $userRepository): JsonResponse
|
public function searchUserAjax(string $login, UserRepository $userRepository): JsonResponse
|
||||||
{
|
{
|
||||||
$result = [];
|
$result = [];
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ class PostController extends AbstractController
|
||||||
/**
|
/**
|
||||||
* @ParamConverter("post", class="SkobkinPointToolsBundle:Blogs\Post")
|
* @ParamConverter("post", class="SkobkinPointToolsBundle:Blogs\Post")
|
||||||
*/
|
*/
|
||||||
public function showAction(Post $post, PostRepository $postRepository): Response
|
public function show(Post $post, PostRepository $postRepository): Response
|
||||||
{
|
{
|
||||||
if ((!$post->getAuthor()->isPublic()) || $post->getAuthor()->isWhitelistOnly()) {
|
if ((!$post->getAuthor()->isPublic()) || $post->getAuthor()->isWhitelistOnly()) {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,7 +12,7 @@ class PublicFeedController extends AbstractController
|
||||||
{
|
{
|
||||||
private const POSTS_PER_PAGE = 20;
|
private const POSTS_PER_PAGE = 20;
|
||||||
|
|
||||||
public function indexAction(Request $request, PostRepository $postRepository, PaginatorInterface $paginator): Response
|
public function index(Request $request, PostRepository $postRepository, PaginatorInterface $paginator): Response
|
||||||
{
|
{
|
||||||
$postsPagination = $paginator->paginate(
|
$postsPagination = $paginator->paginate(
|
||||||
$postRepository->createPublicFeedPostsQuery(),
|
$postRepository->createPublicFeedPostsQuery(),
|
||||||
|
|
|
@ -19,7 +19,7 @@ class UserController extends AbstractController
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function showAction(
|
public function show(
|
||||||
Request $request,
|
Request $request,
|
||||||
string $login,
|
string $login,
|
||||||
SubscriptionEventRepository $subscriptionEventRepository,
|
SubscriptionEventRepository $subscriptionEventRepository,
|
||||||
|
@ -40,7 +40,7 @@ class UserController extends AbstractController
|
||||||
10
|
10
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->render('SkobkinPointToolsBundle:User:show.html.twig', [
|
return $this->render('Web/User/show.html.twig', [
|
||||||
'user' => $user,
|
'user' => $user,
|
||||||
'subscribers' => $userRepository->findUserSubscribersById($user->getId()),
|
'subscribers' => $userRepository->findUserSubscribersById($user->getId()),
|
||||||
'subscriptions_log' => $subscriberEventsPagination,
|
'subscriptions_log' => $subscriberEventsPagination,
|
||||||
|
@ -48,12 +48,12 @@ class UserController extends AbstractController
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function topAction(UserRepository $userRepository, SubscriptionEventRepository $subscriptionEventRepository): Response
|
public function top(UserRepository $userRepository, SubscriptionEventRepository $subscriptionEventRepository): Response
|
||||||
{
|
{
|
||||||
$topUsers = $userRepository->getTopUsers();
|
$topUsers = $userRepository->getTopUsers();
|
||||||
$eventsByDay = $subscriptionEventRepository->getLastEventsByDay();
|
$eventsByDay = $subscriptionEventRepository->getLastEventsByDay();
|
||||||
|
|
||||||
return $this->render('@SkobkinPointTools/User/top.html.twig', [
|
return $this->render('Web/User/top.html.twig', [
|
||||||
'events_dynamic_chat' => $this->createEventsDynamicChart($eventsByDay),
|
'events_dynamic_chat' => $this->createEventsDynamicChart($eventsByDay),
|
||||||
'top_chart' => $this->createTopUsersGraph($topUsers),
|
'top_chart' => $this->createTopUsersGraph($topUsers),
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -3,11 +3,10 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Entity\Blog;
|
namespace App\Entity\Blog;
|
||||||
|
|
||||||
use App\Entity\Blog\File;
|
|
||||||
use App\Entity\Blog\Post;
|
|
||||||
use App\Entity\User;
|
use App\Entity\User;
|
||||||
use App\Repository\Blog\CommentRepository;
|
use App\Repository\Blog\CommentRepository;
|
||||||
use Doctrine\Common\Collections\ArrayCollection;
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
|
||||||
#[ORM\Entity(repositoryClass: CommentRepository::class)]
|
#[ORM\Entity(repositoryClass: CommentRepository::class)]
|
||||||
|
@ -43,20 +42,20 @@ class Comment
|
||||||
#[ORM\JoinColumn(name: 'author_id')]
|
#[ORM\JoinColumn(name: 'author_id')]
|
||||||
private User $author;
|
private User $author;
|
||||||
|
|
||||||
/** @var ArrayCollection|File[] */
|
/** @var Collection<int, File> */
|
||||||
#[ORM\ManyToMany(targetEntity: File::class, fetch: 'EXTRA_LAZY')]
|
#[ORM\ManyToMany(targetEntity: File::class, fetch: 'EXTRA_LAZY')]
|
||||||
#[ORM\JoinTable(name: 'comments_files', schema: 'posts')]
|
#[ORM\JoinTable(name: 'comments_files', schema: 'posts')]
|
||||||
#[ORM\JoinColumn(name: 'comment_id')]
|
#[ORM\JoinColumn(name: 'comment_id')]
|
||||||
#[ORM\InverseJoinColumn(name: 'file_id')]
|
#[ORM\InverseJoinColumn(name: 'file_id')]
|
||||||
private ArrayCollection $files;
|
private Collection $files;
|
||||||
|
|
||||||
#[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'children')]
|
#[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'children')]
|
||||||
#[ORM\JoinColumn(name: 'parent_id', nullable: true)]
|
#[ORM\JoinColumn(name: 'parent_id', nullable: true)]
|
||||||
private ?self $parent;
|
private ?self $parent;
|
||||||
|
|
||||||
/** @var ArrayCollection|self[] */
|
/** @var Collection<int, self> */
|
||||||
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class, fetch: 'EXTRA_LAZY')]
|
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class, fetch: 'EXTRA_LAZY')]
|
||||||
private ArrayCollection $children;
|
private Collection $children;
|
||||||
|
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
|
@ -159,10 +158,8 @@ class Comment
|
||||||
$this->files->removeElement($files);
|
$this->files->removeElement($files);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** @return Collection<int, File> */
|
||||||
* @return File[]|ArrayCollection
|
public function getFiles(): Collection
|
||||||
*/
|
|
||||||
public function getFiles(): iterable
|
|
||||||
{
|
{
|
||||||
return $this->files;
|
return $this->files;
|
||||||
}
|
}
|
||||||
|
@ -208,8 +205,8 @@ class Comment
|
||||||
$this->children->removeElement($children);
|
$this->children->removeElement($children);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return ArrayCollection|self[] */
|
/** @return Collection<int, self> */
|
||||||
public function getChildren(): iterable
|
public function getChildren(): Collection
|
||||||
{
|
{
|
||||||
return $this->children;
|
return $this->children;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ namespace App\Entity\Blog;
|
||||||
use App\Entity\User;
|
use App\Entity\User;
|
||||||
use App\Repository\Blog\TagRepository;
|
use App\Repository\Blog\TagRepository;
|
||||||
use Doctrine\Common\Collections\ArrayCollection;
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
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)]
|
||||||
|
@ -29,6 +30,7 @@ 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)]
|
#[ORM\Column(name: 'type', type: 'string', length: 6)]
|
||||||
private string $type = self::TYPE_POST;
|
private string $type = self::TYPE_POST;
|
||||||
|
|
||||||
|
@ -42,19 +44,20 @@ class Post
|
||||||
#[ORM\JoinColumn(name: 'author')]
|
#[ORM\JoinColumn(name: 'author')]
|
||||||
private User $author;
|
private User $author;
|
||||||
|
|
||||||
/** @var ArrayCollection|File[] */
|
/** @var Collection<int, File> */
|
||||||
#[ORM\ManyToMany(targetEntity: File::class, cascade: ['persist'], fetch: 'EXTRA_LAZY')]
|
#[ORM\ManyToMany(targetEntity: File::class, cascade: ['persist'], fetch: 'EXTRA_LAZY')]
|
||||||
#[ORM\JoinTable(name: 'posts_files', schema: 'posts')]
|
#[ORM\JoinTable(name: 'posts_files', schema: 'posts')]
|
||||||
#[ORM\JoinColumn(name: 'post_id')]
|
#[ORM\JoinColumn(name: 'post_id')]
|
||||||
#[ORM\InverseJoinColumn(name: 'file_id')]
|
#[ORM\InverseJoinColumn(name: 'file_id')]
|
||||||
private $files;
|
private Collection $files;
|
||||||
|
|
||||||
|
/** @var Collection<int, PostTag> */
|
||||||
#[ORM\OneToMany(mappedBy: 'post', targetEntity: PostTag::class, cascade: ['persist'], fetch: 'EXTRA_LAZY', orphanRemoval: true)]
|
#[ORM\OneToMany(mappedBy: 'post', targetEntity: PostTag::class, cascade: ['persist'], fetch: 'EXTRA_LAZY', orphanRemoval: true)]
|
||||||
private ArrayCollection $postTags;
|
private Collection $postTags;
|
||||||
|
|
||||||
/** @var ArrayCollection|Comment[] */
|
/** @var Collection<int, Comment> */
|
||||||
#[ORM\OneToMany(targetEntity: Comment::class, mappedBy: 'post', cascade: ['persist'], )]
|
#[ORM\OneToMany(mappedBy: 'post', targetEntity: Comment::class, cascade: ['persist'])]
|
||||||
private ArrayCollection $comments;
|
private Collection $comments;
|
||||||
|
|
||||||
|
|
||||||
public function __construct(string $id, User $author, \DateTime $createdAt, string $type)
|
public function __construct(string $id, User $author, \DateTime $createdAt, string $type)
|
||||||
|
@ -124,8 +127,8 @@ class Post
|
||||||
$this->files->removeElement($files);
|
$this->files->removeElement($files);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return File[]|ArrayCollection */
|
/** @return Collection<int, File> */
|
||||||
public function getFiles(): iterable
|
public function getFiles(): Collection
|
||||||
{
|
{
|
||||||
return $this->files;
|
return $this->files;
|
||||||
}
|
}
|
||||||
|
@ -142,8 +145,8 @@ class Post
|
||||||
$this->postTags->removeElement($tag);
|
$this->postTags->removeElement($tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return PostTag[]|ArrayCollection */
|
/** @return Collection<int, PostTag> */
|
||||||
public function getPostTags(): iterable
|
public function getPostTags(): Collection
|
||||||
{
|
{
|
||||||
return $this->postTags;
|
return $this->postTags;
|
||||||
}
|
}
|
||||||
|
@ -195,8 +198,8 @@ class Post
|
||||||
$this->comments->removeElement($comment);
|
$this->comments->removeElement($comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return Comment[]|ArrayCollection */
|
/** @return Collection<int, Comment> */
|
||||||
public function getComments(): iterable
|
public function getComments(): Collection
|
||||||
{
|
{
|
||||||
return $this->comments;
|
return $this->comments;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ namespace App\Entity;
|
||||||
|
|
||||||
use App\Repository\UserRepository;
|
use App\Repository\UserRepository;
|
||||||
use Doctrine\Common\Collections\ArrayCollection;
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
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)]
|
||||||
|
@ -41,14 +42,17 @@ class User
|
||||||
#[ORM\Column(name: 'whitelist_only', type: 'boolean', nullable: false, options: ['default' => false])]
|
#[ORM\Column(name: 'whitelist_only', type: 'boolean', nullable: false, options: ['default' => false])]
|
||||||
private bool $whitelistOnly = false;
|
private bool $whitelistOnly = false;
|
||||||
|
|
||||||
|
/** @var Collection<int, Subscription> */
|
||||||
#[ORM\OneToMany(mappedBy: 'author', targetEntity: Subscription::class, fetch: 'EXTRA_LAZY')]
|
#[ORM\OneToMany(mappedBy: 'author', targetEntity: Subscription::class, fetch: 'EXTRA_LAZY')]
|
||||||
private ArrayCollection $subscribers;
|
private Collection $subscribers;
|
||||||
|
|
||||||
|
/** @var Collection<int, Subscription> */
|
||||||
#[ORM\OneToMany(mappedBy: 'subscriber', targetEntity: Subscription::class, fetch: 'EXTRA_LAZY')]
|
#[ORM\OneToMany(mappedBy: 'subscriber', targetEntity: Subscription::class, fetch: 'EXTRA_LAZY')]
|
||||||
private ArrayCollection $subscriptions;
|
private Collection $subscriptions;
|
||||||
|
|
||||||
|
/** @var Collection<int, SubscriptionEvent> */
|
||||||
#[ORM\OneToMany(mappedBy: 'author', targetEntity: SubscriptionEvent::class, fetch: 'EXTRA_LAZY')]
|
#[ORM\OneToMany(mappedBy: 'author', targetEntity: SubscriptionEvent::class, fetch: 'EXTRA_LAZY')]
|
||||||
private ArrayCollection $newSubscriberEvents;
|
private Collection $newSubscriberEvents;
|
||||||
|
|
||||||
#[ORM\Column(name: 'is_removed', type: 'boolean', options: ['default' => false])]
|
#[ORM\Column(name: 'is_removed', type: 'boolean', options: ['default' => false])]
|
||||||
private bool $removed = false;
|
private bool $removed = false;
|
||||||
|
@ -110,14 +114,14 @@ class User
|
||||||
$this->subscribers->removeElement($subscribers);
|
$this->subscribers->removeElement($subscribers);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return Subscription[]|ArrayCollection */
|
/** @return Collection<int, Subscription> */
|
||||||
public function getSubscribers(): ArrayCollection
|
public function getSubscribers(): Collection
|
||||||
{
|
{
|
||||||
return $this->subscribers;
|
return $this->subscribers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return Subscription[]|ArrayCollection */
|
/** @return Collection<int, Subscription> */
|
||||||
public function getSubscriptions(): ArrayCollection
|
public function getSubscriptions(): Collection
|
||||||
{
|
{
|
||||||
return $this->subscriptions;
|
return $this->subscriptions;
|
||||||
}
|
}
|
||||||
|
@ -129,8 +133,8 @@ class User
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return SubscriptionEvent[]|ArrayCollection */
|
/** @return Collection<int, SubscriptionEvent> */
|
||||||
public function getNewSubscriberEvents(): ArrayCollection
|
public function getNewSubscriberEvents(): Collection
|
||||||
{
|
{
|
||||||
return $this->newSubscriberEvents;
|
return $this->newSubscriberEvents;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{% extends "::base.html.twig" %}
|
{% extends 'Web/base.html.twig' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{# TODO classes #}
|
{# TODO classes #}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{% extends "::base.html.twig" %}
|
{% extends 'Web/base.html.twig' %}
|
||||||
|
|
||||||
{% block header_title %}{{ user.login }} @ Point Tools{% endblock %}
|
{% block header_title %}{{ user.login }} @ Point Tools{% endblock %}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{% extends "::base.html.twig" %}
|
{% extends 'Web/base.html.twig' %}
|
||||||
|
|
||||||
{% block header_title %}Stats @ Point Tools{% endblock %}
|
{% block header_title %}Stats @ Point Tools{% endblock %}
|
||||||
|
|
Loading…
Reference in a new issue