diff --git a/migrations/Version20210106214136.php b/migrations/Version20210106214136.php new file mode 100644 index 0000000..255c58a --- /dev/null +++ b/migrations/Version20210106214136.php @@ -0,0 +1,81 @@ +addSql('DROP INDEX UNIQ_8D93D6495E237E06'); + $this->addSql('CREATE TEMPORARY TABLE __temp__user AS SELECT id, password, name, roles FROM user'); + $this->addSql('DROP TABLE user'); + $this->addSql('CREATE TABLE user (id BLOB NOT NULL, password VARCHAR(255) NOT NULL COLLATE BINARY, name VARCHAR(180) NOT NULL COLLATE BINARY, roles CLOB NOT NULL COLLATE BINARY --(DC2Type:json) + , PRIMARY KEY(id))'); + $this->addSql('INSERT INTO user (id, password, name, roles) SELECT id, password, name, roles FROM __temp__user'); + $this->addSql('DROP TABLE __temp__user'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D6495E237E06 ON user (name)'); + $this->addSql('DROP INDEX IDX_7CC7DA2C16678C77'); + $this->addSql('CREATE TEMPORARY TABLE __temp__video AS SELECT id, uploader_id, uploaded, name, description, tags, state FROM video'); + $this->addSql('DROP TABLE video'); + $this->addSql('CREATE TABLE video (id BLOB NOT NULL, uploader_id BLOB NOT NULL, uploaded DATETIME NOT NULL --(DC2Type:datetime_immutable) + , name VARCHAR(255) NOT NULL COLLATE BINARY, description VARCHAR(1024) NOT NULL COLLATE BINARY, tags CLOB NOT NULL COLLATE BINARY --(DC2Type:array) + , state INTEGER NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_7CC7DA2C16678C77 FOREIGN KEY (uploader_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); + $this->addSql('INSERT INTO video (id, uploader_id, uploaded, name, description, tags, state) SELECT id, uploader_id, uploaded, name, description, tags, state FROM __temp__video'); + $this->addSql('DROP TABLE __temp__video'); + $this->addSql('CREATE INDEX IDX_7CC7DA2C16678C77 ON video (uploader_id)'); + $this->addSql('DROP INDEX IDX_313BC42D29C1004E'); + $this->addSql('CREATE TEMPORARY TABLE __temp__video_link AS SELECT id, video_id, created FROM video_link'); + $this->addSql('DROP TABLE video_link'); + $this->addSql('CREATE TABLE video_link (id BLOB NOT NULL, video_id BLOB NOT NULL, creator_id BLOB NOT NULL, created DATETIME NOT NULL --(DC2Type:datetime_immutable) + , max_views INTEGER DEFAULT NULL, viewable_for INTEGER DEFAULT NULL, viewable_until DATETIME DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_313BC42D29C1004E FOREIGN KEY (video_id) REFERENCES video (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_313BC42D61220EA6 FOREIGN KEY (creator_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); + $this->addSql('INSERT INTO video_link (id, video_id, created) SELECT id, video_id, created FROM __temp__video_link'); + $this->addSql('DROP TABLE __temp__video_link'); + $this->addSql('CREATE INDEX IDX_313BC42D29C1004E ON video_link (video_id)'); + $this->addSql('CREATE INDEX IDX_313BC42D61220EA6 ON video_link (creator_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP INDEX UNIQ_8D93D6495E237E06'); + $this->addSql('CREATE TEMPORARY TABLE __temp__user AS SELECT id, name, roles, password FROM user'); + $this->addSql('DROP TABLE user'); + $this->addSql('CREATE TABLE user (id BLOB NOT NULL, name VARCHAR(180) NOT NULL, roles CLOB NOT NULL --(DC2Type:json) + , password VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('INSERT INTO user (id, name, roles, password) SELECT id, name, roles, password FROM __temp__user'); + $this->addSql('DROP TABLE __temp__user'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D6495E237E06 ON user (name)'); + $this->addSql('DROP INDEX IDX_7CC7DA2C16678C77'); + $this->addSql('CREATE TEMPORARY TABLE __temp__video AS SELECT id, uploader_id, uploaded, name, description, tags, state FROM video'); + $this->addSql('DROP TABLE video'); + $this->addSql('CREATE TABLE video (id BLOB NOT NULL, uploaded DATETIME NOT NULL --(DC2Type:datetime_immutable) + , name VARCHAR(255) NOT NULL, description VARCHAR(1024) NOT NULL, tags CLOB NOT NULL --(DC2Type:array) + , state INTEGER NOT NULL, uploader_id BLOB NOT NULL, PRIMARY KEY(id))'); + $this->addSql('INSERT INTO video (id, uploader_id, uploaded, name, description, tags, state) SELECT id, uploader_id, uploaded, name, description, tags, state FROM __temp__video'); + $this->addSql('DROP TABLE __temp__video'); + $this->addSql('CREATE INDEX IDX_7CC7DA2C16678C77 ON video (uploader_id)'); + $this->addSql('DROP INDEX IDX_313BC42D29C1004E'); + $this->addSql('DROP INDEX IDX_313BC42D61220EA6'); + $this->addSql('CREATE TEMPORARY TABLE __temp__video_link AS SELECT id, video_id, created FROM video_link'); + $this->addSql('DROP TABLE video_link'); + $this->addSql('CREATE TABLE video_link (id BLOB NOT NULL, created DATETIME NOT NULL --(DC2Type:datetime_immutable) + , video_id BLOB NOT NULL, mode INTEGER NOT NULL, PRIMARY KEY(id))'); + $this->addSql('INSERT INTO video_link (id, video_id, created) SELECT id, video_id, created FROM __temp__video_link'); + $this->addSql('DROP TABLE __temp__video_link'); + $this->addSql('CREATE INDEX IDX_313BC42D29C1004E ON video_link (video_id)'); + } +} diff --git a/migrations/Version20210106214257.php b/migrations/Version20210106214257.php new file mode 100644 index 0000000..5cdd891 --- /dev/null +++ b/migrations/Version20210106214257.php @@ -0,0 +1,83 @@ +addSql('DROP INDEX UNIQ_8D93D6495E237E06'); + $this->addSql('CREATE TEMPORARY TABLE __temp__user AS SELECT id, password, name, roles FROM user'); + $this->addSql('DROP TABLE user'); + $this->addSql('CREATE TABLE user (id BLOB NOT NULL, password VARCHAR(255) NOT NULL COLLATE BINARY, name VARCHAR(180) NOT NULL COLLATE BINARY, roles CLOB NOT NULL COLLATE BINARY --(DC2Type:json) + , PRIMARY KEY(id))'); + $this->addSql('INSERT INTO user (id, password, name, roles) SELECT id, password, name, roles FROM __temp__user'); + $this->addSql('DROP TABLE __temp__user'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D6495E237E06 ON user (name)'); + $this->addSql('DROP INDEX IDX_7CC7DA2C16678C77'); + $this->addSql('CREATE TEMPORARY TABLE __temp__video AS SELECT id, uploader_id, uploaded, name, description, tags, state FROM video'); + $this->addSql('DROP TABLE video'); + $this->addSql('CREATE TABLE video (id BLOB NOT NULL, uploader_id BLOB NOT NULL, uploaded DATETIME NOT NULL --(DC2Type:datetime_immutable) + , name VARCHAR(255) NOT NULL COLLATE BINARY, description VARCHAR(1024) NOT NULL COLLATE BINARY, tags CLOB NOT NULL COLLATE BINARY --(DC2Type:array) + , state INTEGER NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_7CC7DA2C16678C77 FOREIGN KEY (uploader_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); + $this->addSql('INSERT INTO video (id, uploader_id, uploaded, name, description, tags, state) SELECT id, uploader_id, uploaded, name, description, tags, state FROM __temp__video'); + $this->addSql('DROP TABLE __temp__video'); + $this->addSql('CREATE INDEX IDX_7CC7DA2C16678C77 ON video (uploader_id)'); + $this->addSql('DROP INDEX IDX_313BC42D61220EA6'); + $this->addSql('DROP INDEX IDX_313BC42D29C1004E'); + $this->addSql('CREATE TEMPORARY TABLE __temp__video_link AS SELECT id, video_id, creator_id, created, max_views, viewable_for, viewable_until FROM video_link'); + $this->addSql('DROP TABLE video_link'); + $this->addSql('CREATE TABLE video_link (id BLOB NOT NULL, video_id BLOB NOT NULL, creator_id BLOB NOT NULL, created DATETIME NOT NULL --(DC2Type:datetime_immutable) + , max_views INTEGER DEFAULT NULL, viewable_for INTEGER DEFAULT NULL, viewable_until DATETIME DEFAULT NULL, comment VARCHAR(1024) DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_313BC42D29C1004E FOREIGN KEY (video_id) REFERENCES video (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_313BC42D61220EA6 FOREIGN KEY (creator_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); + $this->addSql('INSERT INTO video_link (id, video_id, creator_id, created, max_views, viewable_for, viewable_until) SELECT id, video_id, creator_id, created, max_views, viewable_for, viewable_until FROM __temp__video_link'); + $this->addSql('DROP TABLE __temp__video_link'); + $this->addSql('CREATE INDEX IDX_313BC42D61220EA6 ON video_link (creator_id)'); + $this->addSql('CREATE INDEX IDX_313BC42D29C1004E ON video_link (video_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP INDEX UNIQ_8D93D6495E237E06'); + $this->addSql('CREATE TEMPORARY TABLE __temp__user AS SELECT id, name, roles, password FROM user'); + $this->addSql('DROP TABLE user'); + $this->addSql('CREATE TABLE user (id BLOB NOT NULL, name VARCHAR(180) NOT NULL, roles CLOB NOT NULL --(DC2Type:json) + , password VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('INSERT INTO user (id, name, roles, password) SELECT id, name, roles, password FROM __temp__user'); + $this->addSql('DROP TABLE __temp__user'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D6495E237E06 ON user (name)'); + $this->addSql('DROP INDEX IDX_7CC7DA2C16678C77'); + $this->addSql('CREATE TEMPORARY TABLE __temp__video AS SELECT id, uploader_id, uploaded, name, description, tags, state FROM video'); + $this->addSql('DROP TABLE video'); + $this->addSql('CREATE TABLE video (id BLOB NOT NULL, uploaded DATETIME NOT NULL --(DC2Type:datetime_immutable) + , name VARCHAR(255) NOT NULL, description VARCHAR(1024) NOT NULL, tags CLOB NOT NULL --(DC2Type:array) + , state INTEGER NOT NULL, uploader_id BLOB NOT NULL, PRIMARY KEY(id))'); + $this->addSql('INSERT INTO video (id, uploader_id, uploaded, name, description, tags, state) SELECT id, uploader_id, uploaded, name, description, tags, state FROM __temp__video'); + $this->addSql('DROP TABLE __temp__video'); + $this->addSql('CREATE INDEX IDX_7CC7DA2C16678C77 ON video (uploader_id)'); + $this->addSql('DROP INDEX IDX_313BC42D29C1004E'); + $this->addSql('DROP INDEX IDX_313BC42D61220EA6'); + $this->addSql('CREATE TEMPORARY TABLE __temp__video_link AS SELECT id, video_id, creator_id, created, max_views, viewable_for, viewable_until FROM video_link'); + $this->addSql('DROP TABLE video_link'); + $this->addSql('CREATE TABLE video_link (id BLOB NOT NULL, created DATETIME NOT NULL --(DC2Type:datetime_immutable) + , max_views INTEGER DEFAULT NULL, viewable_for INTEGER DEFAULT NULL, viewable_until DATETIME DEFAULT NULL, video_id BLOB NOT NULL, creator_id BLOB NOT NULL, PRIMARY KEY(id))'); + $this->addSql('INSERT INTO video_link (id, video_id, creator_id, created, max_views, viewable_for, viewable_until) SELECT id, video_id, creator_id, created, max_views, viewable_for, viewable_until FROM __temp__video_link'); + $this->addSql('DROP TABLE __temp__video_link'); + $this->addSql('CREATE INDEX IDX_313BC42D29C1004E ON video_link (video_id)'); + $this->addSql('CREATE INDEX IDX_313BC42D61220EA6 ON video_link (creator_id)'); + } +} diff --git a/src/Controller/DashboardController.php b/src/Controller/DashboardController.php index 3dded5a..b1352d4 100644 --- a/src/Controller/DashboardController.php +++ b/src/Controller/DashboardController.php @@ -5,9 +5,10 @@ namespace App\Controller; use App\Entity\Video; -use App\Form\VideoType; +use App\Form\VideoLinkType; use App\Mapper\CustomUuidMapper; use App\Service\UserService; +use App\Service\VideoLinkService; use App\Service\VideoService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\FormError; @@ -19,12 +20,20 @@ class DashboardController extends AbstractController { private $userService; private $videoService; + private $videoLinkService; + private $uuidMapper; - public function __construct(UserService $userService, VideoService $videoService, CustomUuidMapper $uuidMapper) + public function __construct( + UserService $userService, + VideoService $videoService, + VideoLinkService $videoLinkService, + CustomUuidMapper $uuidMapper + ) { $this->userService = $userService; $this->videoService = $videoService; + $this->videoLinkService = $videoLinkService; $this->uuidMapper = $uuidMapper; } @@ -55,8 +64,13 @@ class DashboardController extends AbstractController */ public function upload(Request $request): Response { + if (!$this->isGranted("ROLE_USER")) { + // not logged in + return $this->redirectToRoute("app_login"); + } + $video = new Video(); - $form = $this->createForm(VideoType::class, $video); + $form = $this->createForm(VideoLinkType::class, $video); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { @@ -80,9 +94,16 @@ class DashboardController extends AbstractController */ public function links(): Response { + if (!$this->isGranted("ROLE_USER")) { + // not logged in + return $this->redirectToRoute("app_login"); + } + + $user = $this->userService->getLoggedInUser(); + $links = $this->videoLinkService->getAll($user); return $this->render("dashboard/links.html.twig", [ - "links" => ["1", "2", "3"] + "links" => $links ]); } } \ No newline at end of file diff --git a/src/Entity/VideoLink.php b/src/Entity/VideoLink.php index 5865d71..7b5b4c9 100644 --- a/src/Entity/VideoLink.php +++ b/src/Entity/VideoLink.php @@ -50,6 +50,17 @@ class VideoLink */ private $viewableUntil; + /** + * @ORM\ManyToOne(targetEntity=User::class) + * @ORM\JoinColumn(nullable=false) + */ + private $creator; + + /** + * @ORM\Column(type="string", length=1024, nullable=true) + */ + private $comment; + public function getId(): ?UuidInterface { return $this->id; @@ -112,4 +123,28 @@ class VideoLink $this->viewableFor = $viewableFor; return $this; } + + public function getCreator(): ?User + { + return $this->creator; + } + + public function setCreator(?User $creator): self + { + $this->creator = $creator; + + return $this; + } + + public function getComment(): ?string + { + return $this->comment; + } + + public function setComment(?string $comment): self + { + $this->comment = $comment; + + return $this; + } } diff --git a/src/Form/VideoLinkType.php b/src/Form/VideoLinkType.php new file mode 100644 index 0000000..26901eb --- /dev/null +++ b/src/Form/VideoLinkType.php @@ -0,0 +1,28 @@ +add("submit", SubmitType::class); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => VideoLink::class, + ]); + } + +} \ No newline at end of file diff --git a/src/Service/VideoLinkService.php b/src/Service/VideoLinkService.php index db93357..799a619 100644 --- a/src/Service/VideoLinkService.php +++ b/src/Service/VideoLinkService.php @@ -4,21 +4,26 @@ namespace App\Service; +use App\Entity\User; use App\Entity\VideoLink; use App\Repository\VideoLinkRepository; class VideoLinkService { - private $videoLinkRepository; public function __construct(VideoLinkRepository $videoLinkRepository) { - $this->videoLinkRepository; + $this->videoLinkRepository = $videoLinkRepository; } public function get($linkId): ?VideoLink { return $this->videoLinkRepository->findOneById($linkId); } + + public function getAll(User $user): array + { + return $this->videoLinkRepository->findByCreator($user); + } } \ No newline at end of file