Skip to content

Commit ec7a45c

Browse files
authored
Revert "refactor: Consolidate dbproxy and user models (#461)" (#594)
This reverts commit 00d566a.
1 parent 00d566a commit ec7a45c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+437
-270
lines changed

Diff for: docs/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ Then
4444
```sh
4545
docker exec -it backend-dev bash
4646
php artisan erd:generate micro_power_manager --excludes=plugins --file=central_database.sql
47-
php artisan erd:generate tenant --path=/database/migrations/tenant --excludes=companies,company_databases,company_jobs --file=tenant_database.sql
47+
php artisan erd:generate tenant --path=/database/migrations/tenant --excludes=companies,company_databases,company_jobs,database_proxies --file=tenant_database.sql
4848
php artisan export
4949
```
5050

Diff for: src/backend/app/Console/Commands/AbstractSharedCommand.php

+12-11
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
namespace App\Console\Commands;
44

55
use App\Models\CompanyDatabase;
6-
use App\Services\CompanyService;
76
use Illuminate\Console\Command;
87
use Illuminate\Database\Eloquent\Collection;
8+
use MPM\DatabaseProxy\DatabaseProxyManagerService;
99
use Symfony\Component\Console\Input\InputInterface;
1010
use Symfony\Component\Console\Output\OutputInterface;
1111

@@ -30,35 +30,36 @@ protected function configure(): void {
3030
}
3131

3232
protected function execute(InputInterface $input, OutputInterface $output) {
33-
$companyService = app()->make(CompanyService::class);
33+
/** @var DatabaseProxyManagerService $databaseProxyManagerService */
34+
$databaseProxyManagerService = app()->make(DatabaseProxyManagerService::class);
3435

3536
$companyId = null;
3637
if ($this->hasOption('company-id')) {
3738
$companyId = $this->option('company-id');
3839
}
3940
if ($companyId) {
40-
$this->runForCompany($companyService, (int) $companyId, $input, $output);
41+
$this->runForCompany($databaseProxyManagerService, (int) $companyId, $input, $output);
4142
} else {
42-
$this->runForAllTenants($companyService, $input, $output);
43+
$this->runForAllTenants($databaseProxyManagerService, $input, $output);
4344
}
4445

4546
return $this->EXECUTION_TYPE;
4647
}
4748

4849
private function runForAllTenants(
49-
CompanyService $companyService,
50+
DatabaseProxyManagerService $databaseProxyManagerService,
5051
InputInterface $input,
5152
OutputInterface $output,
5253
): void {
53-
$companyService->queryAllConnections()
54-
->chunkById(50, function (Collection $modelCollection) use ($companyService, $input, $output) {
54+
$databaseProxyManagerService->queryAllConnections()
55+
->chunkById(50, function (Collection $modelCollection) use ($databaseProxyManagerService, $input, $output) {
5556
$modelCollection->map(function (CompanyDatabase $companyDatabase) use (
56-
$companyService,
57+
$databaseProxyManagerService,
5758
$input,
5859
$output
5960
) {
6061
$this->runForCompany(
61-
$companyService,
62+
$databaseProxyManagerService,
6263
$companyDatabase->getCompanyId(),
6364
$input,
6465
$output
@@ -68,13 +69,13 @@ private function runForAllTenants(
6869
}
6970

7071
private function runForCompany(
71-
CompanyService $companyService,
72+
DatabaseProxyManagerService $databaseProxyManagerService,
7273
int $companyId,
7374
InputInterface $input,
7475
OutputInterface $output,
7576
): void {
7677
$this->info('Running '.$this->name.' for company ID : '.$companyId);
77-
$companyService->runForCompany($companyId, function () use ($input, $output) {
78+
$databaseProxyManagerService->runForCompany($companyId, function () use ($input, $output) {
7879
parent::execute($input, $output);
7980
});
8081
}

Diff for: src/backend/app/Console/Commands/ModelShowTenant.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
namespace App\Console\Commands;
44

5-
use App\Services\CompanyService;
65
use Illuminate\Console\Command;
6+
use MPM\DatabaseProxy\DatabaseProxyManagerService;
77

88
class ModelShowTenant extends Command {
99
/**
@@ -26,7 +26,7 @@ class ModelShowTenant extends Command {
2626
* @return void
2727
*/
2828
public function __construct(
29-
private CompanyService $companyService,
29+
private DatabaseProxyManagerService $databaseProxyManagerService,
3030
) {
3131
parent::__construct();
3232
}
@@ -35,7 +35,7 @@ public function __construct(
3535
* Execute the console command.
3636
*/
3737
public function handle() {
38-
$this->companyService->buildDatabaseConnectionDemoCompany();
38+
$this->databaseProxyManagerService->buildDatabaseConnectionDemoCompany();
3939

4040
$this->call('model:show', [
4141
'model' => $this->argument('model'),

Diff for: src/backend/app/Http/Controllers/AgentWebController.php

+13-1
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44

55
use App\Http\Requests\CreateAgentRequest;
66
use App\Http\Resources\ApiResource;
7+
use App\Models\CompanyDatabase;
78
use App\Services\AddressesService;
89
use App\Services\AgentService;
910
use App\Services\CompanyDatabaseService;
1011
use App\Services\CountryService;
12+
use App\Services\DatabaseProxyService;
1113
use App\Services\PersonAddressService;
1214
use App\Services\PersonService;
1315
use Illuminate\Http\Request;
@@ -21,6 +23,7 @@ public function __construct(
2123
private PersonAddressService $personAddressService,
2224
private CountryService $countryService,
2325
private CompanyDatabaseService $companyDatabaseService,
26+
private DatabaseProxyService $databaseProxyService,
2427
) {}
2528

2629
public function index(Request $request): ApiResource {
@@ -46,7 +49,16 @@ public function store(CreateAgentRequest $request): ApiResource {
4649
'fire_base_token' => '-',
4750
'connection' => ' ', // TODO: solve this. //auth('api')->user()->company->database->database_name
4851
];
49-
$companyId = auth('api')->payload()->get('companyId');
52+
/** @var \Tymon\JWTAuth\JWTGuard $guard */
53+
$guard = auth('api');
54+
$companyId = $guard->payload()->get('companyId');
55+
$companyDatabase = CompanyDatabase::query()->where('company_id', $companyId)->firstOrFail();
56+
$databaseProxyData = [
57+
'email' => $request['email'],
58+
'fk_company_id' => $companyId,
59+
'fk_company_database_id' => $companyDatabase->getId(),
60+
];
61+
$this->databaseProxyService->create($databaseProxyData);
5062

5163
return ApiResource::make($this->agentService->create(
5264
$agentData,

Diff for: src/backend/app/Http/Controllers/CompanyController.php

+9-5
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@
1414
use Carbon\Carbon;
1515
use Illuminate\Http\JsonResponse;
1616
use Illuminate\Support\Facades\Artisan;
17+
use MPM\DatabaseProxy\DatabaseProxyManagerService;
1718

1819
class CompanyController extends Controller {
1920
public function __construct(
2021
private CompanyService $companyService,
2122
private CompanyDatabaseService $companyDatabaseService,
2223
private PluginsService $pluginsService,
2324
private UserService $userService,
25+
private DatabaseProxyManagerService $databaseProxyManagerService,
2426
private MpmPluginService $mpmPluginService,
2527
private RegistrationTailService $registrationTailService,
2628
private MainSettingsService $mainSettingsService,
@@ -41,8 +43,8 @@ public function store(CompanyRegistrationRequest $request): JsonResponse {
4143
Carbon::now()->timestamp,
4244
]);
4345

44-
// Create Admin user
45-
$this->companyService->runForCompany(
46+
// Create Admin user and DatabaseProxy
47+
$this->databaseProxyManagerService->runForCompany(
4648
$company->getId(),
4749
fn () => $this->userService->create(
4850
[
@@ -56,7 +58,7 @@ public function store(CompanyRegistrationRequest $request): JsonResponse {
5658
);
5759

5860
// Set some meaningful settings by default
59-
$this->companyService->runForCompany(
61+
$this->databaseProxyManagerService->runForCompany(
6062
$company->getId(),
6163
function () use ($company, $usageType) {
6264
$mainSettings = $this->mainSettingsService->getAll()->first();
@@ -68,7 +70,7 @@ function () use ($company, $usageType) {
6870
);
6971

7072
// Plugin and Registration Tail magic
71-
return $this->companyService->runForCompany(
73+
return $this->databaseProxyManagerService->runForCompany(
7274
$company->getId(),
7375
function () use ($company, $plugins) {
7476
// Prompt new users to configure their default settings
@@ -105,6 +107,8 @@ function () use ($company, $plugins) {
105107
}
106108

107109
public function get($email): ApiResource {
108-
return ApiResource::make($this->companyService->findByEmail($email));
110+
$databaseProxy = $this->databaseProxyManagerService->findByEmail($email);
111+
112+
return ApiResource::make($this->companyService->getByDatabaseProxy($databaseProxy));
109113
}
110114
}

Diff for: src/backend/app/Http/Controllers/Reports.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use App\Models\City;
77
use App\Models\ConnectionGroup;
88
use App\Models\ConnectionType;
9+
use App\Models\DatabaseProxy;
910
use App\Models\Meter\Meter;
1011
use App\Models\PaymentHistory;
1112
use App\Models\Report;
@@ -586,7 +587,8 @@ static function ($q) {
586587
$writer = new Xlsx($this->spreadsheet);
587588
$dirPath = storage_path('./'.$reportType);
588589
$user = User::query()->first();
589-
$companyId = $user->getCompanyId();
590+
$databaseProxy = app()->make(DatabaseProxy::class);
591+
$companyId = $databaseProxy->findByEmail($user->email)->getCompanyId();
590592

591593
if (!file_exists($dirPath) && !mkdir($dirPath, 0774, true) && !is_dir($dirPath)) {
592594
throw new \RuntimeException(sprintf('Directory "%s" was not created', $dirPath));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\Http\Requests\CreateAddressRequest;
6+
use App\Http\Resources\ApiResource;
7+
use App\Models\User;
8+
use App\Services\UserAddressService;
9+
use Illuminate\Http\Request;
10+
11+
class UserAddressController extends Controller {
12+
private $userAddressService;
13+
14+
public function __construct(UserAddressService $userAddressService) {
15+
$this->userAddressService = $userAddressService;
16+
}
17+
18+
public function store(User $user, CreateAddressRequest $request): ApiResource {
19+
return new ApiResource($this->userAddressService->update($user, $request->all()));
20+
}
21+
22+
public function admin(User $user, Request $request) {
23+
$address = $user->addressDetails()->first();
24+
25+
return new ApiResource($address);
26+
}
27+
28+
public function update(User $user, CreateAddressRequest $request) {
29+
return new ApiResource($this->userAddressService->update($user, $request->all()));
30+
}
31+
}

Diff for: src/backend/app/Http/Controllers/UserController.php

+10-2
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,32 @@
66
use App\Http\Resources\ApiResource;
77
use App\Models\User;
88
use App\Services\CompanyDatabaseService;
9+
use App\Services\DatabaseProxyService;
910
use App\Services\UserService;
1011
use Illuminate\Http\Request;
1112

1213
class UserController extends Controller {
1314
public function __construct(
1415
private UserService $userService,
16+
private DatabaseProxyService $databaseProxyService,
1517
private CompanyDatabaseService $companyDatabaseService,
1618
) {}
1719

1820
public function index(Request $request): ApiResource {
19-
$companyId = auth()->user()->company_id;
20-
$users = $this->userService->list($companyId);
21+
$users = $this->userService->list();
2122

2223
return new ApiResource($users);
2324
}
2425

2526
public function store(CreateAdminRequest $request) {
2627
$user = $this->userService->create($request->only(['name', 'password', 'email']));
28+
$companyDatabase = $this->companyDatabaseService->findByCompanyId($user->getCompanyId());
29+
$databaseProxyData = [
30+
'email' => $user->getEmail(),
31+
'fk_company_id' => $user->getCompanyId(),
32+
'fk_company_database_id' => $companyDatabase->getId(),
33+
];
34+
$this->databaseProxyService->create($databaseProxyData);
2735

2836
return ApiResource::make($user->toArray());
2937
}

Diff for: src/backend/app/Http/Middleware/UserDefaultDatabaseConnectionMiddleware.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66

77
use App\Exceptions\Handler;
88
use App\Exceptions\ValidationException;
9-
use App\Services\CompanyService;
109
use Illuminate\Http\Request;
1110
use Illuminate\Support\Facades\Log;
1211
use Illuminate\Support\Str;
12+
use MPM\DatabaseProxy\DatabaseProxyManagerService;
1313
use MPM\TenantResolver\ApiCompanyResolverService;
1414
use MPM\TenantResolver\ApiResolvers\Data\ApiResolverMap;
1515

@@ -19,7 +19,7 @@
1919
*/
2020
class UserDefaultDatabaseConnectionMiddleware {
2121
public function __construct(
22-
private CompanyService $companyService,
22+
private DatabaseProxyManagerService $databaseProxyManager,
2323
private ApiCompanyResolverService $apiCompanyResolverService,
2424
private ApiResolverMap $apiResolverMap,
2525
) {}
@@ -83,11 +83,11 @@ private function handleApiRequest(Request $request, \Closure $next) {
8383

8484
// webclient login
8585
if ($request->path() === 'api/auth/login' || $request->path() === 'api/app/login') {
86-
$user = $this->companyService->findByEmail($request->input('email'));
87-
$companyId = $user->getCompanyId();
86+
$databaseProxy = $this->databaseProxyManager->findByEmail($request->input('email'));
87+
$companyId = $databaseProxy->getCompanyId();
8888
} elseif ($this->isAgentApp($request->path()) && Str::contains($request->path(), 'login')) { // agent app login
89-
$user = $this->companyService->findByEmail($request->input('email'));
90-
$companyId = $user->getCompanyId();
89+
$databaseProxy = $this->databaseProxyManager->findByEmail($request->input('email'));
90+
$companyId = $databaseProxy->getCompanyId();
9191
} elseif ($this->isAgentApp($request->path())) { // agent app authenticated user requests
9292
$companyId = auth('agent_api')->payload()->get('companyId');
9393
if (!is_numeric($companyId)) {
@@ -102,7 +102,7 @@ private function handleApiRequest(Request $request, \Closure $next) {
102102
}
103103
}
104104

105-
return $this->companyService->runForCompany($companyId, function () use ($next, $request) {
105+
return $this->databaseProxyManager->runForCompany($companyId, function () use ($next, $request) {
106106
return $next($request);
107107
});
108108
}

Diff for: src/backend/app/Http/Requests/CompanyRegistrationRequest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public function rules(): array {
1515
'name' => 'required',
1616
'address' => 'required',
1717
'phone' => 'required',
18-
'email' => 'required|unique:users',
18+
'email' => 'required|unique:database_proxies',
1919
'protected_page_password' => 'required',
2020
];
2121
}

Diff for: src/backend/app/Jobs/AbstractJob.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
namespace App\Jobs;
44

55
use App\Models\CompanyJob;
6-
use App\Services\CompanyService;
76
use App\Services\UserService;
87
use Illuminate\Bus\Queueable;
98
use Illuminate\Contracts\Queue\ShouldQueue;
109
use Illuminate\Foundation\Bus\Dispatchable;
1110
use Illuminate\Queue\InteractsWithQueue;
1211
use Illuminate\Queue\SerializesModels;
12+
use MPM\DatabaseProxy\DatabaseProxyManagerService;
1313

1414
abstract class AbstractJob implements ShouldQueue {
1515
use Dispatchable;
@@ -40,8 +40,8 @@ public function __construct($jobName) {
4040

4141
public function handle() {
4242
$this->setJobUuid($this->job->uuid());
43-
$companyService = app()->make(CompanyService::class);
44-
$companyService->runForCompany($this->companyId, function () {
43+
$databaseProxyManager = app()->make(DatabaseProxyManagerService::class);
44+
$databaseProxyManager->runForCompany($this->companyId, function () {
4545
$this->executeJob();
4646
});
4747

Diff for: src/backend/app/Models/Company.php

+4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ public function database(): HasOne {
2626
return $this->hasOne(CompanyDatabase::class);
2727
}
2828

29+
public function databaseProxies(): HasMany {
30+
return $this->hasMany(DatabaseProxy::class);
31+
}
32+
2933
public function getId(): int {
3034
return $this->id;
3135
}

Diff for: src/backend/app/Models/CompanyDatabase.php

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use App\Models\Base\BaseModelCentral;
66
use Illuminate\Database\Eloquent\Factories\HasFactory;
77
use Illuminate\Database\Eloquent\Relations\BelongsTo;
8+
use Illuminate\Database\Eloquent\Relations\HasMany;
89

910
/**
1011
* @property int $id;
@@ -22,6 +23,10 @@ public function company(): BelongsTo {
2223
return $this->belongsTo(Company::class);
2324
}
2425

26+
public function databaseProxies(): HasMany {
27+
return $this->hasMany(DatabaseProxy::class);
28+
}
29+
2530
public function findByCompanyId(int $companyId): CompanyDatabase {
2631
/** @var CompanyDatabase $result */
2732
$result = $this->newQuery()

0 commit comments

Comments
 (0)