diff --git a/src/app/(protected)/administrativo/(user)/usuarios/page.tsx b/src/app/(protected)/administrativo/(user)/usuarios/page.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/app/(public)/login/page.tsx b/src/app/(public)/login/page.tsx index d8a1637..882cf08 100644 --- a/src/app/(public)/login/page.tsx +++ b/src/app/(public)/login/page.tsx @@ -1,4 +1,4 @@ -import { LoginForm } from '@/packages/administrativo/components/GUsuario/GUsuarioLoginForm'; +import { LoginForm } from '@/packages/administrativo/components/User/UserLoginForm'; export default function LoginPage() { return ( diff --git a/src/packages/administrativo/components/GUsuario/GUsuarioLoginForm.tsx b/src/packages/administrativo/components/User/UserLoginForm.tsx similarity index 90% rename from src/packages/administrativo/components/GUsuario/GUsuarioLoginForm.tsx rename to src/packages/administrativo/components/User/UserLoginForm.tsx index 7c3bd2f..a0c1cb6 100644 --- a/src/packages/administrativo/components/GUsuario/GUsuarioLoginForm.tsx +++ b/src/packages/administrativo/components/User/UserLoginForm.tsx @@ -6,24 +6,24 @@ import { Card, CardContent } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import z from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import GUsuarioLoginService from '@/packages/administrativo/services/GUsuario/GUsuarioLoginService'; +import { UserLoginService } from '@/packages/administrativo/services/User/UserLoginService'; import { useForm } from 'react-hook-form'; import { useState } from 'react'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '../../../../components/ui/form'; import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; import { Button } from '../../../../components/ui/button'; -import { GUsuarioLoginSchema } from '@/packages/administrativo/schemas/GUsuario/GUsuarioLoginSchema'; +import { UserLoginSchema } from '@/packages/administrativo/schemas/User/UserLoginSchema'; -type FormValues = z.infer; +type FormValues = z.infer; export function LoginForm({ className, ...props }: React.ComponentProps<'div'>) { const [loading, setLoading] = useState(false); const form = useForm({ - resolver: zodResolver(GUsuarioLoginSchema), + resolver: zodResolver(UserLoginSchema), defaultValues: { - login: '', - senha_api: '', + email: '', + password: '', }, }); @@ -33,7 +33,7 @@ export function LoginForm({ className, ...props }: React.ComponentProps<'div'>) setLoading(true); // Realiza o login - await GUsuarioLoginService(values); + await UserLoginService(values); // Removo o estado de loading do botão setLoading(false); @@ -53,7 +53,7 @@ export function LoginForm({ className, ...props }: React.ComponentProps<'div'>) ( Login @@ -66,7 +66,7 @@ export function LoginForm({ className, ...props }: React.ComponentProps<'div'>) /> ( Senha diff --git a/src/packages/administrativo/data/GUsuario/GUsuarioLoginData.ts b/src/packages/administrativo/data/GUsuario/GUsuarioLoginData.ts deleted file mode 100644 index e6a3bc0..0000000 --- a/src/packages/administrativo/data/GUsuario/GUsuarioLoginData.ts +++ /dev/null @@ -1,16 +0,0 @@ -'use server'; - -import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; -import API from '@/shared/services/api/Api'; - -export default async function GUsuarioLoginData(form: any) { - const api = new API(); - // Realiza o envio dos dados - const response = await api.send({ - method: Methods.POST, - endpoint: `administrativo/g_usuario/authenticate`, - body: form, - }); - - return response; -} diff --git a/src/packages/administrativo/data/User/UserDeleteData.ts b/src/packages/administrativo/data/User/UserDeleteData.ts new file mode 100644 index 0000000..63d400e --- /dev/null +++ b/src/packages/administrativo/data/User/UserDeleteData.ts @@ -0,0 +1,20 @@ +'use server' + +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; +import { withClientErrorHandler } from '@/withClientErrorHandler/withClientErrorHandler'; + +async function executeUserDeleteData(usuarioId: number) { + + const api = new API(); + + const response = await api.send({ + 'method': Methods.DELETE, + 'endpoint': `administrativo/user/${usuarioId}` + }); + + return response; + +} + +export const UserDeleteData = withClientErrorHandler(executeUserDeleteData) \ No newline at end of file diff --git a/src/packages/administrativo/data/User/UserIndexData.ts b/src/packages/administrativo/data/User/UserIndexData.ts new file mode 100644 index 0000000..d2f6601 --- /dev/null +++ b/src/packages/administrativo/data/User/UserIndexData.ts @@ -0,0 +1,19 @@ +'use server' +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; +import { withClientErrorHandler } from '@/withClientErrorHandler/withClientErrorHandler'; + +async function executeUserIndexData() { + + const api = new API(); + + const response = await api.send({ + 'method': Methods.GET, + 'endpoint': `administrativo/user` + }); + + return response; + +} + +export const UserIndexData = withClientErrorHandler(executeUserIndexData) \ No newline at end of file diff --git a/src/packages/administrativo/data/User/UserLoginData.ts b/src/packages/administrativo/data/User/UserLoginData.ts new file mode 100644 index 0000000..b7de7b1 --- /dev/null +++ b/src/packages/administrativo/data/User/UserLoginData.ts @@ -0,0 +1,21 @@ +'use server'; + +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; +import { AuthenticateUserInterface } from '@/shared/interfaces/AuthenticateUserInterface'; +import { withClientErrorHandler } from '@/withClientErrorHandler/withClientErrorHandler'; + +async function executeUserLoginData(form: AuthenticateUserInterface) { + const api = new API(); + + const response = await api.send({ + method: Methods.POST, + endpoint: `administrativo/user/authenticate`, + body: form, + }); + + return response; + +} + +export const UserLoginData = withClientErrorHandler(executeUserLoginData) \ No newline at end of file diff --git a/src/packages/administrativo/data/User/UserReadData.ts b/src/packages/administrativo/data/User/UserReadData.ts new file mode 100644 index 0000000..3b3fa9e --- /dev/null +++ b/src/packages/administrativo/data/User/UserReadData.ts @@ -0,0 +1,20 @@ +'use server' + +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; +import { withClientErrorHandler } from '@/withClientErrorHandler/withClientErrorHandler'; + +async function executeUserReadData(usuarioId: number) { + + const api = new API(); + + const response = await api.send({ + 'method': Methods.GET, + 'endpoint': `administrativo/user/${usuarioId}` + }); + + return response + +} + +export const UserReadData = withClientErrorHandler(executeUserReadData) \ No newline at end of file diff --git a/src/packages/administrativo/data/User/UserSaveData.ts b/src/packages/administrativo/data/User/UserSaveData.ts new file mode 100644 index 0000000..ec90429 --- /dev/null +++ b/src/packages/administrativo/data/User/UserSaveData.ts @@ -0,0 +1,21 @@ +'use server' + +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; +import { withClientErrorHandler } from '@/withClientErrorHandler/withClientErrorHandler'; + +async function executeUserSaveData(form: any) { + + const api = new API(); + + const response = await api.send({ + 'method': Methods.POST, + 'endpoint': `administrativo/user/`, + 'body': form + }); + + return response; + +} + +export const UserSaveData = withClientErrorHandler(executeUserSaveData) \ No newline at end of file diff --git a/src/packages/administrativo/hooks/GUsuario/useGUsuarioLogoutHook.ts b/src/packages/administrativo/hooks/GUsuario/useGUsuarioLogoutHook.ts index 7e3ba37..1195bfd 100644 --- a/src/packages/administrativo/hooks/GUsuario/useGUsuarioLogoutHook.ts +++ b/src/packages/administrativo/hooks/GUsuario/useGUsuarioLogoutHook.ts @@ -1,10 +1,10 @@ 'use client'; -import GUsuarioLogoutService from '../../services/GUsuario/GUsuarioLogoutService'; +import UserLogoutService from '../../services/User/UserLogoutService'; export const useGUsuarioLogoutHook = () => { const logoutUsuario = async () => { - await GUsuarioLogoutService('access_token'); + await UserLogoutService('access_token'); }; return { logoutUsuario }; diff --git a/src/packages/administrativo/interfaces/GUsuario/GUsuarioInterface.ts b/src/packages/administrativo/interfaces/GUsuario/GUsuarioInterface.ts deleted file mode 100644 index 5608711..0000000 --- a/src/packages/administrativo/interfaces/GUsuario/GUsuarioInterface.ts +++ /dev/null @@ -1,34 +0,0 @@ -export default interface GUsuario { - usuario_id: number; - trocarsenha: string; - login: string; - senha: string; - situacao: string; - nome_completo: string; - funcao: string; - assina: string; - sigla: string; - usuario_tab: string; - ultimo_login: string; - ultimo_login_regs: string; - data_expiracao: string; - senha_anterior: string; - andamento_padrao: string; - lembrete_pergunta: string; - lembrete_resposta: string; - andamento_padrao2: string; - receber_mensagem_arrolamento: string; - email: string; - assina_certidao: string; - receber_email_penhora: string; - foto: string; - nao_receber_chat_todos: string; - pode_alterar_caixa: string; - receber_chat_certidao_online: string; - receber_chat_cancelamento: string; - cpf: string; - somente_leitura: string; - receber_chat_envio_onr: string; - tipo_usuario: string; - senha_api: string; -} diff --git a/src/packages/administrativo/interfaces/User/UserInterface.ts b/src/packages/administrativo/interfaces/User/UserInterface.ts new file mode 100644 index 0000000..4d4e0d8 --- /dev/null +++ b/src/packages/administrativo/interfaces/User/UserInterface.ts @@ -0,0 +1,17 @@ +import { SituacoesEnum } from "@/shared/enums/SituacoesEnum"; + +export interface UserInterface { + user_id: number; + name: string; + email: string; + password: string; // Presumo que seja uma string com hash + password_temp: string | null; // Pode ser "N" ou outro valor, ou null + password_temp_confirm: string; // Pode ser "N" + position: string | null; // Pode ser uma string ou null + team: string; // Equipe onde o usuário pertence + status: SituacoesEnum; // A ou I + date_register: string; // Data de registro no formato ISO 8601 + date_update: string | null; // Data de atualização ou null + user_id_create: number | null; // ID do usuário que criou (se aplicável) + user_id_update: number | null; // ID do usuário que fez a última atualização (se aplicável) +} diff --git a/src/packages/administrativo/schemas/GUsuario/GUsuarioLoginSchema.ts b/src/packages/administrativo/schemas/GUsuario/GUsuarioLoginSchema.ts deleted file mode 100644 index dd65318..0000000 --- a/src/packages/administrativo/schemas/GUsuario/GUsuarioLoginSchema.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { z } from 'zod'; - -export const GUsuarioLoginSchema = z.object({ - login: z.string().min(1, 'O campo deve ser preenchido'), - senha_api: z.string().min(1, 'O campo deve ser preenchido'), -}); diff --git a/src/packages/administrativo/schemas/User/UserLoginSchema.ts b/src/packages/administrativo/schemas/User/UserLoginSchema.ts new file mode 100644 index 0000000..13c7dfe --- /dev/null +++ b/src/packages/administrativo/schemas/User/UserLoginSchema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; + +export const UserLoginSchema = z.object({ + email: z.string().min(1, 'O campo deve ser preenchido'), + password: z.string().min(1, 'O campo deve ser preenchido'), +}); diff --git a/src/packages/administrativo/services/User/UserDeleteService.ts b/src/packages/administrativo/services/User/UserDeleteService.ts new file mode 100644 index 0000000..39409e5 --- /dev/null +++ b/src/packages/administrativo/services/User/UserDeleteService.ts @@ -0,0 +1,20 @@ +'use server' + +import { withClientErrorHandler } from "@/withClientErrorHandler/withClientErrorHandler" +import { UserDeleteData } from "../../data/User/UserDeleteData" + +async function executeUserDeleteService(usuarioId: number) { + + if (usuarioId <= 0) { + return { + 'code': 400, + 'message': 'Usuário informado inválido', + } + } + + const response = await UserDeleteData(usuarioId) + return response + +} + +export const UserDeleteService = withClientErrorHandler(executeUserDeleteService) \ No newline at end of file diff --git a/src/packages/administrativo/services/User/UserIndexService.ts b/src/packages/administrativo/services/User/UserIndexService.ts new file mode 100644 index 0000000..2c5f963 --- /dev/null +++ b/src/packages/administrativo/services/User/UserIndexService.ts @@ -0,0 +1,14 @@ +'use server' + +import { withClientErrorHandler } from "@/withClientErrorHandler/withClientErrorHandler"; +import { UserIndexData } from "../../data/User/UserIndexData"; + +async function executeUserIndexService() { + + const response = await UserIndexData(); + + return response; + +} + +export const UserIndexService = withClientErrorHandler(executeUserIndexService) \ No newline at end of file diff --git a/src/packages/administrativo/services/GUsuario/GUsuarioLoginService.ts b/src/packages/administrativo/services/User/UserLoginService.ts similarity index 61% rename from src/packages/administrativo/services/GUsuario/GUsuarioLoginService.ts rename to src/packages/administrativo/services/User/UserLoginService.ts index 999dff7..2e3e671 100644 --- a/src/packages/administrativo/services/GUsuario/GUsuarioLoginService.ts +++ b/src/packages/administrativo/services/User/UserLoginService.ts @@ -2,14 +2,15 @@ import { cookies } from 'next/headers'; -import GUsuarioLoginData from '../../data/GUsuario/GUsuarioLoginData'; +import { UserLoginData } from '../../data/User/UserLoginData'; import { redirect } from 'next/navigation'; +import { withClientErrorHandler } from '@/withClientErrorHandler/withClientErrorHandler'; -export default async function GUsuarioLoginService(form: any) { +async function executeUserLoginService(form: any) { // Obtem a resposta da requisição - const response = await GUsuarioLoginData(form); + const response = await UserLoginData(form); // Verifica se localizou o usuário - if (response.data.usuario_id <= 0) { + if (response.data.user_id <= 0) { return { code: 404, message: 'Não foi localizado o usuário', @@ -29,5 +30,7 @@ export default async function GUsuarioLoginService(form: any) { }); // Redireciona para a págian desejada - redirect('/servicos'); + redirect('/user'); } + +export const UserLoginService = withClientErrorHandler(executeUserLoginService) diff --git a/src/packages/administrativo/services/GUsuario/GUsuarioLogoutService.ts b/src/packages/administrativo/services/User/UserLogoutService.ts similarity index 51% rename from src/packages/administrativo/services/GUsuario/GUsuarioLogoutService.ts rename to src/packages/administrativo/services/User/UserLogoutService.ts index c281fe6..7f9f68f 100644 --- a/src/packages/administrativo/services/GUsuario/GUsuarioLogoutService.ts +++ b/src/packages/administrativo/services/User/UserLogoutService.ts @@ -1,10 +1,11 @@ 'use server'; +import { withClientErrorHandler } from '@/withClientErrorHandler/withClientErrorHandler'; import { cookies } from 'next/headers'; import { redirect } from 'next/navigation'; -export default async function GUsuarioLogoutService(token: string) { +async function executeUserLogoutService(token: string) { const cookieStore = await cookies(); cookieStore.set(token, '', { expires: new Date(0), @@ -13,3 +14,5 @@ export default async function GUsuarioLogoutService(token: string) { redirect('/login'); } + +export const UserLogoutService = withClientErrorHandler(executeUserLogoutService) \ No newline at end of file diff --git a/src/packages/administrativo/services/User/UserReadService.ts b/src/packages/administrativo/services/User/UserReadService.ts new file mode 100644 index 0000000..9625333 --- /dev/null +++ b/src/packages/administrativo/services/User/UserReadService.ts @@ -0,0 +1,22 @@ +'use server' + +import { withClientErrorHandler } from "@/withClientErrorHandler/withClientErrorHandler"; +import { UserReadData } from "../../data/User/UserReadData"; + +async function executeUserReadService(usuarioId: number) { + + // Verifica se o id informado é válido + if (usuarioId <= 0) { + return { + 'code': 400, + 'message': 'Usuário informado inválido', + } + } + + const response = await UserReadData(usuarioId); + return response + + +} + +export const UserReadService = withClientErrorHandler(executeUserReadService) \ No newline at end of file diff --git a/src/packages/administrativo/services/User/UserSaveService.ts b/src/packages/administrativo/services/User/UserSaveService.ts new file mode 100644 index 0000000..1dcf406 --- /dev/null +++ b/src/packages/administrativo/services/User/UserSaveService.ts @@ -0,0 +1,12 @@ +'use server' + +import { withClientErrorHandler } from "@/withClientErrorHandler/withClientErrorHandler"; +import { UserSaveData } from "../../data/User/UserSaveData"; + +async function executeUserSave(form: any) { + + return await UserSaveData(form); + +} + +export const UserSave = withClientErrorHandler(executeUserSave) \ No newline at end of file diff --git a/src/shared/interfaces/AuthenticateUserInterface.ts b/src/shared/interfaces/AuthenticateUserInterface.ts new file mode 100644 index 0000000..5f1fbb0 --- /dev/null +++ b/src/shared/interfaces/AuthenticateUserInterface.ts @@ -0,0 +1,4 @@ +export interface AuthenticateUserInterface { + email: string; + password: string +} \ No newline at end of file diff --git a/src/shared/interfaces/GUsuarioAuthenticatedInterface.ts b/src/shared/interfaces/GUsuarioAuthenticatedInterface.ts index a5aa071..4689dce 100644 --- a/src/shared/interfaces/GUsuarioAuthenticatedInterface.ts +++ b/src/shared/interfaces/GUsuarioAuthenticatedInterface.ts @@ -1,5 +1,5 @@ export default interface GUsuarioAuthenticatedInterface { - usuario_id?: number; + user_id?: number; login?: string; nome?: string; email?: string; diff --git a/src/shared/services/api/Api.ts b/src/shared/services/api/Api.ts index 6250a9a..cc2660a 100644 --- a/src/shared/services/api/Api.ts +++ b/src/shared/services/api/Api.ts @@ -39,6 +39,7 @@ export default class API { ? Object.fromEntries(Object.entries(_data.body).filter(([_, v]) => v != null && v !== '')) : null; + console.log(`${this.ApiSchema.url}${this.ApiSchema.prefix}${this.ApiSchema.endpoint}`) // Realiza a requisição const response = await fetch( `${this.ApiSchema.url}${this.ApiSchema.prefix}${this.ApiSchema.endpoint}`, diff --git a/src/withClientErrorHandler/withClientErrorHandler.ts b/src/withClientErrorHandler/withClientErrorHandler.ts new file mode 100644 index 0000000..b7cb4ff --- /dev/null +++ b/src/withClientErrorHandler/withClientErrorHandler.ts @@ -0,0 +1,32 @@ +import withClientErrorHandlerInterface from "./withClientErrorHandlerInterface"; + +/** + * Códigos de erro que começam com 6, são do front entd, na ordem do alfabeto o F de frontend é a sexta letra +*/ +export function withClientErrorHandler Promise>( + action: T +) { + return async (...args: Parameters): Promise => { + + try { + + // Executa a função definida + const data = await action(...args); + + // Retorna exatamente a mesma resposta retornada pela função + return data; + + } catch (error: any) { + + // Retorna o erro de execuçãformatado + return { + status: 600, + message: error?.message || "Erro interno do servidor", + data: error + }; + + } + + }; + +} diff --git a/src/withClientErrorHandler/withClientErrorHandlerInterface.ts b/src/withClientErrorHandler/withClientErrorHandlerInterface.ts new file mode 100644 index 0000000..f27c593 --- /dev/null +++ b/src/withClientErrorHandler/withClientErrorHandlerInterface.ts @@ -0,0 +1,7 @@ +export default interface withClientErrorHandlerInterface { + + status: number; + data?: T; + message?: string; + +} \ No newline at end of file