diff --git a/src/app/stores/clients.ts b/src/app/stores/clients.ts index ed2f9498..23f0ea32 100644 --- a/src/app/stores/clients.ts +++ b/src/app/stores/clients.ts @@ -32,7 +32,7 @@ export const useClientsStore = defineStore('Clients', () => { const clientsPersist = ref>({}); const searchParams = ref({ - filter: '', + filter: undefined as string | undefined, }); const { data: _clients, refresh: _refresh } = useFetch('/api/client', { @@ -125,6 +125,7 @@ export const useClientsStore = defineStore('Clients', () => { }; }); + // TODO: move search to backend if (transformedClients !== undefined) { transformedClients = sortByProperty( transformedClients, @@ -138,7 +139,7 @@ export const useClientsStore = defineStore('Clients', () => { function setSearchQuery(filter: string) { clients.value = null; - searchParams.value.filter = filter; + searchParams.value.filter = filter || undefined; } return { clients, clientsPersist, refresh, _clients, setSearchQuery }; diff --git a/src/server/database/repositories/client/service.ts b/src/server/database/repositories/client/service.ts index e9050eed..80ddf74d 100644 --- a/src/server/database/repositories/client/service.ts +++ b/src/server/database/repositories/client/service.ts @@ -133,11 +133,8 @@ export class ClientService { * Get clients based on user ID and filter conditions */ async getForUserFiltered(userId: ID, filter: string) { - if (!filter.trim()) { - return this.getForUser(userId); - } - const filterPattern = `%${filter.toLowerCase()}%`; + const result = await this.#statements.findByUserIdFiltered.execute({ userId, filter: filterPattern, @@ -151,14 +148,11 @@ export class ClientService { } /** - * Get all public clients based on filter conditions + * Get all clients based on filter conditions without sensitive data */ async getAllPublicFiltered(filter: string) { - if (!filter.trim()) { - return this.getAllPublic(); - } - const filterPattern = `%${filter.toLowerCase()}%`; + const result = await this.#statements.findAllPublicFiltered.execute({ filter: filterPattern, }); diff --git a/src/server/database/repositories/client/types.ts b/src/server/database/repositories/client/types.ts index 0e32baa8..479385e3 100644 --- a/src/server/database/repositories/client/types.ts +++ b/src/server/database/repositories/client/types.ts @@ -39,7 +39,7 @@ const address6 = z .min(1, { message: t('zod.client.address6') }) .pipe(safeStringRefine); -const filter = z.string().optional().default(''); +const filter = z.string().optional(); const serverAllowedIps = z.array(AddressSchema, { message: t('zod.client.serverAllowedIps'), diff --git a/src/server/utils/WireGuard.ts b/src/server/utils/WireGuard.ts index c23c35ee..8f9a96f2 100644 --- a/src/server/utils/WireGuard.ts +++ b/src/server/utils/WireGuard.ts @@ -61,14 +61,16 @@ class WireGuard { WG_DEBUG('Config synced successfully.'); } - async getClientsForUser(userId: ID, filter: string) { + async getClientsForUser(userId: ID, filter?: string) { const wgInterface = await Database.interfaces.get(); + let dbClients; - if (filter.trim()) { + if (filter?.trim()) { dbClients = await Database.clients.getForUserFiltered(userId, filter); } else { dbClients = await Database.clients.getForUser(userId); } + const clients = dbClients.map((client) => ({ ...client, latestHandshakeAt: null as Date | null, @@ -107,14 +109,16 @@ class WireGuard { return clientDump; } - async getAllClients(filter: string) { + async getAllClients(filter?: string) { const wgInterface = await Database.interfaces.get(); + let dbClients; - if (filter.trim()) { + if (filter?.trim()) { dbClients = await Database.clients.getAllPublicFiltered(filter); } else { dbClients = await Database.clients.getAllPublic(); } + const clients = dbClients.map((client) => ({ ...client, latestHandshakeAt: null as Date | null,