File: D:/HostingSpaces/SBogers10/vebon.komma.pro/app/KommaApp/Members/MemberService.php
<?php
namespace KommaApp\Members;
use KommaApp\Members\Member;
use KommaApp\Site\Checkout\CheckoutSession\CheckoutSession;
use KommaApp\Site\FormValidation\UpdateMemberForm;
use KommaApp\Orders\Models\Order;
use KommaApp\Site\FormValidation\MemberForm;
use KommaApp\Site\FormValidation\FullMemberForm;
use KommaApp\Site\FormValidation\LoginForm;
use KommaApp\Site\Mailers\MemberMailer;
use TijsVerkoyen\CssToInlineStyles\Exception;
class MemberService
{
/**
* @var FullMemberForm
*/
private $fullMemberForm;
/**
* @var MemberForm
*/
private $memberForm;
/**
* @var Member
*/
private $member;
/**
* @var CheckoutSession
*/
private $checkoutSession;
/**
* @var LoginForm
*/
private $loginForm;
private $memberMailer;
/**
* @param Member $member
* @param FullMemberForm $fullMemberForm
* @param UpdateMemberForm $updateMemberForm
* @param MemberForm $memberForm
* @param LoginForm $loginForm
* @param CheckoutSession $checkoutSession
* @param MemberMailer $memberMailer
*/
public function __construct(
Member $member,
FullMemberForm $fullMemberForm,
UpdateMemberForm $updateMemberForm,
MemberForm $memberForm,
LoginForm $loginForm,
CheckoutSession $checkoutSession,
MemberMailer $memberMailer
)
{
$this->fullMemberForm = $fullMemberForm;
$this->updateMemberForm = $updateMemberForm;
$this->memberForm = $memberForm;
$this->member = $member;
$this->checkoutSession = $checkoutSession;
$this->loginForm = $loginForm;
$this->memberMailer = $memberMailer;
}
public function updateMember(array $input)
{
//todo: this is not the way to go, the lang should be set in the contruct
//Translate the messages
$this->updateMemberForm->translateMessages();
//Not logged in so new member
if (!$currentMember = $this->getLoggedInMember()) return $this->storeNewMember($input);
// Validate the form
if (!$this->updateMemberForm->isValid($input))
return \Redirect::back()
->withInput()
->withErrors($this->updateMemberForm->errorMessages());
if (!$currentMember = $this->getLoggedInMember())
throw new \Exception('Update failed: Can\'t find current user.');
// Prepare input data for update
$input['username'] = $input['email'];
if ($input['company'] == '') $input['company_vat'] = '';
$input['title'] == 'mr' ? $input['gender'] = 'male' : $input['female'] = 'male';
if ($input['password'] == '') {
unset($input['password']);
} else {
$input['password'] = \Hash::make($input['password']);
}
// Save the member
$currentMember->fill($input);
$currentMember->save();
return \Redirect::to(\Site::getPageService()->page('member')->route);
}
public function storeNewMemberFromToken($orderToken, $password)
{
$order = Order::where('order_token', $orderToken)->first();
$data = [
'username' => $order->invoice_email,
'email' => $order->invoice_email,
'password' => $password,
'password_confirmation' => $password,
'gender' => $order->invoice_gender,
'title' => $order->invoice_title,
'first_name' => $order->invoice_first_name,
'last_name' => $order->invoice_last_name,
'name_insertion' => $order->invoice_name_insertion,
'company' => $order->invoice_company,
'company_vat' => $order->invoice_company_vat,
'postal' => $order->invoice_postal,
'city' => $order->invoice_city,
'street' => $order->invoice_street,
'house_number' => $order->invoice_house_number,
'house_number_suffix' => $order->invoice_house_number_suffix,
'country' => $order->invoice_country,
'order_id' => $order->id,
];
return $this->storeNewMember($data);
}
/**
* @param array $input
*/
public function storeNewMember(array $input)
{
$input['username'] = $input['email'];
if (isset($input['company_vat'])) {
$input['company_vat'] = strtoupper($input['company_vat']);
$input['company_vat'] = preg_replace("/[^a-zA-Z0-9]/", "", $input['company_vat']);
}
//todo: this is not the wat to, the lang should be set in the contruct
//Translate the messages
$this->fullMemberForm->translateMessages();
// Validate the form
if (!$this->fullMemberForm->isValid($input)) {
return \Redirect::back()
->withInput()
->withErrors($this->fullMemberForm->errorMessages());
}
//TODO: Als een klant registreert, niet activeert, registreert activeert, kan hij meerdere accounts de hetzelfde email hebben
if ($currentMember = Member::where('email', $input['email'])->where('site_id', \Site::getId())->first()) {
if ($this->member->active == 1) {
return \Lang::get('member/create.error_user_exists');
}
$this->member = $currentMember;
}
$input['site_id'] = \Site::getId();
$input['password'] = \Hash::make($input['password']);
$input['title'] == 'mr' ? $input['gender'] = 'male' : $input['female'] = 'male';
do { // Ensure that validate_token is unique
$input['validate_token'] = str_random(32);
} while (!$this->member->where('validate_token', $input['validate_token'])->get());
$input['member_number'] = Member::getNewMemberNumber();
// Create Member
if (!$this->member
->fill($input)
->save()
) {
// Todo: With error / flash message
return \Redirect::back()
->withInput();
};
if (isset($input['order_id'])) {
$order = Order::find($input['order_id']);
$order->member()->associate($this->member);
$order->save();
}
try {
$this->memberMailer->sendMemberValidation($input);
} catch (\Exception $e) {
// Todo: With error / flash message
return \Redirect::back();
}
return \View::make('members.sendValidation', ['email' => $input['email']]);
}
/**
* Duplicate of store new member,
* I don't want to change the flow a week befor live
* Todo: fix this and make it in one function
*
* @param $input
* @return mixed
*
*/
public function streamLinedStoreNewMember($input)
{
//Clean up the VAt if it is set
if (isset($input['company_vat'])) {
$input['company_vat'] = strtoupper($input['company_vat']);
$input['company_vat'] = preg_replace("/[^a-zA-Z0-9]/", "", $input['company_vat']);
}
$input['site_id'] = \Site::getId();
$input['password'] = \Hash::make($input['password']);
$input['title'] == 'mr' ? $input['gender'] = 'male' : $input['female'] = 'male';
do { // Ensure that validate_token is unique
$input['validate_token'] = str_random(32);
} while (!$this->member->where('validate_token', $input['validate_token'])->get());
$input['member_number'] = Member::getNewMemberNumber();
if (!isset($input['username'])) {
$input['username'] = $input['member_number'];
}
// Create Member
if (!$this->member
->fill($input)
->save()
) {
return false;
};
return $this->member;
}
public function activateMember($token)
{
if ($this->member->where('validate_token', $token)->first() && $this->member->where('validate_token', $token)->first()->active == 1) {
return \View::make('members.invalidLink');
}
if (!($member = $this->member->where('validate_token', $token)->first())) {
return \View::make('members.invalidLink');
}
$member->active = 1;
$member->validate_token = null;
$member->save();
return \View::make('members.activated');
}
/**
* @param $input
*/
public function store($input)
{
if (isset($input['company_vat'])) {
$input['company_vat'] = strtoupper($input['company_vat']);
$input['company_vat'] = preg_replace("/[^a-zA-Z0-9]/", "", $input['company_vat']);
}
// Validate the form
if (!$this->memberForm->isValid($input)) {
return \Redirect::back()
->withErrors($this->memberForm->errorMessages());
}
// Create data array
$data = [];
// check for unique email
if ($currentMember = Member::where('email', $input['email'])->where('site_id', \Site::getId())->first()) {
if ($this->member->active == 1) {
return \Lang::get('member/create.error_user_exists');
}
$this->member = $currentMember;
}
// Get user data from the checkoutSession
/*
foreach($this->checkoutSession->member()->get() as $invoiceField => $value)
{
$dbKey = str_replace('invoice-','',$invoiceField);
$dbKey = str_replace('-','_',$dbKey);
$data[$dbKey] = $value;
}
*/
// Other data
$data['site_id'] = \Site::getId();
$data['username'] = $data['email'];
$data['member_number'] = Member::getNewMemberNumber();
// Set password
$this->member->password = \Hash::make($input['password']);
$this->member->remember_token = $data['remember_token'];
// Set validation token
do { // Ensure that validate_token is unique
$input['validate_token'] = str_random(32);
} while (!$this->member->where('validate_token', $input['validate_token'])->get());
$data['validate_token'] = $this->member->validate_token = $input['validate_token'];
// Mass assign data and save order
if (!$this->member
->fill($data)
->save()
) {
// Todo message
// Bevestigings mail
return \Redirect::back();
};
if (isset($input['order_id'])) {
$order = Order::find(\Input::get('order_id'));
$order->member()->associate($this->member);
$order->save();
}
try {
$this->memberMailer->sendMemberValidation($input);
} catch (\Exception $e) {
// Todo: With error / flash message
return \Redirect::back();
}
return \View::make('members.sendValidation', ['email' => $input['email']]);
}
public function isLoggedIn()
{
return \Auth::member()->check();
}
public function authorizeLogin($input, $pageSlug = 'member')
{
// Is the form valid
$messages = [
'email.exists' => \Lang::get('member/login.email_exists'),
'email.activated' => \Lang::get('member/login.email_activated'),
];
$this->loginForm->setMessages($messages);
if (!$this->loginForm->isValid($input)) {
return \Redirect::back()
->withErrors($this->loginForm->errorMessages());
}
$input['active'] = 1;
$input['site_id'] = \Site::getId();
// Does the user exists
if (!\Auth::member()->attempt($input)) {
return \Redirect::back()
->withErrors(['wrongPassword' => \Lang::get('member/login.wrong_password')]);
// Todo errors
}
// Redirect to checkout data
$this->checkoutSession->member()->fillAfterLogin();
return \Redirect::to(\Site::getPageService()->page($pageSlug)->route);
}
public function getLoggedInMember()
{
if (!$this->isLoggedIn()) {
return null;
}
return \Auth::member()->get();
}
public function checkEmailAddress($email)
{
$member = $this->member
->where('email', $email)
->where('site_id', \Site::getId())
->where('active', 1)
->first();
if ($member == null) return false;
return true;
}
public function getReminderService()
{
return $this->reminderService;
}
public function getMemberByEmail($email)
{
$member = Member::
where('email', '=', $email)
->where('site_id', '=', \Site::getId())
->where('active', '=', 1)
->first();
return $member;
}
/**
* In this Method we will activate the account based on an order token
* We'll check if there is an member for the order and link this
* We are going to activate this account and set token to null
*
* @param $orderToken
* @param $password
* @return array|bool
*
*/
public function LinkAccountFromOrder($orderToken, $password)
{
//Load order by Token
if (!$order = \App::make('KommaApp\Orders\OrderService')->getOrderByToken($orderToken)) {
//No order found, return with error message
}
//load member from order
if (!$member = $order->member) {
//No member found, this is normaly not possible todo: create member from token?
return ['error' => 'Oops Something went wrong'];
}
//Set password
$member->password = \Hash::make($password);
//Set username, use the member email (is our default)
$member->username = $member->email;
//set account active
$member->active = 1;
//Set validate_token to null
$member->validate_token = null;
//save the member
$member->save();
return true;
}
}