2021-06-17 14:08:30 +00:00
< ? php
namespace App\Http\Controllers ;
2021-08-25 12:13:49 +00:00
use Carbon\Carbon ;
2022-01-04 13:34:33 +00:00
use Illuminate\Support\Collection ;
2021-06-17 14:08:30 +00:00
use Illuminate\Http\Request ;
2021-08-08 07:27:22 +00:00
use Illuminate\Support\Arr ;
2021-11-11 11:57:13 +00:00
use Illuminate\Support\Facades\Auth ;
2022-03-14 11:28:54 +00:00
use Illuminate\Support\Facades\DB ;
use Illuminate\Support\Facades\Notification ;
2021-11-11 11:57:13 +00:00
use Illuminate\Support\ViewErrorBag ;
2021-06-17 14:08:30 +00:00
2022-01-01 14:52:21 +00:00
use App\Http\Requests\SystemRegister ;
2022-11-01 11:24:36 +00:00
use App\Models\ { Address , Echoarea , Filearea , Setup , System , SystemZone , Zone };
2022-03-14 11:28:54 +00:00
use App\Notifications\AddressLink ;
2021-07-01 14:25:41 +00:00
use App\Rules\ { FidoInteger , TwoByteInteger };
2021-06-17 14:08:30 +00:00
class SystemController extends Controller
{
2021-06-20 13:03:20 +00:00
/**
* Add an address to a system
*
* @ param Request $request
* @ param System $o
* @ return \Illuminate\Http\RedirectResponse
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
public function add_address ( Request $request , System $o )
{
2022-03-01 11:07:08 +00:00
// @todo a point address is failing validation
2021-07-04 11:47:23 +00:00
// @todo This should be admin of the zone
2021-06-20 13:03:20 +00:00
$this -> authorize ( 'admin' , $o );
2021-08-25 12:13:49 +00:00
session () -> flash ( 'accordion' , 'address' );
2021-06-20 13:03:20 +00:00
$request -> validate ([
'action' => 'required|in:region,host,node' ,
'zone_id' => 'required|exists:zones,id' ,
]);
switch ( $request -> post ( 'action' )) {
case 'region' :
$request -> validate ([
'region_id_new' => [
'required' ,
new TwoByteInteger ,
function ( $attribute , $value , $fail ) {
// Check that the region doesnt already exist
$o = Address :: where ( function ( $query ) use ( $value ) {
return $query -> where ( 'region_id' , $value )
2021-06-25 06:42:12 +00:00
-> where ( 'host_id' , 0 )
2021-06-20 13:03:20 +00:00
-> where ( 'node_id' , 0 )
-> where ( 'point_id' , 0 )
2022-01-24 11:56:13 +00:00
-> where ( 'role' , Address :: NODE_RC );
2021-06-20 13:03:20 +00:00
})
// Check that a host doesnt already exist
-> orWhere ( function ( $query ) use ( $value ) {
return $query -> where ( 'host_id' , $value )
-> where ( 'point_id' , 0 )
2022-01-24 11:56:13 +00:00
-> where ( 'role' , Address :: NODE_NC );
2021-06-20 13:03:20 +00:00
});
if ( $o -> count ()) {
$fail ( 'Region or host already exists' );
}
},
],
]);
$oo = new Address ;
$oo -> zone_id = $request -> post ( 'zone_id' );
$oo -> region_id = $request -> post ( 'region_id_new' );
2021-10-07 12:32:05 +00:00
$oo -> host_id = 0 ;
2021-06-20 13:03:20 +00:00
$oo -> node_id = 0 ;
$oo -> point_id = 0 ;
2022-01-24 11:56:13 +00:00
$oo -> role = Address :: NODE_RC ;
2021-06-20 13:03:20 +00:00
$oo -> active = TRUE ;
$o -> addresses () -> save ( $oo );
break ;
case 'host' :
$request -> validate ([
2021-07-01 14:25:41 +00:00
'region_id' => [ 'required' , new FidoInteger ],
2021-06-20 13:03:20 +00:00
'host_id_new' => [
'required' ,
new TwoByteInteger ,
2021-07-05 13:17:00 +00:00
function ( $attribute , $value , $fail ) use ( $request ) {
2021-06-20 13:03:20 +00:00
// Check that the region doesnt already exist
$o = Address :: where ( function ( $query ) use ( $value ) {
2021-07-18 13:38:18 +00:00
return $query -> where ( function ( $query ) use ( $value ) {
return $query -> where ( 'region_id' , $value )
2022-01-24 11:56:13 +00:00
-> where ( 'role' , Address :: NODE_RC );
2021-07-18 13:38:18 +00:00
})
// Check that a host doesnt already exist
-> orWhere ( function ( $query ) use ( $value ) {
return $query -> where ( 'host_id' , $value )
2022-01-24 11:56:13 +00:00
-> where ( 'role' , Address :: NODE_NC );
2021-07-18 13:38:18 +00:00
});
2021-07-05 13:17:00 +00:00
})
-> where ( 'zone_id' , $request -> post ( 'zone_id' ))
-> where ( 'point_id' , 0 )
-> where ( 'active' , TRUE );
2021-06-20 13:03:20 +00:00
if ( $o -> count ()) {
$fail ( 'Region or host already exists' );
}
},
],
'node_id_new' => [
'required' ,
new TwoByteInteger ,
function ( $attribute , $value , $fail ) use ( $request ) {
// Check that the region doesnt already exist
$o = Address :: where ( function ( $query ) use ( $request , $value ) {
return $query
-> where ( 'host_id' , $request -> post ( 'host_id_new' ))
-> where ( 'node_id' , $value )
-> where ( 'point_id' , 0 )
2022-01-24 11:56:13 +00:00
-> where ( 'role' , Address :: NODE_RC );
2021-06-20 13:03:20 +00:00
});
if ( $o -> count ()) {
$fail ( 'Host already exists' );
}
},
]
]);
2021-07-26 11:21:58 +00:00
// Find the Hub address
// Find the zones <HOST>/0 address, and assign it to this host.
$oo = Address :: where ( 'zone_id' , $request -> zone_id )
-> where ( 'region_id' , $request -> region_id )
-> where ( 'host_id' , $request -> host_id_new )
-> where ( 'node_id' , 0 )
-> where ( 'point_id' , 0 )
-> single ();
// Its not defined, so we'll create it.
if ( ! $oo ) {
$oo = new Address ;
$oo -> forceFill ([
'zone_id' => $request -> zone_id ,
'region_id' => $request -> region_id ,
'host_id' => $request -> host_id_new ,
'node_id' => 0 ,
'point_id' => 0 ,
2022-01-24 11:56:13 +00:00
'role' => Address :: NODE_NC ,
2021-07-26 11:21:58 +00:00
]);
}
$oo -> system_id = $request -> system_id ;
$oo -> active = TRUE ;
$o -> addresses () -> save ( $oo );
2021-06-20 13:03:20 +00:00
$oo = new Address ;
$oo -> zone_id = $request -> post ( 'zone_id' );
2021-06-25 13:38:57 +00:00
$oo -> region_id = $request -> post ( 'region_id' );
2021-06-20 13:03:20 +00:00
$oo -> host_id = $request -> post ( 'host_id_new' );
$oo -> node_id = $request -> post ( 'node_id_new' );
$oo -> point_id = 0 ;
2022-03-01 11:07:08 +00:00
$oo -> role = Address :: NODE_ACTIVE ;
2021-06-20 13:03:20 +00:00
$oo -> active = TRUE ;
$o -> addresses () -> save ( $oo );
break ;
case 'node' :
$request -> validate ([
2021-07-01 14:25:41 +00:00
'region_id' => [ 'required' , new FidoInteger ],
'host_id' => [ 'required' , new FidoInteger ],
2021-06-20 13:03:20 +00:00
'node_id' => [
'required' ,
new TwoByteInteger ,
function ( $attribute , $value , $fail ) use ( $request ) {
2023-04-15 10:24:53 +00:00
if ( $request -> point_id === 0 ) {
// Check that the host doesnt already exist
$o = Address :: where ( function ( $query ) use ( $request , $value ) {
return $query
-> where ( 'zone_id' , $request -> post ( 'zone_id' ))
-> where ( 'host_id' , $request -> post ( 'host_id' ))
-> where ( 'node_id' , $value )
-> where ( 'point_id' , 0 );
});
if ( $o -> count ()) {
$fail ( sprintf ( 'Host already exists: %s' , $o -> get () -> pluck ( 'ftn' ) -> join ( ',' )));
}
}
},
],
'point_id' => [
'required' ,
function ( $attribute , $value , $fail ) use ( $request ) {
if ( ! is_numeric ( $value ) || $value > DomainController :: NUMBER_MAX )
$fail ( sprintf ( 'Point numbers must be between 0 and %d' , DomainController :: NUMBER_MAX ));
// Check that the host doesnt already exist
2021-06-20 13:03:20 +00:00
$o = Address :: where ( function ( $query ) use ( $request , $value ) {
return $query
2021-07-26 11:53:56 +00:00
-> where ( 'zone_id' , $request -> post ( 'zone_id' ))
2021-06-25 06:42:12 +00:00
-> where ( 'host_id' , $request -> post ( 'host_id' ))
2023-04-15 10:24:53 +00:00
-> where ( 'node_id' , $request -> post ( 'node_id' ))
-> where ( 'point_id' , $value );
2021-06-20 13:03:20 +00:00
});
if ( $o -> count ()) {
2023-04-15 10:24:53 +00:00
$fail ( sprintf ( 'Point already exists: %s' , $o -> get () -> pluck ( 'ftn' ) -> join ( ',' )));
2021-06-20 13:03:20 +00:00
}
2023-04-15 10:24:53 +00:00
}
2021-06-20 13:03:20 +00:00
],
'hub' => 'required|boolean' ,
2021-06-25 06:42:12 +00:00
'hub_id' => 'nullable|exists:addresses,id' ,
2021-06-20 13:03:20 +00:00
]);
$oo = new Address ;
$oo -> zone_id = $request -> post ( 'zone_id' );
2021-06-25 13:38:57 +00:00
$oo -> region_id = $request -> post ( 'region_id' );
2021-06-20 13:03:20 +00:00
$oo -> host_id = $request -> post ( 'host_id' );
$oo -> node_id = $request -> post ( 'node_id' );
$oo -> point_id = $request -> post ( 'point_id' );
2021-06-25 13:38:57 +00:00
$oo -> hub_id = $request -> post ( 'hub_id' ) > 0 ? $request -> post ( 'hub_id' ) : NULL ;
2023-04-15 10:24:53 +00:00
$oo -> role = (( ! $oo -> point_id ) && $request -> post ( 'hub' )) ? Address :: NODE_HC : ( $request -> post ( 'point_id' ) ? Address :: NODE_POINT : Address :: NODE_ACTIVE );
2021-06-20 13:03:20 +00:00
$oo -> active = TRUE ;
$o -> addresses () -> save ( $oo );
break ;
default :
return redirect () -> back () -> withErrors ([ 'action' => 'Unknown action: ' . $request -> post ( 'action' )]);
}
return redirect () -> to ( sprintf ( 'ftn/system/addedit/%d' , $o -> id ));
}
2021-07-04 11:47:23 +00:00
/**
* Add Session details
*
* @ param Request $request
* @ param System $o
* @ return \Illuminate\Http\RedirectResponse
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
public function add_session ( Request $request , System $o )
{
// @todo This should be admin of the zone
$this -> authorize ( 'admin' , $o );
2021-08-25 12:13:49 +00:00
session () -> flash ( 'accordion' , 'session' );
2021-07-04 11:47:23 +00:00
$validate = $request -> validate ([
'zone_id' => 'required|exists:zones,id' ,
'sespass' => 'required|string|min:4' ,
2021-07-26 11:21:58 +00:00
'pktpass' => 'nullable|string|min:4|max:8' ,
'ticpass' => 'nullable|string|min:4' ,
2021-07-04 11:47:23 +00:00
'fixpass' => 'required|string|min:4' ,
]);
$zo = Zone :: findOrFail ( $validate [ 'zone_id' ]);
2021-08-13 12:53:59 +00:00
// If this session is for the ZC, it now becomes the default.
2022-01-24 11:56:13 +00:00
if ( $o -> match ( $zo , Address :: NODE_ZC ) -> count ()) {
2021-08-13 12:53:59 +00:00
SystemZone :: where ( 'default' , TRUE ) -> update ([ 'default' => FALSE ]);
$validate [ 'default' ] = TRUE ;
}
2021-07-04 11:47:23 +00:00
$o -> sessions () -> attach ( $zo , $validate );
return redirect () -> to ( sprintf ( 'ftn/system/addedit/%d' , $o -> id ));
}
2021-06-17 14:08:30 +00:00
/**
* Add or edit a node
*/
2022-01-01 14:52:21 +00:00
public function add_edit ( SystemRegister $request , System $o )
2021-06-17 14:08:30 +00:00
{
2022-03-14 11:28:54 +00:00
$this -> authorize ( 'update' , $o );
2021-06-17 14:08:30 +00:00
if ( $request -> post ()) {
2022-01-15 11:38:45 +00:00
foreach ([ 'name' , 'location' , 'sysop' , 'hold' , 'phone' , 'address' , 'port' , 'active' , 'method' , 'notes' , 'mailer_type' , 'mailer_address' , 'mailer_port' , 'zt_id' ] as $key )
2021-06-17 14:08:30 +00:00
$o -> { $key } = $request -> post ( $key );
$o -> save ();
return redirect () -> action ([ self :: class , 'home' ]);
}
2022-11-01 05:39:58 +00:00
$o -> load ([ 'addresses.zone.domain' , 'addresses.system' , 'sessions.domain' , 'sessions.systems' ]);
2021-07-26 11:21:58 +00:00
2022-03-14 11:28:54 +00:00
return view ( 'system.addedit' )
2022-01-01 14:52:21 +00:00
-> with ( 'action' , $o -> exists ? 'update' : 'create' )
2022-03-14 11:28:54 +00:00
-> with ( 'o' , $o );
2021-06-17 14:08:30 +00:00
}
2022-01-04 13:34:33 +00:00
public function api_address ( Request $request , System $o ) : Collection
{
return Address :: select ([ 'addresses.id' , 'addresses.zone_id' , 'region_id' , 'host_id' , 'node_id' ])
-> leftjoin ( 'zones' ,[ 'zones.id' => 'addresses.zone_id' ])
-> where ( 'addresses.system_id' , $o -> id )
-> where ( 'zones.domain_id' , $request -> domain_id )
2022-11-20 00:47:46 +00:00
-> withTrashed ()
2022-01-04 13:34:33 +00:00
-> FTNorder ()
-> get ()
2022-02-03 06:35:52 +00:00
-> map ( function ( $item ) { return [ 'id' => ( string ) $item -> id , 'value' => $item -> ftn3d ]; });
2022-01-04 13:34:33 +00:00
}
2021-11-11 11:57:13 +00:00
/**
* Systems with no owners
*/
public function api_orphan ( Request $request ) : Collection
{
return System :: select ([ 'id' , 'name' ])
-> leftjoin ( 'system_user' ,[ 'system_user.system_id' => 'systems.id' ])
-> whereNull ( 'user_id' )
-> where ( 'systems.name' , 'ilike' , '%' . $request -> term . '%' )
-> orderBy ( 'name' )
-> get ();
}
2022-03-14 11:28:54 +00:00
/**
* Identify all the addresses from systems that are not owned by a user
*
* @ param Request $request
* @ return Collection
*/
public function api_orphan_address ( Request $request ) : Collection
{
$result = collect ();
list ( $zone_id , $host_id , $node_id , $point_id , $domain ) = sscanf ( $request -> query ( 'term' ), '%d:%d/%d.%d@%s' );
# Look for Systems
foreach ( Address :: select ([ 'addresses.id' , 'systems.name' , DB :: raw ( 'systems.id AS system_id' ), 'zones.zone_id' , 'region_id' , 'host_id' , 'node_id' , 'point_id' , 'addresses.zone_id' ])
-> join ( 'zones' ,[ 'zones.id' => 'addresses.zone_id' ])
-> rightjoin ( 'systems' ,[ 'systems.id' => 'addresses.system_id' ])
-> when ( $zone_id || $host_id || $node_id , function ( $query ) use ( $zone_id , $host_id , $node_id ) {
return $query
-> when ( $zone_id , function ( $q , $zone_id ) { return $q -> where ( 'zones.zone_id' , $zone_id ); })
-> where ( function ( $q ) use ( $host_id ) {
return $q
-> when ( $host_id , function ( $q , $host_id ) { return $q -> where ( 'region_id' , $host_id ); })
-> when ( $host_id , function ( $q , $host_id ) { return $q -> orWhere ( 'host_id' , $host_id ); });
})
-> when ( $node_id , function ( $q , $node_id ) { return $q -> where ( 'node_id' , $node_id ); });
})
-> orWhere ( 'systems.name' , 'ilike' , '%' . $request -> query ( 'term' ) . '%' )
-> orderBy ( 'systems.name' )
-> get () as $o )
{
$result -> push ([ 'id' => $o -> id , 'name' => sprintf ( '%s (%s)' , $o -> ftn3d , $o -> name ), 'category' => 'Systems' ]);
}
return $result ;
}
2021-07-01 14:25:41 +00:00
/**
* Delete address assigned to a host
*
* @ param Address $o
* @ return \Illuminate\Http\RedirectResponse
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
public function del_address ( Address $o )
{
2021-07-04 11:47:23 +00:00
// @todo This should be admin of the zone
2021-07-01 14:25:41 +00:00
$this -> authorize ( 'admin' , $o );
2021-08-25 12:13:49 +00:00
session () -> flash ( 'accordion' , 'address' );
2021-07-01 14:25:41 +00:00
$sid = $o -> system_id ;
2021-07-02 13:19:50 +00:00
$o -> active = FALSE ;
$o -> save ();
2021-07-01 14:25:41 +00:00
$o -> delete ();
return redirect () -> to ( sprintf ( 'ftn/system/addedit/%d' , $sid ));
}
2021-07-04 11:47:23 +00:00
/**
* Delete address assigned to a host
*
* @ param Address $o
* @ return \Illuminate\Http\RedirectResponse
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
public function del_session ( System $o , Zone $zo )
{
$this -> authorize ( 'admin' , $zo );
2021-08-25 12:13:49 +00:00
session () -> flash ( 'accordion' , 'session' );
2021-07-04 11:47:23 +00:00
$o -> sessions () -> detach ( $zo );
return redirect () -> to ( sprintf ( 'ftn/system/addedit/%d' , $o -> id ));
}
2021-08-25 12:13:49 +00:00
/**
* Update the systems echoareas
*
* @ param Request $request
* @ param System $o
2021-09-06 13:39:32 +00:00
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\Contracts\View\View | \Illuminate\Http\RedirectResponse
2021-08-25 12:13:49 +00:00
*/
public function echoareas ( Request $request , System $o )
{
2022-01-04 13:34:33 +00:00
$ao = $o -> addresses -> firstWhere ( 'id' , $request -> address_id );
2021-08-25 12:13:49 +00:00
if (( $request -> method () == 'POST' ) && $request -> post ()) {
session () -> flash ( 'accordion' , 'echoarea' );
2022-11-20 00:47:46 +00:00
if ( $ao -> trashed () && collect ( $request -> get ( 'id' )) -> diff ( $ao -> echoareas -> pluck ( 'id' )) -> count ())
return redirect () -> back () -> withErrors ( sprintf ( 'Address [%s] has been deleted, cannot add additional echos' , $ao -> ftn3d ));
2021-08-25 12:13:49 +00:00
// Ensure we have session details for this address.
if ( ! $ao -> session ( 'sespass' ))
return redirect () -> back () -> withErrors ( 'System doesnt belong to this network' );
2022-01-04 13:34:33 +00:00
$ao -> echoareas () -> syncWithPivotValues ( $request -> get ( 'id' ,[]),[ 'subscribed' => Carbon :: now ()]);
2021-08-25 12:13:49 +00:00
return redirect () -> back () -> with ( 'success' , 'Echoareas updated' );;
}
$eo = Echoarea :: active ()
2022-01-04 13:34:33 +00:00
-> where ( 'domain_id' , $ao -> zone -> domain_id )
2021-08-25 12:13:49 +00:00
-> orderBy ( 'name' )
-> get ();
return view ( 'system.widget.echoarea' )
-> with ( 'o' , $o )
-> with ( 'ao' , $ao )
-> with ( 'echoareas' , $eo );
}
2022-11-01 11:24:36 +00:00
/**
* Update the systems fileareas
*
* @ param Request $request
* @ param System $o
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\Contracts\View\View | \Illuminate\Http\RedirectResponse
*/
public function fileareas ( Request $request , System $o )
{
$ao = $o -> addresses -> firstWhere ( 'id' , $request -> address_id );
if (( $request -> method () == 'POST' ) && $request -> post ()) {
session () -> flash ( 'accordion' , 'filearea' );
// Ensure we have session details for this address.
if ( ! $ao -> session ( 'sespass' ))
return redirect () -> back () -> withErrors ( 'System doesnt belong to this network' );
$ao -> fileareas () -> syncWithPivotValues ( $request -> get ( 'id' ,[]),[ 'subscribed' => Carbon :: now ()]);
return redirect () -> back () -> with ( 'success' , 'Fileareas updated' );;
}
$fo = Filearea :: active ()
-> where ( 'domain_id' , $ao -> zone -> domain_id )
-> orderBy ( 'name' )
-> get ();
return view ( 'system.widget.filearea' )
-> with ( 'o' , $o )
-> with ( 'ao' , $ao )
-> with ( 'fileareas' , $fo );
}
2021-11-11 11:57:13 +00:00
public function home ()
{
return view ( 'system.home' );
}
2021-08-08 07:27:22 +00:00
/**
* Move address to another system
*
* @ param Request $request
* @ param System $so
* @ param Address $o
2021-08-13 12:53:59 +00:00
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\Contracts\View\View | \Illuminate\Http\RedirectResponse
2021-08-08 07:27:22 +00:00
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
public function mov_address ( Request $request , System $so , Address $o )
{
2021-08-25 12:13:49 +00:00
session () -> flash ( 'accordion' , 'address' );
2021-08-08 07:27:22 +00:00
// Quick check that this address belongs to this system
if ( $so -> addresses -> search ( function ( $item ) use ( $o ) { return $item -> id == $o -> id ; }) === FALSE )
abort ( 404 );
if ( $request -> post ()) {
$this -> authorize ( 'admin' , $o );
$validated = $request -> validate ([
'system_id' => 'required|exists:systems,id' ,
'remove' => 'nullable|boolean' ,
'remsess' => 'nullable|boolean|exclude_if:remove,1' ,
]);
$o -> system_id = $validated [ 'system_id' ];
$o -> save ();
if ( Arr :: get ( $validated , 'remove' )) {
$so -> sessions () -> detach ( $o -> zone );
$so -> delete ();
} elseif ( Arr :: get ( $validated , 'remsess' )) {
$so -> sessions () -> detach ( $o -> zone );
}
return redirect () -> to ( 'ftn/system/addedit/' . $validated [ 'system_id' ]);
}
return view ( 'system.moveaddr' )
-> with ( 'o' , $o );
}
2021-07-04 11:47:23 +00:00
public function ours ()
{
return view ( 'system.ours' );
}
2021-07-01 14:25:41 +00:00
/**
* Suspend address assigned to a host
*
* @ param Address $o
* @ return \Illuminate\Http\RedirectResponse
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
public function sus_address ( Address $o )
{
2021-07-04 11:47:23 +00:00
// @todo This should be admin of the zone
2021-07-01 14:25:41 +00:00
$this -> authorize ( 'admin' , $o );
2021-08-25 12:13:49 +00:00
session () -> flash ( 'accordion' , 'address' );
2021-07-01 14:25:41 +00:00
$o -> active = ( ! $o -> active );
$o -> save ();
return redirect () -> to ( sprintf ( 'ftn/system/addedit/%d' , $o -> system_id ));
}
2022-11-19 01:02:13 +00:00
/**
* Recover a deleted address
*
* @ param int $id
* @ return \Illuminate\Http\RedirectResponse
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
public function rec_address ( int $id )
{
$o = Address :: onlyTrashed () -> findOrFail ( $id );
// @todo This should be admin of the zone
$this -> authorize ( 'admin' , $o );
session () -> flash ( 'accordion' , 'address' );
$o -> restore ();
return redirect () -> to ( sprintf ( 'ftn/system/addedit/%d' , $o -> system_id ));
}
/**
* Recover a deleted address
*
* @ param int $id
* @ return \Illuminate\Http\RedirectResponse
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
public function pur_address ( int $id )
{
$o = Address :: onlyTrashed () -> findOrFail ( $id );
// @todo This should be admin of the zone
$this -> authorize ( 'admin' , $o );
session () -> flash ( 'accordion' , 'address' );
$o -> forceDelete ();
return redirect () -> to ( sprintf ( 'ftn/system/addedit/%d' , $o -> system_id ));
}
2022-12-04 02:30:38 +00:00
public function system_link ( Request $request )
{
if ( ! $request -> system_id )
return redirect ( 'user/system/register' );
$s = Setup :: findOrFail ( config ( 'app.id' )) -> system ;
$so = System :: findOrFail ( $request -> system_id );
$ca = NULL ;
$la = NULL ;
foreach ( $s -> addresses as $ao ) {
2022-12-11 09:17:24 +00:00
if (( $ca = $so -> match ( $ao -> zone )) -> count ())
2022-12-04 02:30:38 +00:00
break ;
}
if ( $ca -> count () && $la = $ca -> pop ())
Notification :: route ( 'netmail' , $la ) -> notify ( new AddressLink ( $la , Auth :: user ()));
return view ( 'user.system.register_send' )
-> with ( 'la' , $la )
-> with ( 'o' , $so );
}
2021-11-11 11:57:13 +00:00
/**
2023-04-14 09:47:33 +00:00
* Register a system , or link to an existing system
2021-11-11 11:57:13 +00:00
*/
2022-01-01 14:52:21 +00:00
public function system_register ( SystemRegister $request )
2021-06-17 14:08:30 +00:00
{
2022-03-14 11:28:54 +00:00
// Step 1, show the user a form to select an existing defined system
if ( $request -> isMethod ( 'GET' ))
return view ( 'user.system.register' );
2023-04-14 09:47:33 +00:00
if ( $request -> action === 'register' && $request -> system_id )
2022-12-04 02:30:38 +00:00
return view ( 'user.system.widget.register_confirm' )
-> with ( 'o' , System :: findOrFail ( $request -> system_id ));
2021-11-11 11:57:13 +00:00
$o = System :: findOrNew ( $request -> system_id );
2022-03-14 11:28:54 +00:00
// If the system exists, and we are 'register', we'll start the address claim process
2023-04-14 09:47:33 +00:00
if ( $o -> exists && $request -> action === 'Link' ) {
2022-03-14 11:28:54 +00:00
$validate = Setup :: findOrFail ( config ( 'app.id' )) -> system -> inMyZones ( $o -> addresses );
// If we have addresses, we'll trigger the routed netmail
if ( $validate -> count ())
Notification :: route ( 'netmail' , $x = $validate -> first ()) -> notify ( new AddressLink ( $x , Auth :: user ()));
2022-12-04 02:30:38 +00:00
return view ( 'user.system.widget.register_send' )
2022-03-14 11:28:54 +00:00
-> with ( 'validate' , $validate )
-> with ( 'o' , $o );
}
// If the system doesnt exist, we'll create it
2021-11-11 11:57:13 +00:00
if ( ! $o -> exist ) {
$o -> sysop = Auth :: user () -> name ;
foreach ([ 'name' , 'zt_id' , 'location' , 'mailer_type' , 'mailer_address' , 'mailer_port' , 'phone' , 'method' , 'address' , 'port' ] as $item )
if ( $request -> { $item })
$o -> { $item } = $request -> { $item };
$o -> active = TRUE ;
}
if ( $request -> post ( 'submit' )) {
Auth :: user () -> systems () -> save ( $o );
2022-01-01 14:52:21 +00:00
// @todo if the system already exists and part of one of our networks, we'll need to send the registration email to confirm the address.
2021-11-11 11:57:13 +00:00
// @todo mark the system (or addresses) as "pending" at this stage until it is confirmed
return redirect () -> to ( url ( 'ftn/system/addedit' , $o -> id ));
}
2022-01-01 14:52:21 +00:00
// Re-flash our previously input data
if ( $request -> old )
session () -> flashInput ( $request -> old );
2021-11-11 11:57:13 +00:00
return view ( 'system.widget.form-system' )
2022-01-01 14:52:21 +00:00
-> with ( 'action' , $request -> action )
2021-11-11 11:57:13 +00:00
-> with ( 'o' , $o )
-> with ( 'errors' , new ViewErrorBag );
2021-06-17 14:08:30 +00:00
}
2022-11-25 10:44:03 +00:00
public function view ( System $o )
{
2023-04-15 03:34:08 +00:00
$o -> load ([ 'addresses' ]);
2022-11-25 10:44:03 +00:00
return view ( 'system.view' )
-> with ( 'o' , $o );
}
2022-03-14 11:28:54 +00:00
}