Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
573e957
Role: Trustee and membership team cons’s
dpslwk May 12, 2017
21940d1
Laracast/flash: add JS for overlay
dpslwk May 12, 2017
de3adb9
Add users search api
dpslwk May 12, 2017
775fa7b
Register: missing validation rules
dpslwk May 12, 2017
051ed88
RoleManager: add removerUserFromRoleByName method
dpslwk May 12, 2017
08b129e
User: make name and email public properties available on the entity
dpslwk May 12, 2017
6ed03ca
Add update methods to User and Profile managers
dpslwk May 12, 2017
c477ada
Interest Registered email subject
dpslwk May 12, 2017
09713ed
Membership Approval: take a member from member.approval to member.pay…
dpslwk May 12, 2017
c762129
Merge branch 'master' into approval
dpslwk May 12, 2017
7f22d93
Membership Approval: styleCI
dpslwk May 12, 2017
0534350
IntersRegister: update mail to markdown format
dpslwk May 13, 2017
d45308e
Membership Approval: just pass the user object to the editDetails view
dpslwk May 15, 2017
4fe4310
Role: use .env for slack webhooks, not meta
dpslwk May 15, 2017
911c537
Member Approval: slack notifications
dpslwk May 15, 2017
898b221
Membership arrival: email fix
dpslwk May 15, 2017
d2d8a84
Merge branch 'master' into approval
dpslwk May 23, 2017
b2f7c87
Seeder: fix broken user seeder
dpslwk May 28, 2017
b055b03
Config: move calls for env vars out main codebase and into a general …
dpslwk May 28, 2017
815c12d
Member Approval: typos and changes for @cooperaj
dpslwk May 28, 2017
176a535
Merge branch 'master' into approval
dpslwk May 28, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions app/HMS/Entities/Role.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ class Role implements RoleContract

const SUPERUSER = 'user.super';

const TEAM_MEMBERSHIP = 'team.membership';
const TEAM_TRUSTEES = 'team.trustees';

/**
* @var int
*/
Expand Down Expand Up @@ -270,10 +273,10 @@ public function setRetained($retained): Role
*/
public function routeNotificationForSlack(): string
{
if ($this->name = 'team.Trustees') {
return Meta::get('trustee_slack_webhook');
if ($this->name == self::TEAM_TRUSTEES) {
return config('hms.trustee_slack_webhook');
} else {
return Meta::get('team_slack_webhook');
return config('hms.team_slack_webhook');
}
}
}
54 changes: 48 additions & 6 deletions app/HMS/Entities/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class User implements AuthenticatableContract, CanResetPasswordContract, HasRole
/**
* @var string Users first name
*/
protected $firstname;
public $name;

/**
* @var string Users last name
Expand All @@ -47,7 +47,7 @@ class User implements AuthenticatableContract, CanResetPasswordContract, HasRole
/**
* @var string Users email address
*/
protected $email;
public $email;

/**
* @var string Users remember me token for persisting login sessions
Expand Down Expand Up @@ -83,7 +83,7 @@ class User implements AuthenticatableContract, CanResetPasswordContract, HasRole
*/
public function __construct(string $firstname, string $lastname, string $username, string $email)
{
$this->firstname = $firstname;
$this->name = $firstname;
$this->lastname = $lastname;
$this->username = $username;
$this->email = $email;
Expand All @@ -104,7 +104,7 @@ public function getId()
*/
public function getFirstname(): string
{
return $this->firstname;
return $this->name;
}

/**
Expand All @@ -118,9 +118,9 @@ public function getLastname(): string
/**
* @return string
*/
public function getFullName(): string
public function getFullname(): string
{
return $this->firstname . ' ' . $this->lastname;
return $this->name . ' ' . $this->lastname;
}

/**
Expand Down Expand Up @@ -264,6 +264,48 @@ public function getKey()
return $this->getAuthIdentifier();
}

/**
* Sets the value of firstname.
*
* @param string $name the name
*
* @return self
*/
public function setFirstname($firstname)
{
$this->name = $firstname;

return $this;
}

/**
* Sets the value of lastname.
*
* @param string $lastname the lastname
*
* @return self
*/
public function setLastname($lastname)
{
$this->lastname = $lastname;

return $this;
}

/**
* Sets the value of email.
*
* @param string $email the email
*
* @return self
*/
public function setEmail($email)
{
$this->email = $email;

return $this;
}

/**
* @return ArrayCollection|Email[]
*/
Expand Down
2 changes: 1 addition & 1 deletion app/HMS/Helpers/SiteVisitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public function inTheSpace($request = null)
}

