diff --git a/app/Http/Controllers/Admin/Nodes/Addresses/AddressController.php b/app/Http/Controllers/Admin/Nodes/Addresses/AddressController.php index 3a246abc777..71d50a374ee 100644 --- a/app/Http/Controllers/Admin/Nodes/Addresses/AddressController.php +++ b/app/Http/Controllers/Admin/Nodes/Addresses/AddressController.php @@ -80,9 +80,9 @@ public function search(Node $node, Request $request) if ($request->show_available_ips) { - return $builder->where('server_id', null)->get(); + $builder = $builder->where('server_id', null); } - return $builder->get(); + return $builder->paginate($request->query('per_page') ?? 50); } } diff --git a/app/Http/Controllers/Admin/Templates/TemplateController.php b/app/Http/Controllers/Admin/Templates/TemplateController.php index 096033f916c..1ac3d16cf7d 100644 --- a/app/Http/Controllers/Admin/Templates/TemplateController.php +++ b/app/Http/Controllers/Admin/Templates/TemplateController.php @@ -3,9 +3,25 @@ namespace App\Http\Controllers\Admin\Templates; use App\Http\Controllers\Controller; +use App\Models\Node; +use App\Models\Template; +use App\Services\Nodes\TemplateService; use Illuminate\Http\Request; class TemplateController extends Controller { - // + public function __construct(private TemplateService $templateService) + { + + } + + public function index(Node $node) + { + return $this->templateService->setNode($node)->getTemplates(); + } + + public function show(Node $node, Template $template) + { + return $template; + } } diff --git a/app/Jobs/Servers/ProcessInstallation.php b/app/Jobs/Servers/ProcessInstallation.php index bbf6495a968..b3ffa7ea95f 100644 --- a/app/Jobs/Servers/ProcessInstallation.php +++ b/app/Jobs/Servers/ProcessInstallation.php @@ -25,7 +25,7 @@ class ProcessInstallation implements ShouldQueue * * @var int */ - public $timeout = 420; + public $timeout = 1000; /** * The number of times the job may be attempted. diff --git a/app/Models/Node.php b/app/Models/Node.php index a43f8e0a828..a525f0b6203 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -5,11 +5,10 @@ use App\Rules\Network\Hostname; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use Laravel\Scout\Searchable; class Node extends Model { - use HasFactory, Searchable; + use HasFactory; protected $fillable = [ 'name', 'cluster', 'hostname', 'token_id', 'secret', 'port' @@ -37,11 +36,4 @@ public function addresses() { return $this->hasMany(IPAddress::class); } - - public function toSearchableArray() - { - return [ - 'name' => $this->name - ]; - } } \ No newline at end of file diff --git a/app/Models/Server.php b/app/Models/Server.php index 6f8578767f6..e23f8d258f0 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -4,11 +4,10 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use Laravel\Scout\Searchable; class Server extends Model { - use HasFactory, Searchable; + use HasFactory; protected $fillable = [ 'name', @@ -37,11 +36,4 @@ public function template() { return $this->hasOne(Template::class); } - - public function toSearchableArray() - { - return [ - 'name' => $this->name - ]; - } } \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php index 6c7f6857da1..8efb1ec3969 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -7,15 +7,13 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; -use App\Models\Server; -use Laravel\Scout\Searchable; /** * @mixin \Eloquent */ class User extends Authenticatable { - use HasApiTokens, HasFactory, Notifiable, Searchable; + use HasApiTokens, HasFactory, Notifiable; /** * The attributes that are mass assignable. @@ -55,14 +53,4 @@ public function servers() { return $this->hasMany(Server::class); } - - /** - * @return array - */ - public function toSearchableArray() - { - return [ - 'name' => $this->name - ]; - } } diff --git a/resources/js/api/admin/nodes/addresses/searchAddresses.ts b/resources/js/api/admin/nodes/addresses/searchAddresses.ts index bc7ad543cc9..e558f3405e0 100644 --- a/resources/js/api/admin/nodes/addresses/searchAddresses.ts +++ b/resources/js/api/admin/nodes/addresses/searchAddresses.ts @@ -1,8 +1,21 @@ import { Address } from '@/api/admin/nodes/addresses/types' +import { PaginatedInterface } from '@/api/types/default' import axios from 'axios' -export default (query: string, nodeId: number, showAvailableIps: boolean = false) => { - return axios.get(route('admin.nodes.show.addresses.search', nodeId), { - params: { 'filter[*]': query, show_available_ips: showAvailableIps }, - }) +export default ( + query: string, + nodeId: number, + showAvailableIps: boolean = false +) => { + return axios.get>( + route('admin.nodes.show.addresses.search', { + node: nodeId, + params: { 'filter[address]': query }, + }), + { + params: { + show_available_ips: showAvailableIps, + }, + } + ) } diff --git a/resources/js/api/admin/nodes/searchNodes.ts b/resources/js/api/admin/nodes/searchNodes.ts index 17bfa714dbf..53268385ce6 100644 --- a/resources/js/api/admin/nodes/searchNodes.ts +++ b/resources/js/api/admin/nodes/searchNodes.ts @@ -1,8 +1,9 @@ import { Node } from '@/api/admin/nodes/types' +import { PaginatedInterface } from '@/api/types/default' import axios from 'axios' export default (search: string) => { - return axios.get( + return axios.get>( route('admin.nodes.search', { params: { 'filter[*]' : search, diff --git a/resources/js/api/admin/servers/searchServers.ts b/resources/js/api/admin/servers/searchServers.ts index 0779a0c8bf0..f7ad352ec16 100644 --- a/resources/js/api/admin/servers/searchServers.ts +++ b/resources/js/api/admin/servers/searchServers.ts @@ -1,5 +1,6 @@ import axios from 'axios' import { Server as DefaultServer } from '@/api/server/types' +import { PaginatedInterface } from '@/api/types/default' export interface Server extends DefaultServer { node: { @@ -9,7 +10,7 @@ export interface Server extends DefaultServer { } export default (search: string) => { - return axios.get( + return axios.get>( route('admin.servers.search', { params: { 'filter[*]': search, diff --git a/resources/js/api/admin/servers/templates/types.ts b/resources/js/api/admin/servers/templates/types.ts index 8f7e8b99c30..3664a0634c7 100644 --- a/resources/js/api/admin/servers/templates/types.ts +++ b/resources/js/api/admin/servers/templates/types.ts @@ -5,3 +5,13 @@ export interface Template { created_at?: string updated_at?: string } + +export interface ServerTemplate { + id: number + server_id: number + server: { + id: number + vmid: number + name: string + } +} \ No newline at end of file diff --git a/resources/js/api/admin/users/searchUsers.ts b/resources/js/api/admin/users/searchUsers.ts index 77a8a88774b..62a4fa01555 100644 --- a/resources/js/api/admin/users/searchUsers.ts +++ b/resources/js/api/admin/users/searchUsers.ts @@ -1,8 +1,8 @@ -import { User } from '@/api/types/default' +import { PaginatedInterface, User } from '@/api/types/default' import axios from 'axios' export default (search: string) => { - return axios.get( + return axios.get>( route('admin.users.search', { params: { 'filter[*]' : search, diff --git a/resources/js/api/server/settings/getTemplates.ts b/resources/js/api/server/settings/getTemplates.ts index 9107f8cb312..2d9d3231ac5 100644 --- a/resources/js/api/server/settings/getTemplates.ts +++ b/resources/js/api/server/settings/getTemplates.ts @@ -1,15 +1,6 @@ +import { ServerTemplate } from '@/api/admin/servers/templates/types' import axios from 'axios' -export interface ServerTemplate { - id: number - server_id: number - server: { - id: number - vmid: number - name: string - } -} - export default (serverId: number) => { return axios.get(route('servers.show.templates', serverId)) } \ No newline at end of file diff --git a/resources/js/api/types/default.ts b/resources/js/api/types/default.ts index fba3ffc9914..01bfaa7befe 100644 --- a/resources/js/api/types/default.ts +++ b/resources/js/api/types/default.ts @@ -15,3 +15,22 @@ export interface AuthInterface { export interface DefaultProps { auth: AuthInterface } + +export interface LinkInterface { + back?: string + next?: string +} + +export interface PaginationInterface { + total: number + count: number + per_page: number + current_page: number + total_pages: number + links: LinkInterface +} + +export interface PaginatedInterface { + data: T + meta: PaginationInterface +} \ No newline at end of file diff --git a/resources/js/components/nodes/addresses/EditAddressModal.tsx b/resources/js/components/nodes/addresses/EditAddressModal.tsx index edcdc34d0d9..6568812f349 100644 --- a/resources/js/components/nodes/addresses/EditAddressModal.tsx +++ b/resources/js/components/nodes/addresses/EditAddressModal.tsx @@ -71,7 +71,7 @@ const EditAddressModal = ({ node, address, open, setOpen }: Props) => { const searchServers = useCallback( debounce(async (query: string) => { - const { data } = await getSearchServers(query) + const { data: { data } } = await getSearchServers(query) setServers( data.map((server) => { return { diff --git a/resources/js/components/nodes/addresses/NewAddressModal.tsx b/resources/js/components/nodes/addresses/NewAddressModal.tsx index d43224b0f6e..ff82e01cd3f 100644 --- a/resources/js/components/nodes/addresses/NewAddressModal.tsx +++ b/resources/js/components/nodes/addresses/NewAddressModal.tsx @@ -64,7 +64,7 @@ const NewAddressModal = ({node, open, setOpen}: Props) => { const searchServers = useCallback( debounce(async (query: string) => { - const { data } = await getSearchServers(query) + const { data: { data } } = await getSearchServers(query) setServers( data.map((server) => { return { diff --git a/resources/js/pages/admin/servers/Create.tsx b/resources/js/pages/admin/servers/Create.tsx index 447abe371bc..1b00c926337 100644 --- a/resources/js/pages/admin/servers/Create.tsx +++ b/resources/js/pages/admin/servers/Create.tsx @@ -35,7 +35,7 @@ import getSearchNodes from '@/api/admin/nodes/searchNodes' import SelectItem from '@/components/SelectItem' import getSearchUsers from '@/api/admin/users/searchUsers' import { useQuery } from '@tanstack/react-query' -import getTemplates from '@/api/server/settings/getTemplates' +import getTemplates from '@/api/admin/nodes/templates/getTemplates' import getSearchAddresses from '@/api/admin/nodes/addresses/searchAddresses' interface Props extends DefaultProps {} @@ -94,7 +94,7 @@ const Create = ({ auth }: Props) => { const searchNodes = useCallback( debounce(async (query: string) => { - const { data } = await getSearchNodes(query) + const { data: { data } } = await getSearchNodes(query) setNodes( data.map((node) => { return { @@ -118,7 +118,7 @@ const Create = ({ auth }: Props) => { const searchUsers = useCallback( debounce(async (query: string) => { - const { data } = await getSearchUsers(query) + const { data: { data } } = await getSearchUsers(query) setUsers( data.map((user) => { return { @@ -141,13 +141,13 @@ const Create = ({ auth }: Props) => { const searchIps = useCallback( debounce(async (query: string) => { - const { data: res } = await getSearchAddresses( + const { data: { data } } = await getSearchAddresses( query, dataRef.current.node_id as number, true ) setIps( - res.map((ip) => { + data.map((ip) => { return { label: ip.address, value: ip.id.toString(), diff --git a/resources/js/pages/admin/servers/settings/modules/BasicSettings.tsx b/resources/js/pages/admin/servers/settings/modules/BasicSettings.tsx index 000450b67ea..9906a4192e1 100644 --- a/resources/js/pages/admin/servers/settings/modules/BasicSettings.tsx +++ b/resources/js/pages/admin/servers/settings/modules/BasicSettings.tsx @@ -52,7 +52,7 @@ const BasicSettings = () => { const searchNodes = useCallback( debounce(async (query: string) => { - const { data } = await getSearchNodes(query) + const { data: { data } } = await getSearchNodes(query) setNodes( data.map((node) => { return { @@ -76,7 +76,7 @@ const BasicSettings = () => { const searchUsers = useCallback( debounce(async (query: string) => { - const { data } = await getSearchUsers(query) + const { data: { data } } = await getSearchUsers(query) setUsers( data.map((user) => { return { diff --git a/routes/admin.php b/routes/admin.php index 1bb77818432..a742d82a2f7 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -9,6 +9,7 @@ use App\Http\Controllers\Admin\Servers\Settings; use App\Http\Controllers\Admin\Users; use Illuminate\Support\Facades\Route; +use App\Http\Controllers\Admin\Templates\TemplateController; Route::get('/', [IndexController::class, 'index'])->name('admin.dashboard'); @@ -31,6 +32,11 @@ Route::get('/', [NodeController::class, 'show'])->name('admin.nodes.show'); Route::delete('/', [NodeController::class, 'destroy']); + Route::prefix('/templates')->group(function () { + Route::get('/', [TemplateController::class, 'index'])->name('admin.nodes.show.templates'); + Route::get('/{template}', [TemplateController::class, 'show'])->name('admin.nodes.show.templates.show'); + }); + Route::prefix('/addresses')->group(function () { Route::get('/', [AddressController::class, 'index'])->name('admin.nodes.show.addresses'); Route::post('/', [AddressController::class, 'store']);