Loading repository data…
Loading repository data…
isaias-oliveira-fullstack / repository
Este projeto foi desenvolvido para aplicar os principais conceitos de desenvolvimento de APIs REST com Express e TypeScript.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
Este projeto foi desenvolvido para aplicar os principais conceitos de desenvolvimento de APIs REST com Express e TypeScript. A aplicação realiza o gerenciamento de produtos e pedidos por meio de endpoints estruturados de acordo com as boas práticas da arquitetura REST, utilizando Query Strings para filtragem de resultados, Params para identificação de recursos específicos e Body para o recebimento de dados.
Além das operações de consulta, criação, atualização e cancelamento de recursos, a solução também utiliza middlewares para registro de logs das requisições e validação dos dados recebidos. As funcionalidades foram organizadas em routers independentes para Produtos e Pedidos, promovendo uma estrutura mais limpa, modular e de fácil manutenção.
authStore).A aplicação simula uma plataforma de e-commerce desenvolvida com Vue 3, TypeScript e Options API no frontend, integrada a um backend em Express e TypeScript por meio de uma API REST. O backend é disponibilizado através de funções serverless na Vercel, permitindo uma arquitetura leve e escalável para o gerenciamento de produtos e pedidos, seguindo boas práticas de desenvolvimento full stack e organização de aplicações web.
O projeto inclui:
frontend/src/stores/auth.ts.localStorage.api/, com lógica de rota compartilhada em src/.O authStore (frontend/src/stores/auth.ts) é a fonte única de verdade para autenticação:
export const useAuthStore = defineStore("auth", () => {
const user = ref<any>(authService.getCurrentUser());
const token = ref<string | null>(null);
const loading = ref(false);
const isAuthenticated = computed(() => user.value !== null);
const isAdmin = computed(() => user.value?.role === "ADMIN");
async function login(email: string, password: string) {
loading.value = true;
const res = authService.login(email, password);
if (res.ok) {
user.value = res.user;
token.value = "fake-token";
}
loading.value = false;
return res;
}
async function register(payload) {
loading.value = true;
const res = authService.register(payload);
if (res.ok) {
authService.login(payload.email, payload.password);
user.value = res.user;
token.value = "fake-token";
}
loading.value = false;
return res;
}
function logout() {
authService.logout();
user.value = null;
token.value = null;
}
return { user, token, loading, isAuthenticated, isAdmin, login, register, logout };
});
Todas as views acessam autenticação via useAuthStore().
Formulários de login e registro validam campos em tempo real:
Operações de autenticação e cadastro exibem feedback em tempo real:
As rotas estão definidas em frontend/src/router/index.ts.
Rotas do consumidor:
/ -> HomeView/products -> ProductsView/products/:category -> ProductsView/product/:id -> ProductDetailView/cart -> CartView/checkout -> CheckoutView/order-success -> OrderSuccessView/login -> LoginView/register -> RegisterView/profile/* -> ProfileLayout e views de perfilRotas administrativas:
/admin/dashboard/admin/products/admin/categories/admin/orders/admin/users/admin/reports/admin/settingsRota de fallback:
/:pathMatch(.*)* -> NotFoundViewA navegação é feita com router-link e componentes PrimeVue.
ConsumerLayout.vue mantém cabeçalho e carrinho visíveis entre páginas.
AdminLayout.vue apresenta menu lateral e rotas filhas para organização.
O router.beforeEach aplica proteção com base em authStore:
requiresAdmin protege /admin/*.requiresAuth protege /order-success e /profile/*.requiresCheckout impede checkout com carrinho vazio.guestOnly redireciona usuários logados de /login e /register.A área administrativa usa PrimeVue para gestão de dados:
DataTable para listagens.Breadcrumb para navegação.AdminProductsView.vue usa DataTable.AdminCategoriesView.vue, AdminOrdersView.vue e AdminUsersView.vue usam tabelas.AppBreadcrumb.vue exibe breadcrumbs dinâmicos.A API é exposta como funções serverless em api/, usando src/ para rotas, modelos e middlewares compartilhados.
api/products.ts — função serverless de produtos.api/orders.ts — função serverless de pedidos.src/routes/products.ts — rota de produtos e filtros.src/routes/orders.ts — rota de pedidos.src/middlewares/logger.ts — middleware de log.src/middlewares/validateBody.ts — validação de body.A API usa verbos HTTP para descrever operações:
GET para recuperar recursos.POST para criar pedidos.PATCH para atualizar pedidos parcialmente.DELETE para remover pedidos.Os endpoints retornam status codes semânticos como:
200 OK em requisições bem-sucedidas.201 Created em criação de recursos.400 Bad Request em dados inválidos.404 Not Found quando o recurso não existe.500 Internal Server Error em erros de servidor inesperados.GET /api/productsGET /api/products/category/:slugGET /api/products/:idGET /api/ordersGET /api/orders/:idPOST /api/ordersPATCH /api/orders/:idDELETE /api/orders/:idO frontend/src/services/productService.ts mapeia produtos da API e produtos locais:
title ou name como nome do produtothumbnailcategoryServiceexpress-typescript-rest/
├── api/
│ ├── orders.ts
│ └── products.ts
├── frontend/
│ ├── public/
│ ├── src/
│ │ ├── assets/
│ │ ├── components/
│ │ │ ├── AppBreadcrumb.vue
│ │ │ ├── EmptyCart.vue
│ │ │ └── ProductCard.vue
│ │ ├── layouts/
│ │ │ ├── AdminLayout.vue
│ │ │ ├── ConsumerLayout.vue
│ │ │ └── ProfileLayout.vue
│ │ ├── router/
│ │ │ └── index.ts
│ │ ├── services/
│ │ │ ├── authService.ts
│ │ │ ├── cartService.ts
│ │ │ ├── categoryService.ts
│ │ │ ├── favoritesService.ts
│ │ │ ├── orderService.ts
│ │ │ ├── productService.ts
│ │ │ ├── storageKeys.ts
│ │ │ └── storeSettingsService.ts
│ │ ├── stores/
│ │ │ └── auth.ts
│ │ ├── utils/
│ │ │ ├── brValidation.ts
│ │ │ ├── csv.ts
│ │ │ ├── format.ts
│ │ │ ├── orderLabels.ts
│ │ │ └── whatsapp.ts
│ │ ├── views/
│ │ │ ├── AdminCategoriesView.vue
│ │ │ ├── AdminDashboardView.vue
│ │ │ ├── AdminOrdersView.vue
│ │ │ ├── AdminProductsView.vue
│ │ │ ├── AdminReportsView.vue
│ │ │ ├── AdminSettingsView.vue
│ │ │ ├── AdminUsersView.vue
│ │ │ ├── CartView.vue
│ │ │ ├── CheckoutView.vue
│ │ │ ├── HomeView.vue
│ │ │ ├── LoginView.vue
│ │ │ ├── NotFoundView.vue
│ │ │ ├── OrderSuccessView.vue
│ │ │ ├── ProductDetailView.vue
│ │ │ ├── ProductsView.vue
│ │ │ ├── ProfileDashboardView.vue
│ │ │ ├── ProfileEditView.vue
│ │ │ ├── ProfileFavoritesView.vue
│ │ │ ├── ProfileOrdersView.vue
│ │ │ ├── ProfileTrackingView.vue
│ │ │ └── RegisterView.vue
│ │ ├── App.vue
│ │ ├── main.ts
│ │ └── style.css
│ ├── package.json
│ └── tsconfig.json
├── src/
│ ├── classes/
│ │ ├── Cart.ts
│ │ └── User.ts
│ ├── middlewares/
│ │ ├── logger.ts
│ │ └── validateBody.ts
│ ├── models/
│ │ ├── CartItem.ts
│ │ ├── Category.ts
│ │ ├── LocalCategory.ts
│ │ ├── Order.ts
│ │ ├── PaymentSettings.ts
│ │ ├── Product.ts
│ │ ├── StoreSettings.ts
│ │ └── UserRecord.ts
│ ├── routes/
│ │ ├── orders.ts
│ │ └── products.ts
│ ├── utils/
│ │ └── hashId.ts
│ └── index.ts
├── .gitignore
├── LICENSE
├── package-lock.json
├── package.json
├── README.md
└── tsconfig.json
git clone https://github.com/isaias-oliveira-fullstack/express-typescript-rest.git
cd express-typescript-rest
npm install
cd frontend
npm install
npm run build
npm start
cd frontend
npm run dev
Abra no navegador o endereço informado pelo Vite.
cd frontend
npm run build
npm run preview
Acesse a aplicação no navegador no endereço exibido pelo Vite.
(geralmente http://localhost:5173).
O projeto entrega um backend REST com tratamento de status e validações, ao mesmo tempo em que o frontend atual usa autenticação segura, categorias locais e experiência administrativa.
Se quiser contr