// Allowed IPs
$allowed = [env('RESTRICED_IP_RANGE', '10.0.0.0/8')];
$allowed = [config('hms.restriced_ip_range')];

if (IpUtils::checkIp($request->ip(), $allowed)) {
return true;
Expand Down
3 changes: 2 additions & 1 deletion app/HMS/Mappings/HMS.Entities.User.dcm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ HMS\Entities\User:
generator:
strategy: AUTO
fields:
firstname:
name:
column: firstname
type: string
lastname:
type: string
Expand Down
14 changes: 10 additions & 4 deletions app/HMS/Repositories/Doctrine/DoctrineUserRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,20 +49,26 @@ public function findOneByEmail(string $email)

/**
* @param string $searchQuery
* @param bool $hasAccount limit to users with associated accounts
* @return array
*/
public function searchLike(string $searchQuery)
public function searchLike(string $searchQuery, ?bool $hasAccount = false)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nullable bool?

Is this because some callers might not pass a value?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm calling with $this->userRepository->searchLike($searchQuery, $request->input('withAccount', false))
and $request->input can return null

{
$q = parent::createQueryBuilder('user')
->leftJoin('user.profile', 'profile')->addSelect('profile')
->leftJoin('user.account', 'account')->addSelect('account')
->where('user.firstname LIKE :keyword')
->where('user.name LIKE :keyword')
->orWhere('user.lastname LIKE :keyword')
->orWhere('user.username LIKE :keyword')
->orWhere('user.email LIKE :keyword')
->orWhere('profile.addressPostcode LIKE :keyword')
->orWhere('account.paymentRef LIKE :keyword')
->setParameter('keyword', '%'.$searchQuery.'%')
->orWhere('account.paymentRef LIKE :keyword');

if ($hasAccount) {
$q = $q->andWhere('user.account IS NOT NULL');
}

$q = $q->setParameter('keyword', '%'.$searchQuery.'%')
->getQuery();

return $q->getResult();
Expand Down
3 changes: 2 additions & 1 deletion app/HMS/Repositories/UserRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ public function findOneByEmail(string $email);

/**
* @param string $searchQuery
* @param bool $hasAccount limit to users with associated accounts
* @return array
*/
public function searchLike(string $searchQuery);
public function searchLike(string $searchQuery, ?bool $hasAccount = false);

/**
* save User to the DB.
Expand Down
17 changes: 13 additions & 4 deletions app/HMS/User/Permissions/RoleManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,10 @@ public function addUserToRole(User $user, Role $role)
* @param User $user
* @param string $roleName take a role name string rather than a role enitity
*/
public function addUserToRoleByName(User $user, $roleName)
public function addUserToRoleByName(User $user, string $roleName)
{
$role = $this->roleRepository->findOneByName($roleName);
$user->getRoles()->add($role);
$this->userRepository->save($user);
event(new UserAddedToRole($user, $role));
$this->addUserToRole($user, $role);
}

/**
Expand All @@ -124,4 +122,15 @@ public function removeUserFromRole(User $user, Role $role)
event(new UserRemovedFromRole($user, $role));
$this->entityManager->refresh($user);
}

/**
* remove a user from a role and fire of an update event.
* @param User $user
* @param string $roleName take a role name string rather than a role enitity
*/
public function removeUserFromRoleByName(User $user, string $roleName)
{
$role = $this->roleRepository->findOneByName($roleName);
$this->removeUserFromRole($user, $role);
}
}
63 changes: 63 additions & 0 deletions app/HMS/User/ProfileManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Carbon\Carbon;
use HMS\Entities\User;
use HMS\Entities\Profile;
use Illuminate\Http\Request;
use HMS\Repositories\MetaRepository;
use HMS\Repositories\UserRepository;
use HMS\Repositories\ProfileRepository;
Expand Down Expand Up @@ -86,4 +87,66 @@ public function create(User $user, string $address1, ?string $address2, ?string

return $user;
}

/**
* update the user form a form request.
* @param User $user user to update
* @param Illuminate\Http\Request $request
* @return User
*/
public function updateUserProfileFromRequest(User $user, Request $request)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Has this request been sanitized before it gets here? I forget laravels functionings.

{
$profile = $user->getProfile();

if ($request['address1']) {
$profile->setAddress1($request['address1']);
}

// Nullable field
if ($request->exists('address2')) {
$profile->setAddress2($request['address2']);
}

// Nullable field
if ($request->exists('address3')) {
$profile->setAddress3($request['address3']);
}

if ($request['addressCity']) {
$profile->setAddressCity($request['addressCity']);
}

if ($request['addressCounty']) {
$profile->setAddressCounty($request['addressCounty']);
}

if ($request['addressPostcode']) {
$profile->setAddressPostcode($request['addressPostcode']);
}

if ($request['contactNumber']) {
$profile->setContactNumber($request['contactNumber']);
}

// Nullable field
if ($request->exists('dateOfBirth')) {
if (is_null($request['dataOfBirth'])) {
$profile->setDateOfBirth(null);
} else {
$profile->setDateOfBirth(new Carbon($request['dateOfBirth']));
}
}

if ($request['creditLimit']) {
$profile->setCreditLimit($request['creditLimit']);
}

if ($request['unlockText']) {
$profile->setUnlockText($request['unlockText']);
}

$this->userRepository->save($user);

return $user;
}
}
28 changes: 27 additions & 1 deletion app/HMS/User/UserManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use HMS\Entities\Role;
use HMS\Entities\User;
use HMS\Auth\PasswordStore;
use Illuminate\Http\Request;
use HMS\Repositories\UserRepository;
use HMS\User\Permissions\RoleManager;

