Skip to content

Commit

Permalink
Merge pull request #12 from MSR2012/main
Browse files Browse the repository at this point in the history
Registration feature done
  • Loading branch information
curtisdelicata authored Oct 4, 2023
2 parents 16b2403 + b929355 commit 497ee1f
Show file tree
Hide file tree
Showing 12 changed files with 376 additions and 23 deletions.
2 changes: 1 addition & 1 deletion .docker/prod/app/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
FROM php:8.2-fpm-bullseye

ARG BIN_DIR=/usr/local/bin
ARG COMPOSER_VERSION=2.0.4
ARG COMPOSER_VERSION=2.5.5
# Set working directory
COPY . /var/www/
COPY ./.env.example /var/www/.env
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<?php

namespace App\Http\Controllers;
namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\UserSocial;
use Illuminate\Http\Request;
Expand Down Expand Up @@ -34,26 +35,26 @@ public function __construct()
// {
// return Socialite::driver($service)->redirect();
// }

//validate if the the provider is expected (facebook, google, github)
protected function validateProvider($provider)
{
if (! in_array($provider, ['facebook', 'google', 'github'])) {
if (!in_array($provider, ['facebook', 'google', 'github'])) {
return response()->json(['error' => 'Please login using facebook or google or github'], 422);
}
}

//check if the user has socila linked
public function needsToCreateSocial(User $user, $service)
{
return ! $user->hasSocialLinked($service);
return !$user->hasSocialLinked($service);
}


public function redirectToProvider($provider)
{
$validated = $this->validateProvider($provider);
if (! is_null($validated)) {
if (!is_null($validated)) {
return $validated;
}

Expand All @@ -62,11 +63,11 @@ public function redirectToProvider($provider)

public function providerCallback($provider)
{
try{

try {
$user = Socialite::driver($provider)->stateless()->user();
} catch (Exception) {
return redirect(config('settings.clientBaseUrl').'/social-callback?token=&status=false&message=Invalid credentials provided!');
return redirect(config('settings.clientBaseUrl') . '/social-callback?token=&status=false&message=Invalid credentials provided!');
}

$curUser = User::where('email', $user->getEmail())->first();
Expand All @@ -80,11 +81,11 @@ public function providerCallback($provider)
]);
}
} catch (Exception) {
return redirect(config('settings.clientBaseUrl').'/social-callback?token=&status=false&message=Something went wrong!');
return redirect(config('settings.clientBaseUrl') . '/social-callback?token=&status=false&message=Something went wrong!');
}

//if the user exists then login:

try {
if ($this->needsToCreateSocial($curUser, $provider)) {
UserSocial::create([
Expand All @@ -94,29 +95,29 @@ public function providerCallback($provider)
]);
}
} catch (Exception) {
return redirect(config('settings.clientBaseUrl').'/social-callback?token=&status=false&message=Something went wrong!');
return redirect(config('settings.clientBaseUrl') . '/social-callback?token=&status=false&message=Something went wrong!');
}

//check if the user is not blocked or something
if ($this->loggableSocialUser($curUser)) {
Auth::guard('web')->login($curUser, true);

return redirect(config('settings.clientBaseUrl').'/social-callback?token='.csrf_token().'&status=success&message=success');
return redirect(config('settings.clientBaseUrl') . '/social-callback?token=' . csrf_token() . '&status=success&message=success');
}

return redirect(config('settings.clientBaseUrl').'/social-callback?token=&status=false&message=Something went wrong while we processing the login. Please try again!');
return redirect(config('settings.clientBaseUrl') . '/social-callback?token=&status=false&message=Something went wrong while we processing the login. Please try again!');

}

