diff --git a/app/AppKernel.php b/app/AppKernel.php
index 94ecc54..e4ef5e0 100644
--- a/app/AppKernel.php
+++ b/app/AppKernel.php
@@ -32,6 +32,7 @@ public function registerBundles()
new SumoCoders\FrameworkCoreBundle\SumoCodersFrameworkCoreBundle(),
new SumoCoders\FrameworkSearchBundle\SumoCodersFrameworkSearchBundle(),
new SumoCoders\FrameworkMultiUserBundle\SumoCodersFrameworkMultiUserBundle(),
+ new SumoCoders\FrameworkUserBundle\SumoCodersFrameworkUserBundle(),
];
if ($this->getEnvironment() === 'prod') {
diff --git a/app/Resources/SumoCodersFrameworkMultiUserBundle/views/User/base.html.twig b/app/Resources/SumoCodersFrameworkMultiUserBundle/views/User/base.html.twig
new file mode 100644
index 0000000..ca01700
--- /dev/null
+++ b/app/Resources/SumoCodersFrameworkMultiUserBundle/views/User/base.html.twig
@@ -0,0 +1,15 @@
+{% extends '::base.html.twig' %}
+
+{% block header_title %}
+
+ {{ app.request.get('_route')|trans|capitalize }}
+
+{% endblock %}
+
+{% block main %}
+ {{ form_start(form) }}
+ {{ form_rest(form) }}
+
+ {{ form_end(form) }}
+
+{% endblock %}
diff --git a/app/config/config.yml b/app/config/config.yml
index 67ebd6a..bc69ecc 100644
--- a/app/config/config.yml
+++ b/app/config/config.yml
@@ -4,9 +4,12 @@ imports:
services:
multi_user.user_repository.collection:
- class: SumoCoders\FrameworkMultiUserBundle\User\UserRepositoryCollection
+ class: SumoCoders\FrameworkMultiUserBundle\User\BaseUserRepositoryCollection
arguments:
- - ["@multi_user.user.repository"]
+ -
+ - "@multi_user.base_user.repository"
+ - "@sumo_coders.user.repository.user"
+ - "@sumo_coders.user.repository.admin"
sumocoders.user_provider:
class: SumoCoders\FrameworkMultiUserBundle\Security\ObjectUserProvider
diff --git a/app/config/routing.yml b/app/config/routing.yml
index 03130af..afce642 100644
--- a/app/config/routing.yml
+++ b/app/config/routing.yml
@@ -14,3 +14,10 @@ sumo_coders_framework_multi_user:
fos_js_routing:
resource: "@FOSJsRoutingBundle/Resources/config/routing/routing.xml"
+
+sumo_coders_framework_user_bundle_crud:
+ resource: "@SumoCodersFrameworkUserBundle/Resources/config/routing.yml"
+
+sumo_coders_framework_user_bundle:
+ resource: "@SumoCodersFrameworkUserBundle/Controller"
+ type: annotation
diff --git a/app/config/security.yml b/app/config/security.yml
index a23326c..f68e74d 100644
--- a/app/config/security.yml
+++ b/app/config/security.yml
@@ -1,6 +1,6 @@
security:
encoders:
- SumoCoders\FrameworkMultiUserBundle\Entity\User: sha512
+ SumoCoders\FrameworkMultiUserBundle\Entity\BaseUser: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
@@ -14,7 +14,7 @@ security:
main:
provider: sumocoders.multi_user_provider
logout:
- path: /%locale%/logout
+ path: multi_user_logout
target: /
anonymous: ~
guard:
@@ -30,4 +30,6 @@ security:
- { path: ^/\w\w/reset-password, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/(_(profiler|wdt|tests)|css|js)/, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/\w\w/locale.json, role: IS_AUTHENTICATED_ANONYMOUSLY }
+ - { path: ^/\w\w/user/\d+/edit-user, role: ROLE_USER }
+ - { path: ^/\w\w/user, role: ROLE_ADMIN }
- { path: ^/, role: ROLE_USER }
diff --git a/app/migrations/Version20171012095221.php b/app/migrations/Version20171012095221.php
new file mode 100644
index 0000000..4f9e683
--- /dev/null
+++ b/app/migrations/Version20171012095221.php
@@ -0,0 +1,44 @@
+abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
+
+ $this->addSql('CREATE TABLE BaseUser (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, salt VARCHAR(255) NOT NULL, displayName VARCHAR(255) NOT NULL, passwordResetToken VARCHAR(255) DEFAULT NULL, email VARCHAR(255) NOT NULL, status VARCHAR(50) NOT NULL COMMENT \'(DC2Type:user_status)\', discr VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+ $this->addSql('DROP TABLE User');
+ $this->addSql('CREATE TABLE User (id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+ $this->addSql('CREATE TABLE Admin (id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+ $this->addSql('ALTER TABLE User ADD CONSTRAINT FK_2DA17977BF396750 FOREIGN KEY (id) REFERENCES BaseUser (id) ON DELETE CASCADE');
+ $this->addSql('ALTER TABLE Admin ADD CONSTRAINT FK_49CF2272BF396750 FOREIGN KEY (id) REFERENCES BaseUser (id) ON DELETE CASCADE');
+ }
+
+ /**
+ * @param Schema $schema
+ */
+ public function down(Schema $schema)
+ {
+ // this down() migration is auto-generated, please modify it to your needs
+ $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
+
+ $this->addSql('ALTER TABLE User DROP FOREIGN KEY FK_A3368EB3BF396750');
+ $this->addSql('ALTER TABLE Admin DROP FOREIGN KEY FK_49CF2272BF396750');
+ $this->addSql('DROP TABLE User');
+ $this->addSql('DROP TABLE Admin');
+ $this->addSql('CREATE TABLE User (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, password VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, salt VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, displayName VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, passwordResetToken VARCHAR(255) DEFAULT NULL COLLATE utf8_unicode_ci, email VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, status VARCHAR(50) NOT NULL COLLATE utf8_unicode_ci COMMENT \'(DC2Type:user_status)\', discr VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+ $this->addSql('DROP TABLE BaseUser');
+ }
+}
diff --git a/composer.json b/composer.json
index 6559d66..ebb3d96 100644
--- a/composer.json
+++ b/composer.json
@@ -37,7 +37,7 @@
"jms/di-extra-bundle": "^1.7",
"sumocoders/framework-search-bundle": "^4.0.0",
"sumocoders/framework-example-bundle": "^8.0.0",
- "sumocoders/framework-multi-user-bundle": "^6.0.0",
+ "sumocoders/framework-multi-user-bundle": "^8.0.0",
"simple-bus/symfony-bridge": "^4.1",
"simple-bus/doctrine-orm-bridge": "^4.0",
"gedmo/doctrine-extensions": "^2.4",
diff --git a/composer.lock b/composer.lock
index 720b7c6..2c43ad7 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "content-hash": "4b04f0971d87c6729a61141af06d5c02",
+ "content-hash": "43901b7a94e7a01bf8822baa372fa677",
"packages": [
{
"name": "beberlei/assert",
@@ -3059,17 +3059,17 @@
},
{
"name": "sumocoders/framework-multi-user-bundle",
- "version": "6.1.1",
+ "version": "8.0.1",
"target-dir": "SumoCoders/FrameworkMultiUserBundle",
"source": {
"type": "git",
"url": "https://github.com/sumocoders/FrameworkMultiUserBundle.git",
- "reference": "f8ea80155f19ba11b34fa8d2b6f540459de05adc"
+ "reference": "1b8fdbbd60c54d82ea510b9c7cbb4ba2bd817231"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sumocoders/FrameworkMultiUserBundle/zipball/f8ea80155f19ba11b34fa8d2b6f540459de05adc",
- "reference": "f8ea80155f19ba11b34fa8d2b6f540459de05adc",
+ "url": "https://api.github.com/repos/sumocoders/FrameworkMultiUserBundle/zipball/1b8fdbbd60c54d82ea510b9c7cbb4ba2bd817231",
+ "reference": "1b8fdbbd60c54d82ea510b9c7cbb4ba2bd817231",
"shasum": ""
},
"require": {
@@ -3124,7 +3124,7 @@
"SumoCoders",
"framework"
],
- "time": "2017-08-16T08:53:20+00:00"
+ "time": "2017-10-23T08:46:06+00:00"
},
{
"name": "sumocoders/framework-search-bundle",
diff --git a/src/SumoCoders/FrameworkCoreBundle/Resources/views/base.html.twig b/src/SumoCoders/FrameworkCoreBundle/Resources/views/base.html.twig
index ef25fba..04a9fa2 100644
--- a/src/SumoCoders/FrameworkCoreBundle/Resources/views/base.html.twig
+++ b/src/SumoCoders/FrameworkCoreBundle/Resources/views/base.html.twig
@@ -81,8 +81,18 @@
{% endif %}
diff --git a/src/SumoCoders/FrameworkUserBundle/Controller/EditController.php b/src/SumoCoders/FrameworkUserBundle/Controller/EditController.php
new file mode 100644
index 0000000..79fb979
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/Controller/EditController.php
@@ -0,0 +1,77 @@
+authorizationChecker = $authorizationChecker;
+ $this->tokenStorage = $tokenStorage;
+
+ parent::__construct(
+ $formFactory,
+ $router,
+ $flashBag,
+ $translator,
+ $form,
+ $handler,
+ $userRepository,
+ $redirectRoute
+ );
+ }
+
+ /**
+ * @Template("SumoCodersFrameworkMultiUserBundle:User:base.html.twig")
+ *
+ * @param Request $request
+ * @param int|null $id
+ *
+ * @return array
+ *
+ * @throws AccessDeniedHttpException if not allowed to edit user
+ */
+ public function editAction(Request $request, ?int $id): array
+ {
+ if (!$this->authorizationChecker->isGranted('ROLE_ADMIN')
+ && $this->tokenStorage->getToken()->getUser()->getId() !== $id
+ ) {
+ throw new AccessDeniedHttpException('Access denied.');
+ }
+
+ return parent::baseAction($request, $id);
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/Controller/IndexController.php b/src/SumoCoders/FrameworkUserBundle/Controller/IndexController.php
new file mode 100644
index 0000000..3b16d6c
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/Controller/IndexController.php
@@ -0,0 +1,34 @@
+userRepository = $userRepository;
+ }
+
+ /**
+ * @Route("/user")
+ * @Security("has_role('ROLE_ADMIN')")
+ * @Template()
+ *
+ * @return array
+ */
+ public function indexAction(): array
+ {
+ return ['users' => $this->userRepository->findBy([], ['username' => 'ASC'])];
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/DataTransferObject/AdminDataTransferObject.php b/src/SumoCoders/FrameworkUserBundle/DataTransferObject/AdminDataTransferObject.php
new file mode 100644
index 0000000..6b58771
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/DataTransferObject/AdminDataTransferObject.php
@@ -0,0 +1,52 @@
+user) {
+ $this->user->change($this);
+
+ return $this->user;
+ }
+
+ return new Admin(
+ $this->plainPassword,
+ $this->displayName,
+ $this->email
+ );
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/DataTransferObject/UserDataTransferObject.php b/src/SumoCoders/FrameworkUserBundle/DataTransferObject/UserDataTransferObject.php
new file mode 100644
index 0000000..d9bb23c
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/DataTransferObject/UserDataTransferObject.php
@@ -0,0 +1,52 @@
+user) {
+ $this->user->change($this);
+
+ return $this->user;
+ }
+
+ return new User(
+ $this->plainPassword,
+ $this->displayName,
+ $this->email
+ );
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/DependencyInjection/SumoCodersFrameworkUserExtension.php b/src/SumoCoders/FrameworkUserBundle/DependencyInjection/SumoCodersFrameworkUserExtension.php
new file mode 100644
index 0000000..dc8af19
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/DependencyInjection/SumoCodersFrameworkUserExtension.php
@@ -0,0 +1,17 @@
+load('services.yml');
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/Entity/Admin.php b/src/SumoCoders/FrameworkUserBundle/Entity/Admin.php
new file mode 100644
index 0000000..ae52875
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/Entity/Admin.php
@@ -0,0 +1,17 @@
+getSecurityAuthorizationChecker()->isGranted('ROLE_ADMIN')) {
+ return;
+ }
+
+ $menu = $event->getMenu();
+ $menuItem = $event->getFactory()->createItem(
+ 'user.menu.index',
+ array(
+ 'route' => 'sumocoders_frameworkuser_index_index',
+ )
+ );
+ $menuItem->setExtra('orderNumber', 50);
+
+ $menu->addChild($menuItem);
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/Form/AddAdminType.php b/src/SumoCoders/FrameworkUserBundle/Form/AddAdminType.php
new file mode 100644
index 0000000..e35a946
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/Form/AddAdminType.php
@@ -0,0 +1,27 @@
+remove('userName');
+ }
+
+ public static function getDataTransferObjectClass(): string
+ {
+ return AdminDataTransferObject::class;
+ }
+
+ public function getBlockPrefix(): string
+ {
+ return 'user';
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/Form/AddUserType.php b/src/SumoCoders/FrameworkUserBundle/Form/AddUserType.php
new file mode 100644
index 0000000..33d80a7
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/Form/AddUserType.php
@@ -0,0 +1,27 @@
+remove('userName');
+ }
+
+ public static function getDataTransferObjectClass(): string
+ {
+ return UserDataTransferObject::class;
+ }
+
+ public function getBlockPrefix(): string
+ {
+ return 'user';
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/Form/EditAdminType.php b/src/SumoCoders/FrameworkUserBundle/Form/EditAdminType.php
new file mode 100644
index 0000000..884300f
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/Form/EditAdminType.php
@@ -0,0 +1,27 @@
+remove('userName');
+ }
+
+ public static function getDataTransferObjectClass(): string
+ {
+ return AdminDataTransferObject::class;
+ }
+
+ public function getBlockPrefix(): string
+ {
+ return 'user';
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/Form/EditUserType.php b/src/SumoCoders/FrameworkUserBundle/Form/EditUserType.php
new file mode 100644
index 0000000..38ea9d9
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/Form/EditUserType.php
@@ -0,0 +1,27 @@
+remove('userName');
+ }
+
+ public static function getDataTransferObjectClass(): string
+ {
+ return UserDataTransferObject::class;
+ }
+
+ public function getBlockPrefix(): string
+ {
+ return 'user';
+ }
+}
diff --git a/src/SumoCoders/FrameworkUserBundle/Repository/AdminRepository.php b/src/SumoCoders/FrameworkUserBundle/Repository/AdminRepository.php
new file mode 100644
index 0000000..20d425f
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/Repository/AdminRepository.php
@@ -0,0 +1,19 @@
+
+ {{ 'user.header.index'|trans|capitalize }}
+
+{% endblock %}
+
+{% block header_navigation %}
+
+ {{ icon('plus') }}
+ {{ 'user.actions.add.user'|trans|capitalize }}
+
+
+ {{ icon('plus') }}
+ {{ 'user.actions.add.admin'|trans|capitalize }}
+
+{% endblock %}
+
+{% block main %}
+
+{% endblock %}
diff --git a/src/SumoCoders/FrameworkUserBundle/SumoCodersFrameworkUserBundle.php b/src/SumoCoders/FrameworkUserBundle/SumoCodersFrameworkUserBundle.php
new file mode 100644
index 0000000..d809431
--- /dev/null
+++ b/src/SumoCoders/FrameworkUserBundle/SumoCodersFrameworkUserBundle.php
@@ -0,0 +1,9 @@
+