Expand Down Expand Up @@ -64,7 +65,32 @@ public function create(string $firstname, string $lastname, string $username, st
$this->userRepository->save($user);
$this->passwordStore->add($user->getUsername(), $password);

$this->roleManager->addUserToRoleByName($user, Role::MEMBER_CURRENT);
$this->roleManager->addUserToRoleByName($user, Role::MEMBER_APPROVAL);

return $user;
}

/**
* update the user form a form request.
* @param User $user user to update
* @param Illuminate\Http\Request $request
* @return User
*/
public function updateFromRequest(User $user, Request $request): User
{
if ($request['firstname']) {
$user->setFirstname($request['firstname']);
}

if ($request['lastname']) {
$user->setLastname($request['lastname']);
}

if ($request['email']) {
$user->setEmail($request['email']);
}

$this->userRepository->save($user);

return $user;
}
Expand Down
62 changes: 62 additions & 0 deletions app/Http/Controllers/Api/SearchController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use HMS\Repositories\UserRepository;

class SearchController extends Controller
{
/**
* @var UserRepository
*/
protected $userRepository;

/**
* Create a new controller instance.
*
* @param UserRepository $userRepository
*/
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;

$this->middleware('can:search.users')->only(['usersSearch']);
}

/**
* Search for users.
*
* @param Request $request
* @param string $searchQuery
* @return \Illuminate\Http\Response
*/
public function users(string $searchQuery = null, Request $request)
{
if ($request['q']) {
$searchQuery = $request['q'];
} elseif (is_null($searchQuery)) {
return response()->json([]);
}

// TODO: consider how to paginate response (posible fractal)
$users = $this->userRepository->searchLike($searchQuery, $request->input('withAccount', false));
$json = [];

foreach ($users as $user) {
$json[] = [
'id' => $user->getId(),
'fullname' => $user->getFullname(),
'username' => $user->getUsername(),
'email' => $user->getEmail(),
'address1' => $user->getProfile() ? $user->getProfile()->getAddress1() : null,
'addressPostcode' => $user->getProfile() ? $user->getProfile()->getAddressPostcode() : null,
'accountId' => $user->getAccount() ? $user->getAccount()->getId() : null,
'paymentRef' => $user->getAccount() ? $user->getAccount()->getPaymentRef() : null,
];
}

return response()->json($json);
}
}
Loading