22
33namespace App \Services ;
44use App \Repositories \DomainRepository ;
5- use App \Models \Store ;
5+ use App \Models \Domain ;
66use App \Models \Zone ;
77
88class DomainService extends BaseService {
@@ -14,79 +14,89 @@ public function __construct(
1414 protected VercelService $ vercelService ,
1515 ) { parent ::__construct ($ domainRepository ); }
1616
17- public function resolveDomains ( array $ data = [] ) {
17+ public function resolve ( array $ data = [] ) {
1818
1919 return collect ([
20- ['dest ' => 'client ' , 'name ' => $ client = data_get ($ data , 'client_domain_name ' , 'www ' )],
21- ['dest ' => 'admin ' , 'name ' => data_get ($ data , 'admin_domain_name ' , $ client === 'www ' ? 'admin ' : null )],
22- ['dest ' => 'vendor ' , 'name ' => data_get ($ data , 'vendor_domain_name ' )],
23- ['dest ' => 'delivery ' , 'name ' => data_get ($ data , 'delivery_domain_name ' )],
24- ['dest ' => 'blog ' , 'name ' => data_get ($ data , 'blog_domain_name ' )],
25- ['dest ' => 'app ' , 'name ' => data_get ($ data , 'app_domain_name ' )],
26- ['dest ' => 'api ' , 'name ' => data_get ($ data , 'api_domain_name ' )],
27- ['dest ' => 'cdn ' , 'name ' => data_get ($ data , 'cdn_domain_name ' )],
20+ ['dest ' => 'client ' , 'name ' => $ client = data_get ($ data , 'client_domain_name ' , 'www ' )],
21+ ['dest ' => 'admin ' , 'name ' => data_get ($ data , 'admin_domain_name ' , $ client === 'www ' ? 'admin ' : null )],
22+ ['dest ' => 'vendor ' , 'name ' => data_get ($ data , 'vendor_domain_name ' )],
23+ ['dest ' => 'delivery ' , 'name ' => data_get ($ data , 'delivery_domain_name ' )],
24+ ['dest ' => 'affiliate ' , 'name ' => data_get ($ data , 'affiliate_domain_name ' )],
25+ ['dest ' => 'blog ' , 'name ' => data_get ($ data , 'blog_domain_name ' )],
26+ ['dest ' => 'app ' , 'name ' => data_get ($ data , 'app_domain_name ' )],
27+ ['dest ' => 'api ' , 'name ' => data_get ($ data , 'api_domain_name ' )],
28+ ['dest ' => 'cdn ' , 'name ' => data_get ($ data , 'cdn_domain_name ' )],
2829 ])->filter (fn ($ item ) => $ item ['name ' ])->all ();
2930
3031 }
31- public function validate ( Store $ store , Zone $ zone , string $ name ) {
32+ public function sync ( Domain $ domain ) {
3233
33- $ name = trim ( explode ( ' . ' , $ name)[ 0 ]);
34+ $ this -> domainRepository -> query ()-> where ( ' dest ' , $ domain -> dest )-> where ( ' name ' , ' != ' , $ domain -> name )-> get ()-> each ( function ( $ item ) {
3435
35- $ record = $ this ->domainRepository ->findByName ("{$ name }. {$ zone ->name }" );
36- if ( $ record ) return $ record ->store_id === $ store ->id ? $ name : null ;
36+ $ this ->vercelService ->setProject ($ item ->dest )->deleteDomain ($ item ->name );
37+ $ this ->cloudflareService ->deleteSubDomain ($ item ->provider_id ?? $ item ->name );
38+ $ this ->delete ($ item ->id );
3739
38- $ isValid = $ this ->cloudflareService ->setZone ($ zone ->provider_id )->subDomainAvailable ($ name );
39- return $ isValid ? $ name : null ;
40+ });
41+
42+ $ this ->deleteCache ();
4043
4144 }
42- public function attach ( Store $ store , Zone $ zone , string $ name, string $ dest ) {
45+ public function validate ( Zone $ zone , string $ name ) {
4346
44- if ( !$ name = $ this ->validate ($ store , $ zone , $ name ) ) return [null , null ];
47+ $ name = explode ('. ' , strtolower (trim ($ name )))[0 ];
48+ $ full = "{$ name }. {$ zone ->name }" ;
4549
46- $ domain = $ this ->cloudflareService ->setZone ($ zone ->provider_id )->addSubDomain ($ name );
47- if ( !$ domain ) $ domain = $ this ->cloudflareService ->setZone ($ zone ->provider_id )->getDomain ($ name );
50+ if ( $ domain = $ this ->domainRepository ->findByName ($ full ) ) return $ domain ;
51+ if ( $ this ->withoutTenant (fn () => $ this ->domainRepository ->findByName ($ full )) ) return null ;
52+
53+ return $ this ->cloudflareService ->validateSubDomain ($ name );
4854
55+ }
56+ public function attach ( Zone $ zone , string $ name , string $ dest ) {
57+
58+ $ cloudflare = $ this ->cloudflareService ->setZone ($ zone ->provider_id );
59+ $ domain = $ zone ->store_id === store_id () ? $ cloudflare ->syncSubDomain ($ name ) : $ cloudflare ->addSubDomain ($ name );
60+
4961 [$ id , $ name ] = [data_get ($ domain , 'id ' ), data_get ($ domain , 'name ' )];
50-
51- $ this -> vercelService -> setProject ( $ dest )-> addDomain ( $ name );
62+ if ( $ name ) $ this -> vercelService -> setProject ( $ dest )-> addDomain ( $ name );
63+
5264 return [$ id , $ name ];
5365
5466 }
55- public function register ( Store $ store , Zone $ zone , string $ name , string $ dest ) {
67+ public function register ( Zone $ zone , string $ name , string $ dest ) {
5668
57- [ $ id , $ name] = $ this ->attach ( $ store , $ zone , $ name, $ dest );
58- if ( !$ id || ! $ name ) return ;
69+ $ name = $ this ->validate ( $ zone , $ name );
70+ if ( !$ name || $ name instanceof Domain ) return $ name ;
5971
60- return $ this ->domainRepository ->updateOrCreate (
61- ['zone_id ' => $ zone ->id , 'name ' => $ name ],
62- ['store_id ' => $ store ->id , 'provider_id ' => $ id , 'dest ' => $ dest ]
72+ [$ id , $ name ] = $ this ->attach ($ zone , $ name , $ dest );
73+ if ( !$ id || !$ name ) return null ;
74+
75+ $ domain = $ this ->domainRepository ->updateOrCreate (
76+ ['name ' => $ name , 'dest ' => $ dest ],
77+ ['zone_id ' => $ zone ->id , 'provider_id ' => $ id ]
6378 );
79+
80+ $ this ->runJob ([static ::class, 'sync ' ], [$ domain ]);
81+ return $ domain ;
6482
6583 }
66- public function check ( Store $ store , array $ data = [] ) {
84+ public function check ( string $ domain = null , array $ data = [] ) {
6785
68- $ domain = string ( data_get ( $ data , ' domain_name ' ) );
69- if ( $ domain ) return $ this ->zoneService ->check ( $ store , $ domain ) ;
86+ if ( $ domain && store ()?->zone?->name !== $ domain ) return ( bool ) $ this -> zoneService -> validate ( $ domain );
87+ if ( ! $ zone = $ this ->zoneService ->currentZone () ) return false ;
7088
71- $ zone = $ this ->zoneService ->parentZone ($ store );
72- if ( !$ zone ) return false ;
73-
74- return collect ($ this ->resolveDomains ($ data ))->every (fn ($ item ) =>
75- $ this ->validate ($ store , $ zone , $ item ['name ' ])
76- );
89+ return collect ($ this ->resolve ($ data ))->every (fn ($ item ) => $ this ->validate ($ zone , $ item ['name ' ]));
7790
7891 }
79- public function apply ( Store $ store , array $ data = [] ) {
92+ public function apply ( array $ data = [] ) {
8093
81- if ( !$ this ->check ($ store , $ data ) ) return ;
82- if ( !$ zone = $ this ->zoneService ->apply ($ store , string (data_get ($ data , 'domain_name ' ))) ) return ;
83-
84- return collect ($ this ->resolveDomains ($ data ))->map (function ($ item ) use ($ store , $ zone ) {
94+ $ domain = string (data_get ($ data , 'domain_name ' ));
8595
86- [ $ name , $ dest ] = [ string ( data_get ( $ item , ' name ' )), string ( data_get ( $ item , ' dest ' ))] ;
87- if ( $ name && $ dest ) return $ this ->register ( $ store , $ zone , $ name , $ dest ) ;
96+ if ( ! $ this -> check ( $ domain , $ data ) ) return false ;
97+ if ( ! $ zone = $ this ->zoneService -> apply ( $ domain ) ) return false ;
8898
89- })-> filter ()-> all ( );
99+ return collect ( $ this -> resolve ( $ data ))-> every ( fn ( $ item ) => $ this -> register ( $ zone , $ item [ ' name ' ], $ item [ ' dest ' ]) );
90100
91101 }
92102
0 commit comments