diff --git a/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/repository/OrganizationRepositoryImpl.java b/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/repository/OrganizationRepositoryImpl.java index 5074dec..7d2562a 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/repository/OrganizationRepositoryImpl.java +++ b/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/repository/OrganizationRepositoryImpl.java @@ -9,6 +9,7 @@ import net.beetechgroup.beetask.frameworks.persistence.mapper.OrganizationEntity import net.beetechgroup.beetask.usecase.repository.OrganizationRepository; import java.util.List; +import java.util.Objects; import java.util.Optional; @ApplicationScoped @@ -28,6 +29,12 @@ public class OrganizationRepositoryImpl implements OrganizationRepository, Panac @Override public List search(String query) { + if (Objects.isNull(query) || query.isBlank()) { + return findAll().list().stream() + .map(OrganizationEntityMapper::toDomain) + .toList(); + } + return find("name like ?1", "%" + query + "%").stream() .map(OrganizationEntityMapper::toDomain) .toList(); diff --git a/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/organization/OrganizationController.java b/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/organization/OrganizationController.java index 373187b..ca5b125 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/organization/OrganizationController.java +++ b/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/organization/OrganizationController.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.PATCH; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Response; import net.beetechgroup.beetask.usecase.organization.create.CreateOrganizationInput; import net.beetechgroup.beetask.usecase.organization.create.CreateOrganizationOutput; import net.beetechgroup.beetask.usecase.organization.create.CreateOrganizationUseCase; diff --git a/backend/src/main/java/net/beetechgroup/beetask/usecase/organization/search/SearchOrganizationsUseCase.java b/backend/src/main/java/net/beetechgroup/beetask/usecase/organization/search/SearchOrganizationsUseCase.java index 4183942..8ff870e 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/usecase/organization/search/SearchOrganizationsUseCase.java +++ b/backend/src/main/java/net/beetechgroup/beetask/usecase/organization/search/SearchOrganizationsUseCase.java @@ -1,10 +1,8 @@ package net.beetechgroup.beetask.usecase.organization.search; -import net.beetechgroup.beetask.entities.organization.Organization; import net.beetechgroup.beetask.usecase.repository.OrganizationRepository; import java.util.List; -import java.util.stream.Collectors; public class SearchOrganizationsUseCase { private final OrganizationRepository organizationRepository; @@ -14,9 +12,8 @@ public class SearchOrganizationsUseCase { } public List execute(String query) { - List results = organizationRepository.search(query); - return results.stream() + return organizationRepository.search(query).stream() .map(org -> new SearchOrganizationOutput(org.getId(), org.getName())) - .collect(Collectors.toList()); + .toList(); } } diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index ca256c7..183ed9c 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -30,10 +30,10 @@ export async function apiFetch(path: string, options: RequestOptions = {}) { : body, }) + const text = await response.text() if (!response.ok) { - const message = await response.text() - throw new Error(message || 'Nao foi possivel concluir a requisicao.') + throw new Error(text || 'Nao foi possivel concluir a requisicao.') } - return (await response.json()) as T + return text ? (JSON.parse(text) as T) : (undefined as T) } diff --git a/frontend/src/pages/JoinOrganizationPage.tsx b/frontend/src/pages/JoinOrganizationPage.tsx index dddf892..72b3e4e 100644 --- a/frontend/src/pages/JoinOrganizationPage.tsx +++ b/frontend/src/pages/JoinOrganizationPage.tsx @@ -1,49 +1,51 @@ -import React, { useState } from 'react' -import { motion } from 'framer-motion' -import { Search, Building2, Send, CheckCircle2 } from 'lucide-react' -import { organizationService } from '../services/organizationService' +import React, { useState } from "react"; +import { motion } from "framer-motion"; +import { Search, Building2, Send, CheckCircle2 } from "lucide-react"; +import { organizationService } from "../services/organizationService"; interface OrgResult { - id: number - name: string + id: number; + name: string; } export const JoinOrganizationPage: React.FC = () => { - const [query, setQuery] = useState('') - const [results, setResults] = useState([]) - const [isLoading, setIsLoading] = useState(false) - const [requestedId, setRequestedId] = useState(null) + const [query, setQuery] = useState(""); + const [results, setResults] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [requestedId, setRequestedId] = useState(null); const handleSearch = async (e: React.FormEvent) => { - e.preventDefault() - if (!query) return - setIsLoading(true) + e.preventDefault(); + if (!query) return; + setIsLoading(true); try { - const data = await organizationService.search(query) - setResults(data) + const data = await organizationService.search(query); + setResults(data); } catch (error) { - console.error('Search failed', error) + console.error("Search failed", error); } finally { - setIsLoading(false) + setIsLoading(false); } - } + }; const handleJoinRequest = async (id: number) => { try { - await organizationService.requestJoin(id) - setRequestedId(id) - alert('Solicitação enviada! Aguarde a aprovação do dono da organização.') + await organizationService.requestJoin(id); + setRequestedId(id); + alert("Solicitação enviada! Aguarde a aprovação do dono da organização."); } catch (error) { - console.error('Join request failed', error) - alert(error instanceof Error ? error.message : 'Erro ao enviar solicitação.') + console.error("Join request failed", error); + alert( + error instanceof Error ? error.message : "Erro ao enviar solicitação.", + ); } - } + }; return (
-
+
{ >
-
+
-

Buscar Organização

-

Encontre uma organização pelo nome

+

+ Buscar Organização +

+

+ Encontre uma organização pelo nome +

- +
setQuery(e.target.value)} - className="block w-full pl-12 pr-4 py-3.5 bg-surface-muted/50 border border-border-soft rounded-2xl text-text-main placeholder-text-muted/60 focus:outline-none focus:ring-4 focus:ring-accent/10 focus:border-accent transition-all font-medium" + className="block w-full pl-12 pr-4 py-3.5 bg-surface-muted/50 border border-border-soft rounded-2xl text-text-main placeholder-text-muted/60 focus:outline-none focus:ring-4 focus:ring-brand/10 focus:border-brand transition-all font-medium" placeholder="Nome da organização..." />
- {results.length > 0 ? ( + {results && results.length > 0 ? ( results.map((org) => (
-
+
{org.name}
{requestedId === org.id ? ( -
+
Solicitado
) : (
)) - ) : query && !isLoading ? ( -

Nenhuma organização encontrada.

+ ) : results && results.length === 0 ? ( +

+ Nenhuma organização encontrada. +

) : null}
- ) -} + ); +};