feat: Add DNS management resources and importer

- Implemented DomainCollection, DomainDetailResource, DomainNSCollection, DomainNSResource, and DomainResource for handling DNS domain and record data.
- Created VpsServiceCollection and VpsServiceResource for VPS service management.
- Added DnsManagerNS and DnsManagerUser models to represent DNS records and user associations.
- Developed AdminZoneDnsSqlImporter for importing DNS data from SQL dumps, including customer and DNS domain records.
- Added migration scripts to update the customers table with new fields and sync foreign key references for DNS tables.
- Created a migration preview document outlining the mapping and schema changes for the admin zone DNS import.
This commit is contained in:
baodev0
2026-05-26 13:54:33 +07:00
parent 520f21cb11
commit fccb0c353a
30 changed files with 4030 additions and 105 deletions
@@ -7,6 +7,16 @@ use App\Repositories\BaseRepository;
class CustomerRepository extends BaseRepository implements CustomerRepositoryInterface
{
private const STATUS_MAP = [
'active' => 1,
'inactive' => 2,
'de_active' => 2,
'pending' => 0,
'closed' => 2,
'suspended' => 3,
'banned' => 3,
];
public function getModel()
{
return Customer::class;
@@ -19,6 +29,16 @@ class CustomerRepository extends BaseRepository implements CustomerRepositoryInt
bool $returnQuery = false
) {
$model = $this->model->with($relationships)->select($select);
if (isset($data['filter']) && ! empty($data['filter'])) {
$model = $model->where(function ($query) use ($data) {
$filter = trim($data['filter']);
$query->where('fullname', 'LIKE', "%{$filter}%")
->orWhere('username', 'LIKE', "%{$filter}%")
->orWhere('company', 'LIKE', "%{$filter}%")
->orWhere('email', 'LIKE', "%{$filter}%")
->orWhere('phone', 'LIKE', "%{$filter}%");
});
}
if (isset($data['name']) && ! empty($data['name'])) {
$model = $model->where(function ($query) use ($data) {
$name = trim($data['name']);
@@ -33,11 +53,14 @@ class CustomerRepository extends BaseRepository implements CustomerRepositoryInt
$model = $model->where("phone", "LIKE", "%" . $data['phone'] . "%");
}
if (isset($data['status']) && ! empty($data['status']) && $data['status'] != 'full') {
$model = $model->where("status", match ($data['status']) {
'active' => 1,
'de_active' => 0,
'closed' => 2,
});
$status = (string) $data['status'];
$statusValue = is_numeric($status)
? (int) $status
: (self::STATUS_MAP[$status] ?? null);
if ($statusValue !== null) {
$model = $model->where('status', $statusValue);
}
}
if (isset($data['relations'])) {
foreach ($data['relations'] as $key => $value) {