Skip to content

Commit

Permalink
filter servers by addressPoolId for IPAM
Browse files Browse the repository at this point in the history
  • Loading branch information
ericwang401 committed Dec 22, 2023
1 parent 12f0d61 commit 3f42c01
Show file tree
Hide file tree
Showing 11 changed files with 87 additions and 191 deletions.
19 changes: 14 additions & 5 deletions app/Http/Controllers/Admin/ServerController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Convoy\Http\Requests\Admin\Servers\Settings\UpdateBuildRequest;
use Convoy\Http\Requests\Admin\Servers\Settings\UpdateGeneralInfoRequest;
use Convoy\Http\Requests\Admin\Servers\StoreServerRequest;
use Convoy\Models\Filters\FiltersServerByAddressPoolId;
use Convoy\Models\Filters\FiltersServerWildcard;
use Convoy\Models\Server;
use Convoy\Services\Servers\CloudinitService;
Expand Down Expand Up @@ -42,12 +43,20 @@ public function index(Request $request)
{
$servers = QueryBuilder::for(Server::query())
->with(['addresses', 'user', 'node'])
->defaultSort('-id')
->allowedFilters(
[AllowedFilter::custom(
'*', new FiltersServerWildcard(),
), AllowedFilter::exact('node_id'), AllowedFilter::exact(
'user_id',
), 'name'],
[
AllowedFilter::custom(
'*', new FiltersServerWildcard(),
),
AllowedFilter::custom(
'address_pool_id',
new FiltersServerByAddressPoolId(),
),
AllowedFilter::exact('node_id'),
AllowedFilter::exact('user_id'),
'name',
],
)
->paginate(min($request->query('per_page', 50), 100))->appends(
$request->query(),
Expand Down
24 changes: 24 additions & 0 deletions app/Models/Filters/FiltersServerByAddressPoolId.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace Convoy\Models\Filters;

use Illuminate\Database\Eloquent\Builder;
use Spatie\QueryBuilder\Filters\Filter;

class FiltersServerByAddressPoolId implements Filter
{
public function __invoke(Builder $query, $value, string $property): void
{
$query->whereRaw(
"
id IN (
SELECT serv.id
FROM servers serv
JOIN address_pool_to_node apn ON serv.node_id = apn.node_id
WHERE apn.address_pool_id = ?
)
",
[$value],
);
}
}
5 changes: 3 additions & 2 deletions resources/scripts/api/admin/addressPools/getAttachedNodes.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { NodeResponse, rawDataToNode } from '@/api/admin/nodes/getNodes'
import http, { getPaginationSet } from '@/api/http'


export interface QueryParams {
query?: string | null
fqdn?: string | null
Expand All @@ -14,7 +15,7 @@ const getAttachedNodes = async (
{ query, fqdn, locationId, page, perPage = 50 }: QueryParams
): Promise<NodeResponse> => {
const { data } = await http.get(
`/api/admin/address-pools/${addressPoolId}/nodes`,
`/api/admin/address-pools/${addressPoolId}/attached-nodes`,
{
params: {
query,
Expand All @@ -32,4 +33,4 @@ const getAttachedNodes = async (
}
}

export default getAttachedNodes
export default getAttachedNodes
16 changes: 10 additions & 6 deletions resources/scripts/api/admin/servers/getServers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,23 @@ import {
} from '@/api/admin/servers/getServer'
import http, { PaginatedResult, getPaginationSet } from '@/api/http'


export type ServerInclude = 'user' | 'node'

export interface QueryParams {
nodeId?: number
userId?: number
query?: string
page?: number
perPage?: number
include?: ServerInclude[]
addressPoolId?: number | null
nodeId?: number | null
userId?: number | null
query?: string | null
page?: number | null
perPage?: number | null
include?: ServerInclude[] | null
}

export type ServerResponse = PaginatedResult<AdminServerBuild>

const getServers = async ({
addressPoolId,
nodeId,
userId,
query,
Expand All @@ -27,6 +30,7 @@ const getServers = async ({
}: QueryParams): Promise<ServerResponse> => {
const { data } = await http.get('/api/admin/servers', {
params: {
'filter[address_pool_id]': addressPoolId,
'filter[node_id]': nodeId,
'filter[user_id]': userId,
'filter[*]': query,
Expand Down
14 changes: 12 additions & 2 deletions resources/scripts/api/admin/servers/useServersSWR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,26 @@ import getServers, {
ServerResponse,
} from '@/api/admin/servers/getServers'


const useServersSWR = ({
page,
nodeId,
userId,
addressPoolId,
query,
...params
}: QueryParams) => {
return useSWR<ServerResponse>(
['admin:servers', page, query, nodeId, userId],
() => getServers({ page, query, nodeId, userId, ...params })
['admin:servers', page, query, nodeId, userId, addressPoolId],
() =>
getServers({
page,
query,
nodeId,
userId,
addressPoolId,
...params,
})
)
}

Expand Down
4 changes: 2 additions & 2 deletions resources/scripts/components/admin/ipam/EditPoolModal.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { useFlashKey } from '@/util/useFlash'
import { zodResolver } from '@hookform/resolvers/zod'
import { data } from 'autoprefixer'
import { useEffect } from 'react'
import { FormProvider, useForm } from 'react-hook-form'
import { useTranslation } from 'react-i18next'
Expand All @@ -20,6 +19,7 @@ import TextInputForm from '@/components/elements/forms/TextInputForm'

import NodesMultiSelectForm from '@/components/admin/ipam/NodesMultiSelectForm'


interface Props {
pool: AddressPool | null
onClose: () => void
Expand Down Expand Up @@ -128,4 +128,4 @@ const EditPoolModal = ({ pool, onClose, mutate }: Props) => {
)
}

export default EditPoolModal
export default EditPoolModal
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import useNodesSWR from '@/api/admin/nodes/useNodesSWR'
import DescriptiveItemComponent from '@/components/elements/DescriptiveItemComponent'
import MultiSelectForm from '@/components/elements/forms/MultiSelectForm'


interface Props {
disabled?: boolean
loading?: boolean
Expand Down Expand Up @@ -74,4 +75,4 @@ const NodesMultiSelectForm = ({ disabled, loading }: Props) => {
)
}

export default NodesMultiSelectForm
export default NodesMultiSelectForm
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import Radio from '@/components/elements/inputs/Radio'

import ServersSelectForm from '@/components/admin/ipam/addresses/ServersSelectForm'


interface Props {
address: Address | null
onClose: () => void
Expand Down Expand Up @@ -154,7 +155,9 @@ const EditAddressModal = ({ address, onClose, mutate }: Props) => {
name='macAddress'
label={tStrings('mac_address')}
/>
<ServersSelectForm />
<ServersSelectForm
addressPoolId={address?.addressPoolId}
/>
</Modal.Body>

<Modal.Actions>
Expand All @@ -174,4 +177,4 @@ const EditAddressModal = ({ address, onClose, mutate }: Props) => {
)
}

export default EditAddressModal
export default EditAddressModal
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,20 @@ import useServersSWR from '@/api/admin/servers/useServersSWR'

import SelectForm from '@/components/elements/forms/SelectForm'

const ServersSelectForm = () => {

interface Props {
addressPoolId?: number | null
}

const ServersSelectForm = ({ addressPoolId }: Props) => {
const { t: tSIndex } = useTranslation('admin.servers.index')
const { t: tAIndex } = useTranslation('admin.addressPools.addresses')
const { watch } = useFormContext()
const serverId: string = watch('serverId')
const [query, setQuery] = useState(serverId)
const [debouncedQuery] = useDebouncedValue(query, 200)
const { data, isLoading, isValidating } = useServersSWR({
addressPoolId,
query: debouncedQuery,
perPage: 10,
})
Expand All @@ -40,4 +46,4 @@ const ServersSelectForm = () => {
)
}

export default ServersSelectForm
export default ServersSelectForm
Loading

0 comments on commit 3f42c01

Please sign in to comment.