mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-06-23 20:00:33 -04:00
Multi-db support
This commit is contained in:
parent
2b564e4fc0
commit
9c70ca63f3
@ -229,7 +229,8 @@ if (! defined('APP_NAME')) {
|
|||||||
define('SESSION_REFERRAL_CODE', 'referralCode');
|
define('SESSION_REFERRAL_CODE', 'referralCode');
|
||||||
define('SESSION_LEFT_SIDEBAR', 'showLeftSidebar');
|
define('SESSION_LEFT_SIDEBAR', 'showLeftSidebar');
|
||||||
define('SESSION_RIGHT_SIDEBAR', 'showRightSidebar');
|
define('SESSION_RIGHT_SIDEBAR', 'showRightSidebar');
|
||||||
define('SESSION_DB_SERVER', 'dbServer');
|
define('SESSION_USER_DB_SERVER', 'userDbServer');
|
||||||
|
define('SESSION_CONTACT_DB_SERVER', 'contactDbServer');
|
||||||
|
|
||||||
define('SESSION_LAST_REQUEST_PAGE', 'SESSION_LAST_REQUEST_PAGE');
|
define('SESSION_LAST_REQUEST_PAGE', 'SESSION_LAST_REQUEST_PAGE');
|
||||||
define('SESSION_LAST_REQUEST_TIME', 'SESSION_LAST_REQUEST_TIME');
|
define('SESSION_LAST_REQUEST_TIME', 'SESSION_LAST_REQUEST_TIME');
|
||||||
|
@ -142,7 +142,7 @@ class AuthController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function postLoginWrapper(Request $request)
|
public function postLoginWrapper(Request $request)
|
||||||
{
|
{
|
||||||
LookupUser::setServerByEmail($request->input('email'));
|
LookupUser::setServerByField('email', $request->input('email'));
|
||||||
|
|
||||||
$userId = Auth::check() ? Auth::user()->id : null;
|
$userId = Auth::check() ? Auth::user()->id : null;
|
||||||
$user = User::where('email', '=', $request->input('email'))->first();
|
$user = User::where('email', '=', $request->input('email'))->first();
|
||||||
|
@ -29,12 +29,12 @@ class Kernel extends HttpKernel
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $routeMiddleware = [
|
protected $routeMiddleware = [
|
||||||
|
'lookup' => 'App\Http\Middleware\DatabaseLookup',
|
||||||
'auth' => 'App\Http\Middleware\Authenticate',
|
'auth' => 'App\Http\Middleware\Authenticate',
|
||||||
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
|
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
|
||||||
'permissions.required' => 'App\Http\Middleware\PermissionsRequired',
|
'permissions.required' => 'App\Http\Middleware\PermissionsRequired',
|
||||||
'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
|
'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
|
||||||
'api' => 'App\Http\Middleware\ApiCheck',
|
'api' => 'App\Http\Middleware\ApiCheck',
|
||||||
'cors' => '\Barryvdh\Cors\HandleCors',
|
'cors' => '\Barryvdh\Cors\HandleCors',
|
||||||
'lookup' => 'App\Http\Middleware\DatabaseLookup',
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,29 @@ namespace App\Http\Middleware;
|
|||||||
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Closure;
|
use Closure;
|
||||||
|
use App\Models\LookupContact;
|
||||||
|
use App\Models\LookupInvitation;
|
||||||
|
|
||||||
class DatabaseLookup
|
class DatabaseLookup
|
||||||
{
|
{
|
||||||
public function handle(Request $request, Closure $next)
|
public function handle(Request $request, Closure $next, $guard = 'user')
|
||||||
{
|
{
|
||||||
if (env('MULTI_DB_ENABLED') && ! session('SESSION_DB_SERVER')) {
|
if (! env('MULTI_DB_ENABLED')) {
|
||||||
return redirect('/logout');
|
return $next($request);
|
||||||
|
}
|
||||||
|
|
||||||
|
// user's value is set when logging in
|
||||||
|
if ($guard == 'user') {
|
||||||
|
if (! session('SESSION_USER_DB_SERVER')) {
|
||||||
|
return redirect('/logout');
|
||||||
|
}
|
||||||
|
// contacts can login with just the URL
|
||||||
|
} else {
|
||||||
|
if (request()->invitation_key) {
|
||||||
|
LookupInvitation::setServerByField('invitation_key', request()->invitation_key);
|
||||||
|
} elseif (request()->contact_key) {
|
||||||
|
LookupContact::setServerByField('contact_key', request()->contact_key);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
|
@ -25,7 +25,7 @@ Route::get('/keep_alive', 'HomeController@keepAlive');
|
|||||||
Route::post('/get_started', 'AccountController@getStarted');
|
Route::post('/get_started', 'AccountController@getStarted');
|
||||||
|
|
||||||
// Client visible pages
|
// Client visible pages
|
||||||
Route::group(['middleware' => ['auth:client', 'lookup']], function () {
|
Route::group(['middleware' => ['lookup:contact', 'auth:client']], function () {
|
||||||
Route::get('view/{invitation_key}', 'ClientPortalController@view');
|
Route::get('view/{invitation_key}', 'ClientPortalController@view');
|
||||||
Route::get('download/{invitation_key}', 'ClientPortalController@download');
|
Route::get('download/{invitation_key}', 'ClientPortalController@download');
|
||||||
Route::put('sign/{invitation_key}', 'ClientPortalController@sign');
|
Route::put('sign/{invitation_key}', 'ClientPortalController@sign');
|
||||||
@ -117,7 +117,7 @@ if (Utils::isTravis()) {
|
|||||||
Route::get('/check_data', 'AppController@checkData');
|
Route::get('/check_data', 'AppController@checkData');
|
||||||
}
|
}
|
||||||
|
|
||||||
Route::group(['middleware' => ['auth:user', 'lookup']], function () {
|
Route::group(['middleware' => ['lookup:user', 'auth:user']], function () {
|
||||||
Route::get('dashboard', 'DashboardController@index');
|
Route::get('dashboard', 'DashboardController@index');
|
||||||
Route::get('dashboard_chart_data/{group_by}/{start_date}/{end_date}/{currency_id}/{include_expenses}', 'DashboardController@chartData');
|
Route::get('dashboard_chart_data/{group_by}/{start_date}/{end_date}/{currency_id}/{include_expenses}', 'DashboardController@chartData');
|
||||||
Route::get('set_entity_filter/{entity_type}/{filter?}', 'AccountController@setEntityFilter');
|
Route::get('set_entity_filter/{entity_type}/{filter?}', 'AccountController@setEntityFilter');
|
||||||
@ -230,7 +230,7 @@ Route::group(['middleware' => ['auth:user', 'lookup']], function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
Route::group([
|
Route::group([
|
||||||
'middleware' => ['auth:user', 'permissions.required', 'lookup'],
|
'middleware' => ['lookup:user', 'auth:user', 'permissions.required'],
|
||||||
'permissions' => 'admin',
|
'permissions' => 'admin',
|
||||||
], function () {
|
], function () {
|
||||||
Route::get('api/users', 'UserController@getDatatable');
|
Route::get('api/users', 'UserController@getDatatable');
|
||||||
@ -295,7 +295,7 @@ Route::group([
|
|||||||
Route::get('self-update/download', 'SelfUpdateController@download');
|
Route::get('self-update/download', 'SelfUpdateController@download');
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::group(['middleware' => ['auth:user', 'lookup']], function () {
|
Route::group(['middleware' => ['lookup:user', 'auth:user']], function () {
|
||||||
Route::get('settings/{section?}', 'AccountController@showSection');
|
Route::get('settings/{section?}', 'AccountController@showSection');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -41,6 +41,46 @@ class LookupModel extends Eloquent
|
|||||||
config(['database.default' => $current]);
|
config(['database.default' => $current]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function setServerByField($field, $value)
|
||||||
|
{
|
||||||
|
if (! env('MULTI_DB_ENABLED')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$className = get_called_class();
|
||||||
|
$className = str_replace('Lookup', '', $className);
|
||||||
|
$key = sprintf('server:%s:%s:%s', $className, $field, $value);
|
||||||
|
|
||||||
|
// check if we've cached this lookup
|
||||||
|
if ($server = session($key)) {
|
||||||
|
static::setDbServer($server);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$current = config('database.default');
|
||||||
|
config(['database.default' => DB_NINJA_LOOKUP]);
|
||||||
|
|
||||||
|
if ($lookupUser = static::where($field, '=', $value)->first()) {
|
||||||
|
$server = $lookupUser->getDbServer();
|
||||||
|
static::setDbServer($server);
|
||||||
|
|
||||||
|
$entity = new $className();
|
||||||
|
if (! $entity::where($field, '=', $value)->first()) {
|
||||||
|
abort("Looked up {$className} not found: {$field} => {$value}");
|
||||||
|
}
|
||||||
|
|
||||||
|
session([$key => $server]);
|
||||||
|
} else {
|
||||||
|
config(['database.default' => $current]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function setDbServer($server)
|
||||||
|
{
|
||||||
|
session(['SESSION_USER_DB_SERVER' => $server]);
|
||||||
|
config(['database.default' => $server]);
|
||||||
|
}
|
||||||
|
|
||||||
public function getDbServer()
|
public function getDbServer()
|
||||||
{
|
{
|
||||||
return $this->lookupAccount->lookupCompany->dbServer->name;
|
return $this->lookupAccount->lookupCompany->dbServer->name;
|
||||||
|
@ -19,25 +19,4 @@ class LookupUser extends LookupModel
|
|||||||
'user_id',
|
'user_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
public static function setServerByEmail($email)
|
|
||||||
{
|
|
||||||
if (! env('MULTI_DB_ENABLED')) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$current = config('database.default');
|
|
||||||
config(['database.default' => DB_NINJA_LOOKUP]);
|
|
||||||
|
|
||||||
if ($lookupUser = static::whereEmail($email)->first()) {
|
|
||||||
$server = $lookupUser->getDbServer();
|
|
||||||
session(['SESSION_DB_SERVER' => $server]);
|
|
||||||
config(['database.default' => $server]);
|
|
||||||
|
|
||||||
if (! User::whereEmail($email)->first()) {
|
|
||||||
abort('Lookedup user not found: ' . $email);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
config(['database.default' => $current]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user