Skip to content

Commit

Permalink
use Global Service instead of SubController calls
Browse files Browse the repository at this point in the history
enhance Private group subscription with membershipStatus
  • Loading branch information
zemax committed May 21, 2019
1 parent 8345509 commit ae70ff6
Show file tree
Hide file tree
Showing 20 changed files with 261 additions and 102 deletions.
1 change: 1 addition & 0 deletions config/packages/twig.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ twig:
strict_variables: '%kernel.debug%'
globals:
plateform: '%plateform%'
user_group_relation: '@App\Service\UserGroupRelation'
41 changes: 11 additions & 30 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 15 additions & 15 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
{
"devDependencies": {
"@symfony/webpack-encore": "^0.27.0",
"autocomplete.js": "^0.36.0",
"core-js": "^3.0.1",
"mf-js": "^2.0.3",
"node-sass": "^4.12.0",
"node-sass-svg": "^1.0.2",
"places.js": "^1.16.4",
"sass-loader": "^7.1.0",
"webpack-notifier": "^1.6.0"
"autocomplete.js": "^0.36.0",
"core-js": "^3.0.1",
"mf-js": "^2.0.3",
"node-sass": "^4.12.0",
"node-sass-svg": "^1.0.2",
"places.js": "^1.16.4",
"sass-loader": "^7.1.0",
"webpack-notifier": "^1.6.0"
},
"license": "UNLICENSED",
"private": true,
"scripts": {
"license": "UNLICENSED",
"private": true,
"scripts": {
"dev-server": "encore dev-server",
"dev": "encore dev",
"watch": "encore dev --watch",
"build": "encore production --progress"
"dev": "encore dev",
"watch": "encore dev --watch",
"build": "encore production --progress"
},
"dependencies": {
"dependencies": {
"tar": "^4.4.8"
}
}
49 changes: 21 additions & 28 deletions src/Controller/GroupMembersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,6 @@ public function groupMembers ( $groupSlug ) {
return '#TODO';
}

public function groupMemberJoinButton ( $groupSlug, ObjectManager $manager ) {
$group = $manager->getRepository( Usergroup::class )
->findOneBy( [ 'slug' => $groupSlug ] );

$user = $this->getUser();

$isMember = $manager->getRepository( UsergroupMembership::class )
->isMember( $user, $group );

return $this->render( 'components/group/group-join-button.html.twig', [
'group' => $group,
'isMember' => $isMember,
] );
}

/**
* @Route("/groups/{groupSlug}/members/new", name="group_member_new")
*/
Expand All @@ -49,28 +34,36 @@ public function groupMemberNew ( $groupSlug, ObjectManager $manager ) {

$this->denyAccessUnlessGranted( UserVoter::LOGGED );

$isMember = $manager->getRepository( UsergroupMembership::class )
->isMember( $user, $group );
$membership = $manager->getRepository( UsergroupMembership::class )
->getMembership( $user, $group );

if ( !empty( $membership ) ) {
if ( $membership->getStatus() === UsergroupMembership::STATUS_BANNED ) {
$this->addFlash( 'messages.group.user_banned' );
}

if ( $isMember ) {
return $this->redirectToRoute( 'group_index', [ 'groupSlug' => $groupSlug ] );
}

$membership = new UsergroupMembership();
$membership->setUsergroup( $group );
$membership->setUser( $user );
$membership->setRole( UsergroupMembership::ROLE_USER );
$membership->setJoinedAt( new \DateTime() );

if ( $this->isGranted( GroupVoter::JOIN, $group ) ) {
$membership = new UsergroupMembership();
$membership->setUsergroup( $group );
$membership->setUser( $user );
$membership->setJoinedAt( new \DateTime() );
$membership->setRole( '' );
$membership->setStatus( UsergroupMembership::STATUS_MEMBER );

$manager->persist( $membership );
$manager->flush();
$this->addFlash( 'notice', 'messages.group.joined' );
}
else {
$membership->setStatus( UsergroupMembership::STATUS_PENDING );

return $this->redirectToRoute( 'group_index', [ 'groupSlug' => $groupSlug ] );
$this->addFlash( 'notice', 'messages.group.candidature_sent' );
}

// TODO
$this->addFlash( 'notice', 'messages.group.candidature_sent' );
$manager->persist( $membership );
$manager->flush();

return $this->redirectToRoute( 'group_index', [ 'groupSlug' => $groupSlug ] );
}
Expand Down
11 changes: 10 additions & 1 deletion src/DataFixtures/AppFixtures.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,20 @@ public function load ( ObjectManager $manager ) {
for ( $j = 0, $n = rand( 3, 20 ); $j < $n; $j++ ) {
$userId = rand( 0, count( $users ) - 1 );
if ( !in_array( $userId, $groupUsers ) ) {

$membership = new UsergroupMembership();
$membership->setUsergroup( $group );
$membership->setUser( $users[ $userId ] );
$membership->setJoinedAt( new \DateTime() );
$membership->setRole( '' );

if ( $j < 1 ) {
$membership->setRole( UsergroupMembership::ROLE_ADMIN );
$membership->setStatus( UsergroupMembership::STATUS_MEMBER );
}
else {
$membership->setRole( UsergroupMembership::ROLE_USER );
$membership->setStatus( UsergroupMembership::STATUS_MEMBER );
}

$manager->persist( $membership );

Expand Down
24 changes: 23 additions & 1 deletion src/Entity/UsergroupMembership.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,17 @@
use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Table(name="usergroups_memberships",uniqueConstraints={@ORM\UniqueConstraint(name="user_usergroup", columns={"user_id", "usergroup_id"})})
* @ORM\Table(name="usergroups_memberships",uniqueConstraints={@ORM\UniqueConstraint(name="user_usergroup", columns={"user_id", "usergroup_id"})},indexes={@ORM\Index(name="status", columns={"status"})})
* @ORM\Entity(repositoryClass="App\Repository\UsergroupMembershipRepository")
*/
class UsergroupMembership {
const ROLE_ADMIN = 'admin';
const ROLE_USER = NULL;

const STATUS_PENDING = 'pending';
const STATUS_MEMBER = 'member';
const STATUS_BANNED = 'banned';

/**
* @ORM\Id()
* @ORM\GeneratedValue()
Expand Down Expand Up @@ -43,6 +50,11 @@ class UsergroupMembership {
*/
private $notificationsSettings = [];

/**
* @ORM\Column(type="string", length=32, nullable=true)
*/
private $status;

public function getId (): ?int {
return $this->id;
}
Expand Down Expand Up @@ -96,4 +108,14 @@ public function setUsergroup ( ?Usergroup $usergroup ): self {

return $this;
}

public function getStatus (): ?string {
return $this->status;
}

public function setStatus ( ?string $status ): self {
$this->status = $status;

return $this;
}
}
34 changes: 34 additions & 0 deletions src/Migrations/Version20190521124613.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20190521124613 extends AbstractMigration
{
public function up(Schema $schema) : void
{
// this up() 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 naturadapt_usergroups_memberships ADD status VARCHAR(32) DEFAULT NULL, CHANGE role role VARCHAR(255) DEFAULT NULL, CHANGE notifications_settings notifications_settings JSON DEFAULT NULL');
$this->addSql('ALTER TABLE naturadapt_files CHANGE user_id user_id INT DEFAULT NULL, CHANGE usergroup_id usergroup_id INT DEFAULT NULL, CHANGE type type VARCHAR(50) DEFAULT NULL, CHANGE size size INT DEFAULT NULL');
$this->addSql('ALTER TABLE naturadapt_users CHANGE avatar_id avatar_id INT DEFAULT NULL, CHANGE site_id site_id INT DEFAULT NULL, CHANGE roles roles JSON NOT NULL, CHANGE name name VARCHAR(100) DEFAULT NULL, CHANGE display_name display_name VARCHAR(100) DEFAULT NULL, CHANGE zipcode zipcode VARCHAR(10) DEFAULT NULL, CHANGE city city VARCHAR(100) DEFAULT NULL, CHANGE country country VARCHAR(2) DEFAULT NULL, CHANGE profile_visibility profile_visibility VARCHAR(100) DEFAULT NULL, CHANGE inscription_type inscription_type VARCHAR(20) DEFAULT NULL, CHANGE locale locale VARCHAR(100) DEFAULT NULL, CHANGE timezone timezone VARCHAR(100) DEFAULT NULL, CHANGE seen_at seen_at DATETIME DEFAULT NULL, CHANGE reset_token reset_token VARCHAR(255) DEFAULT NULL, CHANGE latitude latitude DOUBLE PRECISION DEFAULT NULL, CHANGE longitude longitude DOUBLE PRECISION DEFAULT NULL');
$this->addSql('ALTER TABLE naturadapt_pages CHANGE edited_at edited_at DATETIME DEFAULT NULL');
}

public function down(Schema $schema) : void
{
// 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 naturadapt_files CHANGE user_id user_id INT DEFAULT NULL, CHANGE usergroup_id usergroup_id INT DEFAULT NULL, CHANGE type type VARCHAR(50) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE size size INT DEFAULT NULL');
$this->addSql('ALTER TABLE naturadapt_pages CHANGE edited_at edited_at DATETIME DEFAULT \'NULL\'');
$this->addSql('ALTER TABLE naturadapt_usergroups_memberships DROP status, CHANGE role role VARCHAR(255) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE notifications_settings notifications_settings LONGTEXT DEFAULT NULL COLLATE utf8mb4_bin');
$this->addSql('ALTER TABLE naturadapt_users CHANGE avatar_id avatar_id INT DEFAULT NULL, CHANGE site_id site_id INT DEFAULT NULL, CHANGE roles roles LONGTEXT NOT NULL COLLATE utf8mb4_bin, CHANGE name name VARCHAR(100) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE display_name display_name VARCHAR(100) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE zipcode zipcode VARCHAR(10) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE city city VARCHAR(100) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE country country VARCHAR(2) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE profile_visibility profile_visibility VARCHAR(100) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE inscription_type inscription_type VARCHAR(20) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE locale locale VARCHAR(100) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE timezone timezone VARCHAR(100) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE seen_at seen_at DATETIME DEFAULT \'NULL\', CHANGE reset_token reset_token VARCHAR(255) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE latitude latitude DOUBLE PRECISION DEFAULT \'NULL\', CHANGE longitude longitude DOUBLE PRECISION DEFAULT \'NULL\'');
}
}
Loading

0 comments on commit ae70ff6

Please sign in to comment.