private function loggableUser(Request $request)
{
$user = User::whereEmail($request->input('email'))->first();

if (! optional($user)->currentPasswordIs($request->input('password'))) {
if (!optional($user)->currentPasswordIs($request->input('password'))) {
return;
}

if (! $user->email) {
if (!$user->email) {
throw ValidationException::withMessages([
'email' => 'Email does not exist.',
]);
Expand All @@ -133,7 +134,7 @@ private function loggableUser(Request $request)
]);
}

if (! App::runningUnitTests()) {
if (!App::runningUnitTests()) {
$company = $user->person->company();
// \Log::debug('Login----------------------'.$company);
$tenant = false;
Expand All @@ -142,20 +143,20 @@ private function loggableUser(Request $request)
}
// set company id as default
$main_company = $user->person->company();
if ($main_company !== null && ! $user->isAdmin()) {
if ($main_company !== null && !$user->isAdmin()) {
$c_id = $main_company->id;
}
if (! $user->isAdmin()) {
if (!$user->isAdmin()) {
$tenants = Tenant::find($main_company->id);
}
if ($user->isAdmin()) {
$tenants = null;
}
if ($main_company === null && ! $user->isAdmin()) {
if ($main_company === null && !$user->isAdmin()) {
// if (($main_company == null||$tenants=='') && ! $user->isAdmin()) {
// if ($main_company == null) {
$this->create_company($user);
} elseif ($tenants && ! $user->isAdmin()) {
} elseif ($tenants && !$user->isAdmin()) {
// $c = DB::connection('tenantdb',$tenants->tenancy_db_name)->table('users')->count();
$company = \App\Models\Company::find($main_company->id);
// \Log::debug('Database----------------------'.$main_company->id);
Expand Down
88 changes: 88 additions & 0 deletions app/Http/Controllers/Auth/RegisterController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\Company;
use App\Models\Person;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use App\Traits\ActivationTrait;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use LaravelEnso\Roles\Models\Role;
use LaravelEnso\UserGroups\Models\UserGroup;

class RegisterController extends Controller
{
use RegistersUsers;
use ActivationTrait;

protected $redirectTo = RouteServiceProvider::HOME;

public function __construct()
{
$this->middleware('guest');
}

protected function validator(array $data)
{
return Validator::make($data, [
'first_name' => ['required', 'string', 'max:255'],
'last_name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:5', 'confirmed'],
]);
}

public function create(Request $request)
{
$validator = $this->validator($request->all());
if ($validator->fails()) {
return $validator->errors();
}

$person = new Person();
$name = $request['first_name'] . ' ' . $request['last_name'];
$person->name = $name;
$person->email = $request['email'];
$person->save();

$user_group = UserGroup::where('name', 'Administrators')->first();
if ($user_group === null) {
$user_group = UserGroup::create(['name' => 'Administrators', 'description' => 'Administrator users group']);
}

$role = Role::where('name', 'free')->first();
if ($role === null) {
$role = Role::create(['menu_id' => 1, 'name' => 'free', 'display_name' => 'Supervisor', 'description' => 'Supervisor role.']);
}

$user = User::create([
'email' => $request['email'],
'password' => bcrypt($request['password']),
'person_id' => $person->id,
'group_id' => $user_group->id,
'role_id' => $role->id,
'is_active' => 1,
]);

$company = Company::create([
'name' => $request['email'],
'email' => $request['email'],
'is_tenant' => 1,
'status' => 1,
]);

$person->companies()->attach($company->id, ['person_id' => $person->id, 'is_main' => 1, 'is_mandatary' => 1, 'company_id' => $company->id]);

if ($request->selected_plan === '' || $request->selected_plan === $user->role_id) {
$user->plan_id = '';
} else {
$user->plan_id = $request->selected_plan;
}

return $user;
}
}
74 changes: 74 additions & 0 deletions app/Http/Controllers/Auth/VerificationController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\Activation;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Symfony\Component\HttpFoundation\Response;

class VerificationController extends Controller
{
protected $redirectTo = RouteServiceProvider::HOME;

public function __construct()
{
}

/**
* verify user token.
*/
public function verify_user(Request $request)
{
$token = null;
$activation = null;
$user_id = null;
$user = null;
$data = $request->all();
$this->validator($data)->validate();
$token = $request->get('token');
$activation = Activation::where('token', $token)->first();
if ($activation === null) {
return response()->json(
[
'error' => [
'code' => 300,
'message' => 'Send activation code again.',
],
],
Response::HTTP_UNPROCESSABLE_ENTITY
);
}
$user_id = $activation->user_id;
$user = User::find($user_id);
if ($user === null) {
return response()->json(
[
'error' => [
'code' => 301,
'message' => 'There is not such user.',
],
],
Response::HTTP_UNPROCESSABLE_ENTITY
);
}
$user->is_active = 1;
$user->email_verified_at = date('Y-m-d H:i:s');
$user->save();
Activation::where('user_id', $user_id)->delete();

return response()->json([
'csrfToken' => csrf_token(),
]);
}

protected function validator(array $data)
{
return Validator::make($data, [
'token' => ['required', 'string', 'max:255'],
]);
}
}
28 changes: 28 additions & 0 deletions app/Models/Activation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

/**
* @property int $id
* @property int $user_id
* @property string $token
* @property string $ip_address
* @property string $created_at
* @property string $updated_at
*/
class Activation extends Model
{
/**
* The "type" of the auto-incrementing ID.
*
* @var string
*/
protected $keyType = 'integer';

/**
* @var array
*/
protected $fillable = ['user_id', 'token', 'ip_address', 'created_at', 'updated_at'];
}
19 changes: 19 additions & 0 deletions app/Models/Company.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace App\Models;

use App\Traits\CreatedBy;
use LaravelEnso\Companies\Models\Company as CoreCompany;

class Company extends CoreCompany
{
use CreatedBy;

protected $fillable = [
'privacy',
'name',
'email',
'is_tenant',
'status',
];
}
Loading

0 comments on commit 497ee1f

Please sign in to comment.