Skip to content

Repository files navigation

📚 Librix

Librix é um sistema web para gerenciamento de bibliotecas, com controle de usuários, livros, empréstimos, autenticação JWT, permissões granulares e área administrativa.


📌 Índice


🚀 Funcionalidades

Implementadas no estado atual

  • Login com JWT (/auth/sign-in)
  • Recuperação de senha com token (/auth/forgot-password, /auth/reset-password/:token, /auth/reset-password)
  • Ativação de conta por convite (/users/activate_account)
  • Dashboard/Home com indicadores e atalhos
  • Catálogo público de livros
  • Detalhes de livro
  • Gestão de livros (CRUD administrativo)
  • Upload de capa de livro
  • Gestão de usuários (CRUD administrativo)
  • Edição de perfil do usuário e troca de senha
  • Empréstimos (criação, devolução, edição e exclusão)
  • Histórico de empréstimos (com paginação e status)
  • Autocompletes (autores, editoras, tags, livros disponíveis e todos os livros)
  • Controle de permissões por feature flag
  • Rotas protegidas para autenticação e autorização
  • Layout público e layout administrativo responsivos

Em progresso ou parcialmente disponível

  • Área de favoritos (página existente, sem persistência no backend)
  • Relatórios administrativos: endpoint /reports/dashboard implementado e rota administrativa disponível
  • Cadastro aberto (/register) usa atualmente o fluxo de ativação por convite

🧰 Tecnologias Utilizadas

Frontend

  • React 19
  • TypeScript
  • React Router DOM v7
  • SCSS Modules
  • Lucide React
  • Vite

Backend

  • Node.js
  • Express 5
  • TypeScript
  • Sequelize ORM
  • JWT (jsonwebtoken)
  • Zod (validação)
  • Multer (uploads)
  • Resend (e-mail)

Banco de dados

  • PostgreSQL

Outros

  • Docker
  • Docker Compose
  • ESLint
  • npm Workspaces (monorepo)

🗂 Estrutura do Projeto

librix/
├── apps/
│ ├── api/ # Backend (Express + Sequelize)
│ │ ├── src/
│ │ │ ├── controllers/ # Regras de negócio e endpoints
│ │ │ ├── database/ # Modelos e conexão Sequelize
│ │ │ ├── http/ # App Express e rotas
│ │ │ ├── middleware/ # Auth, validação de body, upload
│ │ │ └── schemas/ # Schemas Zod
│ │ └── thumbnails/ # Uploads de capas no backend
│ └── web/ # Frontend (React + Vite)
│ └── src/
│ ├── components/ # Componentes reutilizáveis
│ ├── contexts/ # Context API (usuário)
│ ├── layouts/ # Layout público e administrativo
│ ├── pages/ # Páginas públicas, privadas e admin
│ └── styles/ # Variáveis e estilos globais
├── migrations/ # Migrations Sequelize (monorepo root)
└── packages/
├── flags/ # Bitflags de permissões
└── types/ # Tipos compartilhados entre apps

✅ Pré-requisitos

  • Node.js 20+
  • npm 10+
  • PostgreSQL 14+ (local) ou Docker + Docker Compose
  • Git

Opcional:

  • VS Code com extensões de TypeScript/ESLint/SCSS

📥 Clonando o Projeto

git clone https://github.com/jvopinho/librix.git
cd librix

📦 Instalando as Dependências

Este projeto é um monorepo com npm workspaces.

npm install

Isso instala as dependências de:

  • apps/api
  • apps/web
  • packages/flags
  • packages/types

⚙️ Configuração do Ambiente

Backend

Arquivo: apps/api/.env

Você pode copiar de apps/api/.env.example:

cp apps/api/.env.example apps/api/.env

Exemplo completo:

PORT=3001POSTGRES_USER=postgresPOSTGRES_PASSWORD=passwordPOSTGRES_DB=postgresPOSTGRES_PORT=5432POSTGRES_ENDPOINT=localhost:5432RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxJWT_SESSION_SECRET=supersecretkeyJWT_FIRST_ACCESS_SECRET=supersecretkeyPASSWORD_SALT_ROUNDS=10WEB_URL=http://localhost:5173

Significado das variáveis

  • PORT: porta lógica da API (observação: atualmente o servidor inicia fixo em 7654 no código)
  • POSTGRES_USER: usuário do banco PostgreSQL
  • POSTGRES_PASSWORD: senha do banco PostgreSQL
  • POSTGRES_DB: nome do banco
  • POSTGRES_PORT: porta do PostgreSQL
  • POSTGRES_ENDPOINT: host:porta do PostgreSQL
  • RESEND_API_KEY: chave da API de envio de e-mails (ativação e recuperação)
  • JWT_SESSION_SECRET: segredo para token de sessão
  • JWT_FIRST_ACCESS_SECRET: segredo adicional de primeiro acesso
  • PASSWORD_SALT_ROUNDS: custo do hash bcrypt
  • WEB_URL: URL da aplicação frontend para CORS e links de e-mail

Frontend

Arquivo: apps/web/.env (opcional)

VITE_API_URL=http://localhost:7654

Significado

  • VITE_API_URL: base URL da API consumida no frontend.
  • Se não for definido, o frontend usa http://localhost:7654 por padrão.

🗄 Banco de Dados

1) Criar banco via Docker (recomendado para dev)

npm run compose:dev:up

Comando acima sobe o PostgreSQL com base no arquivo docker-compose.dev.yml e no .env do backend.

2) Rodar migrations

npm run db:migrate --workspace @librix/api

3) Gerar nova migration

Há script no backend, mas em ambiente de shell o fluxo mais previsível é:

cd apps/api
npx dotenv -e .env -- sequelize-cli migration:generate --name nome_da_migration

4) Atualizar schema com novas migrations

npm run db:migrate --workspace @librix/api

5) Resetar banco (desenvolvimento)

cd apps/api
npx dotenv -e .env -- sequelize-cli db:migrate:undo:all
npx dotenv -e .env -- sequelize-cli db:migrate

6) Seed

Atualmente não há script de seed versionado no projeto.

  • Para popular dados, use os endpoints administrativos após autenticação.

▶️ Rodando o Projeto

Backend

npm run dev --workspace @librix/api
  • API disponível em: http://localhost:7654

Frontend

npm run dev --workspace @librix/web
  • Frontend disponível em: http://localhost:5173 (padrão Vite)

👤 Usuário Administrador

O usuário administrador possui id 1, quando a api iniciar ela verifica se existe o usuário cadastrado, caso não possua ela irá criar e em seguida enviar o login e senha no terminal.


📜 Scripts Disponíveis

EscopoScriptComandoDescrição
rootcompose:dev:upnpm run compose:dev:upSobe PostgreSQL via Docker Compose
rootcompose:dev:startnpm run compose:dev:startInicia containers já criados
apidevnpm run dev --workspace @librix/apiDesenvolvimento backend com watch
apibuildnpm run build --workspace @librix/apiBuild TypeScript backend
apistartnpm run start --workspace @librix/apiInicia backend compilado
apidb:migratenpm run db:migrate --workspace @librix/apiExecuta migrations
apidb:generatenpm run db:generate --workspace @librix/apiGera migration (depende do shell)
webdevnpm run dev --workspace @librix/webDesenvolvimento frontend
webbuildnpm run build --workspace @librix/webBuild frontend
webpreviewnpm run preview --workspace @librix/webPreview do build frontend
weblintnpm run lint --workspace @librix/webLint frontend
flagsbuildnpm run build --workspace @librix/flagsBuild do pacote de permissões

🔄 Fluxo da Aplicação

Usuário
↓
Login / Ativação de Conta
↓
Autenticação (JWT)
↓
Resolução de Permissões (feature flags)
↓
Dashboard / Home
↓
Operações (livros, usuários, empréstimos, administração)

🔐 Controle de Permissões

O sistema usa feature flags com bitfield em @librix/flags.

Administrador

Pode:

  • gerenciar usuários
  • gerenciar livros
  • gerenciar empréstimos
  • acessar relatórios
  • acessar dashboard administrativo

Bibliotecário / Gestor (perfil intermediário)

Pode:

  • gerenciar livros
  • gerenciar empréstimos
  • visualizar/editar usuários (conforme features atribuídas)

Leitor

Pode:

  • visualizar catálogo
  • visualizar detalhes de livros
  • visualizar próprios empréstimos
  • realizar operações restritas ao próprio contexto (dependendo das features)

Observação importante:

  • permissões efetivas dependem das features atribuídas ao usuário na base.

🧭 Rotas Principais

Públicas

/
/home
/books
/books/:id
/login
/register
/forgot-password
/reset-password/:token
/activate-account
/users/activate
/users/activate/invalid

Protegidas (usuário autenticado)

/profile
/my-loans
/favorites

Administrativas

/admin
/admin/dashboard
/admin/books
/admin/books/create
/admin/books/new
/admin/books/edit/:id
/admin/users
/admin/loans
/admin/loans/new
---- NÃO IMPLEMENTADAS ----
/admin/authors
/admin/publishers
/admin/categories
/admin/reports
/admin/settings

Observação:

  • algumas rotas administrativas apontam para páginas placeholder no frontend.

🌐 API

Base local padrão:

  • http://localhost:7654

Documentação Swagger local:

  • http://localhost:7654/api-docs
  • http://localhost:7654/swagger.json

Frontend consome API via helper (getApiUrl) em:

  • apps/web/src/helpers/api-url.ts

🖼 Uploads

  • Armazenamento local em: apps/api/thumbnails
  • Servido estaticamente em: GET /thumbnails/:filename
  • Middleware: Multer (apps/api/src/middleware/upload-middleware.ts)
  • Nome do arquivo: hash aleatório + extensão original

Limites e formatos

  • Não há limite de tamanho configurado atualmente no Multer.
  • Não há validação explícita de MIME type/extensão no backend atual.

Recomendação para produção:

  • adicionar limite de tamanho
  • validar MIME type
  • mover armazenamento para bucket (S3, GCS, etc.)

🔑 Recuperação de Senha

Fluxo implementado:

  1. Solicitar recuperação: POST /auth/forgot-password
  2. API gera token e envia e-mail via Resend
  3. Frontend valida token: GET /auth/reset-password/:token
  4. Frontend envia nova senha: POST /auth/reset-password

📄 Paginação

Padrão implementado em endpoints list:

GET /books/all?page=1&limit=20GET /users?page=1&limit=10GET /loans?page=1&limit=10GET /loans/my-loans?page=1&limit=10

Resposta segue formato semelhante:

{
"data": [],
"page": 1,
"limit": 10,
"total": 0,
"totalPages": 0
}

🔎 Busca

Exemplos reais:

GET /books/all?search=harryGET /users?search=joaoGET /loans?search=maria

🧪 Filtros

Exemplos disponíveis hoje:

GET /books/all?author=MachadoGET /books/all?category=RomanceGET /books/all?isbn=978GET /books/all?availability=trueGET /users?status=ACTIVEGET /loans?status=BORROWEDGET /loans?status=LATEGET /loans?status=RETURNED

Ordenação também disponível em listagens:

GET /books/all?sortBy=title&sortOrder=ASCGET /users?sortBy=name&sortOrder=DESC

🛠 Desenvolvimento

Fluxo recomendado para contribuição:

  1. Criar branch de feature:
git checkout -b feat/nome-da-feature
  1. Implementar alterações
  2. Rodar lint/build localmente
  3. Commitar com mensagens claras
  4. Abrir Pull Request com contexto e evidências

Exemplo de verificação local:

npm run lint --workspace @librix/web
npm run build --workspace @librix/api
npm run build --workspace @librix/web

📐 Boas Práticas

  • TypeScript em frontend e backend
  • SCSS Modules para isolamento de estilos
  • Componentização de UI
  • Uso de hooks para estado/contexto
  • Organização por domínio (controllers, pages, components)
  • Validação de entrada com Zod
  • Linting com ESLint

Observação:

  • ainda existem pontos do frontend/backend com any que podem ser gradualmente eliminados.

📄 Licença

Projeto licenciado sob MIT.

Consulte o arquivo LICENSE na raiz para o texto completo.


📬 Contato

Responsável atual pelo repositório:

  • João Pinho — jvopinho.contato@gmail.com

Repositório:

About

📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - jvopinho/Librix: 📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP · GitHub
Skip to content

Repository files navigation

📚 Librix

Librix é um sistema web para gerenciamento de bibliotecas, com controle de usuários, livros, empréstimos, autenticação JWT, permissões granulares e área administrativa.


📌 Índice


🚀 Funcionalidades

Implementadas no estado atual

  • Login com JWT (/auth/sign-in)
  • Recuperação de senha com token (/auth/forgot-password, /auth/reset-password/:token, /auth/reset-password)
  • Ativação de conta por convite (/users/activate_account)
  • Dashboard/Home com indicadores e atalhos
  • Catálogo público de livros
  • Detalhes de livro
  • Gestão de livros (CRUD administrativo)
  • Upload de capa de livro
  • Gestão de usuários (CRUD administrativo)
  • Edição de perfil do usuário e troca de senha
  • Empréstimos (criação, devolução, edição e exclusão)
  • Histórico de empréstimos (com paginação e status)
  • Autocompletes (autores, editoras, tags, livros disponíveis e todos os livros)
  • Controle de permissões por feature flag
  • Rotas protegidas para autenticação e autorização
  • Layout público e layout administrativo responsivos

Em progresso ou parcialmente disponível

  • Área de favoritos (página existente, sem persistência no backend)
  • Relatórios administrativos: endpoint /reports/dashboard implementado e rota administrativa disponível
  • Cadastro aberto (/register) usa atualmente o fluxo de ativação por convite

🧰 Tecnologias Utilizadas

Frontend

  • React 19
  • TypeScript
  • React Router DOM v7
  • SCSS Modules
  • Lucide React
  • Vite

Backend

  • Node.js
  • Express 5
  • TypeScript
  • Sequelize ORM
  • JWT (jsonwebtoken)
  • Zod (validação)
  • Multer (uploads)
  • Resend (e-mail)

Banco de dados

  • PostgreSQL

Outros

  • Docker
  • Docker Compose
  • ESLint
  • npm Workspaces (monorepo)

🗂 Estrutura do Projeto

librix/
├── apps/
│ ├── api/ # Backend (Express + Sequelize)
│ │ ├── src/
│ │ │ ├── controllers/ # Regras de negócio e endpoints
│ │ │ ├── database/ # Modelos e conexão Sequelize
│ │ │ ├── http/ # App Express e rotas
│ │ │ ├── middleware/ # Auth, validação de body, upload
│ │ │ └── schemas/ # Schemas Zod
│ │ └── thumbnails/ # Uploads de capas no backend
│ └── web/ # Frontend (React + Vite)
│ └── src/
│ ├── components/ # Componentes reutilizáveis
│ ├── contexts/ # Context API (usuário)
│ ├── layouts/ # Layout público e administrativo
│ ├── pages/ # Páginas públicas, privadas e admin
│ └── styles/ # Variáveis e estilos globais
├── migrations/ # Migrations Sequelize (monorepo root)
└── packages/
├── flags/ # Bitflags de permissões
└── types/ # Tipos compartilhados entre apps

✅ Pré-requisitos

  • Node.js 20+
  • npm 10+
  • PostgreSQL 14+ (local) ou Docker + Docker Compose
  • Git

Opcional:

  • VS Code com extensões de TypeScript/ESLint/SCSS

📥 Clonando o Projeto

git clone https://github.com/jvopinho/librix.git
cd librix

📦 Instalando as Dependências

Este projeto é um monorepo com npm workspaces.

npm install

Isso instala as dependências de:

  • apps/api
  • apps/web
  • packages/flags
  • packages/types

⚙️ Configuração do Ambiente

Backend

Arquivo: apps/api/.env

Você pode copiar de apps/api/.env.example:

cp apps/api/.env.example apps/api/.env

Exemplo completo:

PORT=3001POSTGRES_USER=postgresPOSTGRES_PASSWORD=passwordPOSTGRES_DB=postgresPOSTGRES_PORT=5432POSTGRES_ENDPOINT=localhost:5432RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxJWT_SESSION_SECRET=supersecretkeyJWT_FIRST_ACCESS_SECRET=supersecretkeyPASSWORD_SALT_ROUNDS=10WEB_URL=http://localhost:5173

Significado das variáveis

  • PORT: porta lógica da API (observação: atualmente o servidor inicia fixo em 7654 no código)
  • POSTGRES_USER: usuário do banco PostgreSQL
  • POSTGRES_PASSWORD: senha do banco PostgreSQL
  • POSTGRES_DB: nome do banco
  • POSTGRES_PORT: porta do PostgreSQL
  • POSTGRES_ENDPOINT: host:porta do PostgreSQL
  • RESEND_API_KEY: chave da API de envio de e-mails (ativação e recuperação)
  • JWT_SESSION_SECRET: segredo para token de sessão
  • JWT_FIRST_ACCESS_SECRET: segredo adicional de primeiro acesso
  • PASSWORD_SALT_ROUNDS: custo do hash bcrypt
  • WEB_URL: URL da aplicação frontend para CORS e links de e-mail

Frontend

Arquivo: apps/web/.env (opcional)

VITE_API_URL=http://localhost:7654

Significado

  • VITE_API_URL: base URL da API consumida no frontend.
  • Se não for definido, o frontend usa http://localhost:7654 por padrão.

🗄 Banco de Dados

1) Criar banco via Docker (recomendado para dev)

npm run compose:dev:up

Comando acima sobe o PostgreSQL com base no arquivo docker-compose.dev.yml e no .env do backend.

2) Rodar migrations

npm run db:migrate --workspace @librix/api

3) Gerar nova migration

Há script no backend, mas em ambiente de shell o fluxo mais previsível é:

cd apps/api
npx dotenv -e .env -- sequelize-cli migration:generate --name nome_da_migration

4) Atualizar schema com novas migrations

npm run db:migrate --workspace @librix/api

5) Resetar banco (desenvolvimento)

cd apps/api
npx dotenv -e .env -- sequelize-cli db:migrate:undo:all
npx dotenv -e .env -- sequelize-cli db:migrate

6) Seed

Atualmente não há script de seed versionado no projeto.

  • Para popular dados, use os endpoints administrativos após autenticação.

▶️ Rodando o Projeto

Backend

npm run dev --workspace @librix/api
  • API disponível em: http://localhost:7654

Frontend

npm run dev --workspace @librix/web
  • Frontend disponível em: http://localhost:5173 (padrão Vite)

👤 Usuário Administrador

O usuário administrador possui id 1, quando a api iniciar ela verifica se existe o usuário cadastrado, caso não possua ela irá criar e em seguida enviar o login e senha no terminal.


📜 Scripts Disponíveis

EscopoScriptComandoDescrição
rootcompose:dev:upnpm run compose:dev:upSobe PostgreSQL via Docker Compose
rootcompose:dev:startnpm run compose:dev:startInicia containers já criados
apidevnpm run dev --workspace @librix/apiDesenvolvimento backend com watch
apibuildnpm run build --workspace @librix/apiBuild TypeScript backend
apistartnpm run start --workspace @librix/apiInicia backend compilado
apidb:migratenpm run db:migrate --workspace @librix/apiExecuta migrations
apidb:generatenpm run db:generate --workspace @librix/apiGera migration (depende do shell)
webdevnpm run dev --workspace @librix/webDesenvolvimento frontend
webbuildnpm run build --workspace @librix/webBuild frontend
webpreviewnpm run preview --workspace @librix/webPreview do build frontend
weblintnpm run lint --workspace @librix/webLint frontend
flagsbuildnpm run build --workspace @librix/flagsBuild do pacote de permissões

🔄 Fluxo da Aplicação

Usuário
↓
Login / Ativação de Conta
↓
Autenticação (JWT)
↓
Resolução de Permissões (feature flags)
↓
Dashboard / Home
↓
Operações (livros, usuários, empréstimos, administração)

🔐 Controle de Permissões

O sistema usa feature flags com bitfield em @librix/flags.

Administrador

Pode:

  • gerenciar usuários
  • gerenciar livros
  • gerenciar empréstimos
  • acessar relatórios
  • acessar dashboard administrativo

Bibliotecário / Gestor (perfil intermediário)

Pode:

  • gerenciar livros
  • gerenciar empréstimos
  • visualizar/editar usuários (conforme features atribuídas)

Leitor

Pode:

  • visualizar catálogo
  • visualizar detalhes de livros
  • visualizar próprios empréstimos
  • realizar operações restritas ao próprio contexto (dependendo das features)

Observação importante:

  • permissões efetivas dependem das features atribuídas ao usuário na base.

🧭 Rotas Principais

Públicas

/
/home
/books
/books/:id
/login
/register
/forgot-password
/reset-password/:token
/activate-account
/users/activate
/users/activate/invalid

Protegidas (usuário autenticado)

/profile
/my-loans
/favorites

Administrativas

/admin
/admin/dashboard
/admin/books
/admin/books/create
/admin/books/new
/admin/books/edit/:id
/admin/users
/admin/loans
/admin/loans/new
---- NÃO IMPLEMENTADAS ----
/admin/authors
/admin/publishers
/admin/categories
/admin/reports
/admin/settings

Observação:

  • algumas rotas administrativas apontam para páginas placeholder no frontend.

🌐 API

Base local padrão:

  • http://localhost:7654

Documentação Swagger local:

  • http://localhost:7654/api-docs
  • http://localhost:7654/swagger.json

Frontend consome API via helper (getApiUrl) em:

  • apps/web/src/helpers/api-url.ts

🖼 Uploads

  • Armazenamento local em: apps/api/thumbnails
  • Servido estaticamente em: GET /thumbnails/:filename
  • Middleware: Multer (apps/api/src/middleware/upload-middleware.ts)
  • Nome do arquivo: hash aleatório + extensão original

Limites e formatos

  • Não há limite de tamanho configurado atualmente no Multer.
  • Não há validação explícita de MIME type/extensão no backend atual.

Recomendação para produção:

  • adicionar limite de tamanho
  • validar MIME type
  • mover armazenamento para bucket (S3, GCS, etc.)

🔑 Recuperação de Senha

Fluxo implementado:

  1. Solicitar recuperação: POST /auth/forgot-password
  2. API gera token e envia e-mail via Resend
  3. Frontend valida token: GET /auth/reset-password/:token
  4. Frontend envia nova senha: POST /auth/reset-password

📄 Paginação

Padrão implementado em endpoints list:

GET /books/all?page=1&limit=20GET /users?page=1&limit=10GET /loans?page=1&limit=10GET /loans/my-loans?page=1&limit=10

Resposta segue formato semelhante:

{
"data": [],
"page": 1,
"limit": 10,
"total": 0,
"totalPages": 0
}

🔎 Busca

Exemplos reais:

GET /books/all?search=harryGET /users?search=joaoGET /loans?search=maria

🧪 Filtros

Exemplos disponíveis hoje:

GET /books/all?author=MachadoGET /books/all?category=RomanceGET /books/all?isbn=978GET /books/all?availability=trueGET /users?status=ACTIVEGET /loans?status=BORROWEDGET /loans?status=LATEGET /loans?status=RETURNED

Ordenação também disponível em listagens:

GET /books/all?sortBy=title&sortOrder=ASCGET /users?sortBy=name&sortOrder=DESC

🛠 Desenvolvimento

Fluxo recomendado para contribuição:

  1. Criar branch de feature:
git checkout -b feat/nome-da-feature
  1. Implementar alterações
  2. Rodar lint/build localmente
  3. Commitar com mensagens claras
  4. Abrir Pull Request com contexto e evidências

Exemplo de verificação local:

npm run lint --workspace @librix/web
npm run build --workspace @librix/api
npm run build --workspace @librix/web

📐 Boas Práticas

  • TypeScript em frontend e backend
  • SCSS Modules para isolamento de estilos
  • Componentização de UI
  • Uso de hooks para estado/contexto
  • Organização por domínio (controllers, pages, components)
  • Validação de entrada com Zod
  • Linting com ESLint

Observação:

  • ainda existem pontos do frontend/backend com any que podem ser gradualmente eliminados.

📄 Licença

Projeto licenciado sob MIT.

Consulte o arquivo LICENSE na raiz para o texto completo.


📬 Contato

Responsável atual pelo repositório:

  • João Pinho — jvopinho.contato@gmail.com

Repositório:

About

📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - jvopinho/Librix: 📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP · GitHub
Skip to content

Repository files navigation

📚 Librix

Librix é um sistema web para gerenciamento de bibliotecas, com controle de usuários, livros, empréstimos, autenticação JWT, permissões granulares e área administrativa.


📌 Índice


🚀 Funcionalidades

Implementadas no estado atual

  • Login com JWT (/auth/sign-in)
  • Recuperação de senha com token (/auth/forgot-password, /auth/reset-password/:token, /auth/reset-password)
  • Ativação de conta por convite (/users/activate_account)
  • Dashboard/Home com indicadores e atalhos
  • Catálogo público de livros
  • Detalhes de livro
  • Gestão de livros (CRUD administrativo)
  • Upload de capa de livro
  • Gestão de usuários (CRUD administrativo)
  • Edição de perfil do usuário e troca de senha
  • Empréstimos (criação, devolução, edição e exclusão)
  • Histórico de empréstimos (com paginação e status)
  • Autocompletes (autores, editoras, tags, livros disponíveis e todos os livros)
  • Controle de permissões por feature flag
  • Rotas protegidas para autenticação e autorização
  • Layout público e layout administrativo responsivos

Em progresso ou parcialmente disponível

  • Área de favoritos (página existente, sem persistência no backend)
  • Relatórios administrativos: endpoint /reports/dashboard implementado e rota administrativa disponível
  • Cadastro aberto (/register) usa atualmente o fluxo de ativação por convite

🧰 Tecnologias Utilizadas

Frontend

  • React 19
  • TypeScript
  • React Router DOM v7
  • SCSS Modules
  • Lucide React
  • Vite

Backend

  • Node.js
  • Express 5
  • TypeScript
  • Sequelize ORM
  • JWT (jsonwebtoken)
  • Zod (validação)
  • Multer (uploads)
  • Resend (e-mail)

Banco de dados

  • PostgreSQL

Outros

  • Docker
  • Docker Compose
  • ESLint
  • npm Workspaces (monorepo)

🗂 Estrutura do Projeto

librix/
├── apps/
│ ├── api/ # Backend (Express + Sequelize)
│ │ ├── src/
│ │ │ ├── controllers/ # Regras de negócio e endpoints
│ │ │ ├── database/ # Modelos e conexão Sequelize
│ │ │ ├── http/ # App Express e rotas
│ │ │ ├── middleware/ # Auth, validação de body, upload
│ │ │ └── schemas/ # Schemas Zod
│ │ └── thumbnails/ # Uploads de capas no backend
│ └── web/ # Frontend (React + Vite)
│ └── src/
│ ├── components/ # Componentes reutilizáveis
│ ├── contexts/ # Context API (usuário)
│ ├── layouts/ # Layout público e administrativo
│ ├── pages/ # Páginas públicas, privadas e admin
│ └── styles/ # Variáveis e estilos globais
├── migrations/ # Migrations Sequelize (monorepo root)
└── packages/
├── flags/ # Bitflags de permissões
└── types/ # Tipos compartilhados entre apps

✅ Pré-requisitos

  • Node.js 20+
  • npm 10+
  • PostgreSQL 14+ (local) ou Docker + Docker Compose
  • Git

Opcional:

  • VS Code com extensões de TypeScript/ESLint/SCSS

📥 Clonando o Projeto

git clone https://github.com/jvopinho/librix.git
cd librix

📦 Instalando as Dependências

Este projeto é um monorepo com npm workspaces.

npm install

Isso instala as dependências de:

  • apps/api
  • apps/web
  • packages/flags
  • packages/types

⚙️ Configuração do Ambiente

Backend

Arquivo: apps/api/.env

Você pode copiar de apps/api/.env.example:

cp apps/api/.env.example apps/api/.env

Exemplo completo:

PORT=3001POSTGRES_USER=postgresPOSTGRES_PASSWORD=passwordPOSTGRES_DB=postgresPOSTGRES_PORT=5432POSTGRES_ENDPOINT=localhost:5432RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxJWT_SESSION_SECRET=supersecretkeyJWT_FIRST_ACCESS_SECRET=supersecretkeyPASSWORD_SALT_ROUNDS=10WEB_URL=http://localhost:5173

Significado das variáveis

  • PORT: porta lógica da API (observação: atualmente o servidor inicia fixo em 7654 no código)
  • POSTGRES_USER: usuário do banco PostgreSQL
  • POSTGRES_PASSWORD: senha do banco PostgreSQL
  • POSTGRES_DB: nome do banco
  • POSTGRES_PORT: porta do PostgreSQL
  • POSTGRES_ENDPOINT: host:porta do PostgreSQL
  • RESEND_API_KEY: chave da API de envio de e-mails (ativação e recuperação)
  • JWT_SESSION_SECRET: segredo para token de sessão
  • JWT_FIRST_ACCESS_SECRET: segredo adicional de primeiro acesso
  • PASSWORD_SALT_ROUNDS: custo do hash bcrypt
  • WEB_URL: URL da aplicação frontend para CORS e links de e-mail

Frontend

Arquivo: apps/web/.env (opcional)

VITE_API_URL=http://localhost:7654

Significado

  • VITE_API_URL: base URL da API consumida no frontend.
  • Se não for definido, o frontend usa http://localhost:7654 por padrão.

🗄 Banco de Dados

1) Criar banco via Docker (recomendado para dev)

npm run compose:dev:up

Comando acima sobe o PostgreSQL com base no arquivo docker-compose.dev.yml e no .env do backend.

2) Rodar migrations

npm run db:migrate --workspace @librix/api

3) Gerar nova migration

Há script no backend, mas em ambiente de shell o fluxo mais previsível é:

cd apps/api
npx dotenv -e .env -- sequelize-cli migration:generate --name nome_da_migration

4) Atualizar schema com novas migrations

npm run db:migrate --workspace @librix/api

5) Resetar banco (desenvolvimento)

cd apps/api
npx dotenv -e .env -- sequelize-cli db:migrate:undo:all
npx dotenv -e .env -- sequelize-cli db:migrate

6) Seed

Atualmente não há script de seed versionado no projeto.

  • Para popular dados, use os endpoints administrativos após autenticação.

▶️ Rodando o Projeto

Backend

npm run dev --workspace @librix/api
  • API disponível em: http://localhost:7654

Frontend

npm run dev --workspace @librix/web
  • Frontend disponível em: http://localhost:5173 (padrão Vite)

👤 Usuário Administrador

O usuário administrador possui id 1, quando a api iniciar ela verifica se existe o usuário cadastrado, caso não possua ela irá criar e em seguida enviar o login e senha no terminal.


📜 Scripts Disponíveis

EscopoScriptComandoDescrição
rootcompose:dev:upnpm run compose:dev:upSobe PostgreSQL via Docker Compose
rootcompose:dev:startnpm run compose:dev:startInicia containers já criados
apidevnpm run dev --workspace @librix/apiDesenvolvimento backend com watch
apibuildnpm run build --workspace @librix/apiBuild TypeScript backend
apistartnpm run start --workspace @librix/apiInicia backend compilado
apidb:migratenpm run db:migrate --workspace @librix/apiExecuta migrations
apidb:generatenpm run db:generate --workspace @librix/apiGera migration (depende do shell)
webdevnpm run dev --workspace @librix/webDesenvolvimento frontend
webbuildnpm run build --workspace @librix/webBuild frontend
webpreviewnpm run preview --workspace @librix/webPreview do build frontend
weblintnpm run lint --workspace @librix/webLint frontend
flagsbuildnpm run build --workspace @librix/flagsBuild do pacote de permissões

🔄 Fluxo da Aplicação

Usuário
↓
Login / Ativação de Conta
↓
Autenticação (JWT)
↓
Resolução de Permissões (feature flags)
↓
Dashboard / Home
↓
Operações (livros, usuários, empréstimos, administração)

🔐 Controle de Permissões

O sistema usa feature flags com bitfield em @librix/flags.

Administrador

Pode:

  • gerenciar usuários
  • gerenciar livros
  • gerenciar empréstimos
  • acessar relatórios
  • acessar dashboard administrativo

Bibliotecário / Gestor (perfil intermediário)

Pode:

  • gerenciar livros
  • gerenciar empréstimos
  • visualizar/editar usuários (conforme features atribuídas)

Leitor

Pode:

  • visualizar catálogo
  • visualizar detalhes de livros
  • visualizar próprios empréstimos
  • realizar operações restritas ao próprio contexto (dependendo das features)

Observação importante:

  • permissões efetivas dependem das features atribuídas ao usuário na base.

🧭 Rotas Principais

Públicas

/
/home
/books
/books/:id
/login
/register
/forgot-password
/reset-password/:token
/activate-account
/users/activate
/users/activate/invalid

Protegidas (usuário autenticado)

/profile
/my-loans
/favorites

Administrativas

/admin
/admin/dashboard
/admin/books
/admin/books/create
/admin/books/new
/admin/books/edit/:id
/admin/users
/admin/loans
/admin/loans/new
---- NÃO IMPLEMENTADAS ----
/admin/authors
/admin/publishers
/admin/categories
/admin/reports
/admin/settings

Observação:

  • algumas rotas administrativas apontam para páginas placeholder no frontend.

🌐 API

Base local padrão:

  • http://localhost:7654

Documentação Swagger local:

  • http://localhost:7654/api-docs
  • http://localhost:7654/swagger.json

Frontend consome API via helper (getApiUrl) em:

  • apps/web/src/helpers/api-url.ts

🖼 Uploads

  • Armazenamento local em: apps/api/thumbnails
  • Servido estaticamente em: GET /thumbnails/:filename
  • Middleware: Multer (apps/api/src/middleware/upload-middleware.ts)
  • Nome do arquivo: hash aleatório + extensão original

Limites e formatos

  • Não há limite de tamanho configurado atualmente no Multer.
  • Não há validação explícita de MIME type/extensão no backend atual.

Recomendação para produção:

  • adicionar limite de tamanho
  • validar MIME type
  • mover armazenamento para bucket (S3, GCS, etc.)

🔑 Recuperação de Senha

Fluxo implementado:

  1. Solicitar recuperação: POST /auth/forgot-password
  2. API gera token e envia e-mail via Resend
  3. Frontend valida token: GET /auth/reset-password/:token
  4. Frontend envia nova senha: POST /auth/reset-password

📄 Paginação

Padrão implementado em endpoints list:

GET /books/all?page=1&limit=20GET /users?page=1&limit=10GET /loans?page=1&limit=10GET /loans/my-loans?page=1&limit=10

Resposta segue formato semelhante:

{
"data": [],
"page": 1,
"limit": 10,
"total": 0,
"totalPages": 0
}

🔎 Busca

Exemplos reais:

GET /books/all?search=harryGET /users?search=joaoGET /loans?search=maria

🧪 Filtros

Exemplos disponíveis hoje:

GET /books/all?author=MachadoGET /books/all?category=RomanceGET /books/all?isbn=978GET /books/all?availability=trueGET /users?status=ACTIVEGET /loans?status=BORROWEDGET /loans?status=LATEGET /loans?status=RETURNED

Ordenação também disponível em listagens:

GET /books/all?sortBy=title&sortOrder=ASCGET /users?sortBy=name&sortOrder=DESC

🛠 Desenvolvimento

Fluxo recomendado para contribuição:

  1. Criar branch de feature:
git checkout -b feat/nome-da-feature
  1. Implementar alterações
  2. Rodar lint/build localmente
  3. Commitar com mensagens claras
  4. Abrir Pull Request com contexto e evidências

Exemplo de verificação local:

npm run lint --workspace @librix/web
npm run build --workspace @librix/api
npm run build --workspace @librix/web

📐 Boas Práticas

  • TypeScript em frontend e backend
  • SCSS Modules para isolamento de estilos
  • Componentização de UI
  • Uso de hooks para estado/contexto
  • Organização por domínio (controllers, pages, components)
  • Validação de entrada com Zod
  • Linting com ESLint

Observação:

  • ainda existem pontos do frontend/backend com any que podem ser gradualmente eliminados.

📄 Licença

Projeto licenciado sob MIT.

Consulte o arquivo LICENSE na raiz para o texto completo.


📬 Contato

Responsável atual pelo repositório:

  • João Pinho — jvopinho.contato@gmail.com

Repositório:

About

📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - jvopinho/Librix: 📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP · GitHub
Skip to content

Repository files navigation

📚 Librix

Librix é um sistema web para gerenciamento de bibliotecas, com controle de usuários, livros, empréstimos, autenticação JWT, permissões granulares e área administrativa.


📌 Índice


🚀 Funcionalidades

Implementadas no estado atual

  • Login com JWT (/auth/sign-in)
  • Recuperação de senha com token (/auth/forgot-password, /auth/reset-password/:token, /auth/reset-password)
  • Ativação de conta por convite (/users/activate_account)
  • Dashboard/Home com indicadores e atalhos
  • Catálogo público de livros
  • Detalhes de livro
  • Gestão de livros (CRUD administrativo)
  • Upload de capa de livro
  • Gestão de usuários (CRUD administrativo)
  • Edição de perfil do usuário e troca de senha
  • Empréstimos (criação, devolução, edição e exclusão)
  • Histórico de empréstimos (com paginação e status)
  • Autocompletes (autores, editoras, tags, livros disponíveis e todos os livros)
  • Controle de permissões por feature flag
  • Rotas protegidas para autenticação e autorização
  • Layout público e layout administrativo responsivos

Em progresso ou parcialmente disponível

  • Área de favoritos (página existente, sem persistência no backend)
  • Relatórios administrativos: endpoint /reports/dashboard implementado e rota administrativa disponível
  • Cadastro aberto (/register) usa atualmente o fluxo de ativação por convite

🧰 Tecnologias Utilizadas

Frontend

  • React 19
  • TypeScript
  • React Router DOM v7
  • SCSS Modules
  • Lucide React
  • Vite

Backend

  • Node.js
  • Express 5
  • TypeScript
  • Sequelize ORM
  • JWT (jsonwebtoken)
  • Zod (validação)
  • Multer (uploads)
  • Resend (e-mail)

Banco de dados

  • PostgreSQL

Outros

  • Docker
  • Docker Compose
  • ESLint
  • npm Workspaces (monorepo)

🗂 Estrutura do Projeto

librix/
├── apps/
│ ├── api/ # Backend (Express + Sequelize)
│ │ ├── src/
│ │ │ ├── controllers/ # Regras de negócio e endpoints
│ │ │ ├── database/ # Modelos e conexão Sequelize
│ │ │ ├── http/ # App Express e rotas
│ │ │ ├── middleware/ # Auth, validação de body, upload
│ │ │ └── schemas/ # Schemas Zod
│ │ └── thumbnails/ # Uploads de capas no backend
│ └── web/ # Frontend (React + Vite)
│ └── src/
│ ├── components/ # Componentes reutilizáveis
│ ├── contexts/ # Context API (usuário)
│ ├── layouts/ # Layout público e administrativo
│ ├── pages/ # Páginas públicas, privadas e admin
│ └── styles/ # Variáveis e estilos globais
├── migrations/ # Migrations Sequelize (monorepo root)
└── packages/
├── flags/ # Bitflags de permissões
└── types/ # Tipos compartilhados entre apps

✅ Pré-requisitos

  • Node.js 20+
  • npm 10+
  • PostgreSQL 14+ (local) ou Docker + Docker Compose
  • Git

Opcional:

  • VS Code com extensões de TypeScript/ESLint/SCSS

📥 Clonando o Projeto

git clone https://github.com/jvopinho/librix.git
cd librix

📦 Instalando as Dependências

Este projeto é um monorepo com npm workspaces.

npm install

Isso instala as dependências de:

  • apps/api
  • apps/web
  • packages/flags
  • packages/types

⚙️ Configuração do Ambiente

Backend

Arquivo: apps/api/.env

Você pode copiar de apps/api/.env.example:

cp apps/api/.env.example apps/api/.env

Exemplo completo:

PORT=3001POSTGRES_USER=postgresPOSTGRES_PASSWORD=passwordPOSTGRES_DB=postgresPOSTGRES_PORT=5432POSTGRES_ENDPOINT=localhost:5432RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxJWT_SESSION_SECRET=supersecretkeyJWT_FIRST_ACCESS_SECRET=supersecretkeyPASSWORD_SALT_ROUNDS=10WEB_URL=http://localhost:5173

Significado das variáveis

  • PORT: porta lógica da API (observação: atualmente o servidor inicia fixo em 7654 no código)
  • POSTGRES_USER: usuário do banco PostgreSQL
  • POSTGRES_PASSWORD: senha do banco PostgreSQL
  • POSTGRES_DB: nome do banco
  • POSTGRES_PORT: porta do PostgreSQL
  • POSTGRES_ENDPOINT: host:porta do PostgreSQL
  • RESEND_API_KEY: chave da API de envio de e-mails (ativação e recuperação)
  • JWT_SESSION_SECRET: segredo para token de sessão
  • JWT_FIRST_ACCESS_SECRET: segredo adicional de primeiro acesso
  • PASSWORD_SALT_ROUNDS: custo do hash bcrypt
  • WEB_URL: URL da aplicação frontend para CORS e links de e-mail

Frontend

Arquivo: apps/web/.env (opcional)

VITE_API_URL=http://localhost:7654

Significado

  • VITE_API_URL: base URL da API consumida no frontend.
  • Se não for definido, o frontend usa http://localhost:7654 por padrão.

🗄 Banco de Dados

1) Criar banco via Docker (recomendado para dev)

npm run compose:dev:up

Comando acima sobe o PostgreSQL com base no arquivo docker-compose.dev.yml e no .env do backend.

2) Rodar migrations

npm run db:migrate --workspace @librix/api

3) Gerar nova migration

Há script no backend, mas em ambiente de shell o fluxo mais previsível é:

cd apps/api
npx dotenv -e .env -- sequelize-cli migration:generate --name nome_da_migration

4) Atualizar schema com novas migrations

npm run db:migrate --workspace @librix/api

5) Resetar banco (desenvolvimento)

cd apps/api
npx dotenv -e .env -- sequelize-cli db:migrate:undo:all
npx dotenv -e .env -- sequelize-cli db:migrate

6) Seed

Atualmente não há script de seed versionado no projeto.

  • Para popular dados, use os endpoints administrativos após autenticação.

▶️ Rodando o Projeto

Backend

npm run dev --workspace @librix/api
  • API disponível em: http://localhost:7654

Frontend

npm run dev --workspace @librix/web
  • Frontend disponível em: http://localhost:5173 (padrão Vite)

👤 Usuário Administrador

O usuário administrador possui id 1, quando a api iniciar ela verifica se existe o usuário cadastrado, caso não possua ela irá criar e em seguida enviar o login e senha no terminal.


📜 Scripts Disponíveis

EscopoScriptComandoDescrição
rootcompose:dev:upnpm run compose:dev:upSobe PostgreSQL via Docker Compose
rootcompose:dev:startnpm run compose:dev:startInicia containers já criados
apidevnpm run dev --workspace @librix/apiDesenvolvimento backend com watch
apibuildnpm run build --workspace @librix/apiBuild TypeScript backend
apistartnpm run start --workspace @librix/apiInicia backend compilado
apidb:migratenpm run db:migrate --workspace @librix/apiExecuta migrations
apidb:generatenpm run db:generate --workspace @librix/apiGera migration (depende do shell)
webdevnpm run dev --workspace @librix/webDesenvolvimento frontend
webbuildnpm run build --workspace @librix/webBuild frontend
webpreviewnpm run preview --workspace @librix/webPreview do build frontend
weblintnpm run lint --workspace @librix/webLint frontend
flagsbuildnpm run build --workspace @librix/flagsBuild do pacote de permissões

🔄 Fluxo da Aplicação

Usuário
↓
Login / Ativação de Conta
↓
Autenticação (JWT)
↓
Resolução de Permissões (feature flags)
↓
Dashboard / Home
↓
Operações (livros, usuários, empréstimos, administração)

🔐 Controle de Permissões

O sistema usa feature flags com bitfield em @librix/flags.

Administrador

Pode:

  • gerenciar usuários
  • gerenciar livros
  • gerenciar empréstimos
  • acessar relatórios
  • acessar dashboard administrativo

Bibliotecário / Gestor (perfil intermediário)

Pode:

  • gerenciar livros
  • gerenciar empréstimos
  • visualizar/editar usuários (conforme features atribuídas)

Leitor

Pode:

  • visualizar catálogo
  • visualizar detalhes de livros
  • visualizar próprios empréstimos
  • realizar operações restritas ao próprio contexto (dependendo das features)

Observação importante:

  • permissões efetivas dependem das features atribuídas ao usuário na base.

🧭 Rotas Principais

Públicas

/
/home
/books
/books/:id
/login
/register
/forgot-password
/reset-password/:token
/activate-account
/users/activate
/users/activate/invalid

Protegidas (usuário autenticado)

/profile
/my-loans
/favorites

Administrativas

/admin
/admin/dashboard
/admin/books
/admin/books/create
/admin/books/new
/admin/books/edit/:id
/admin/users
/admin/loans
/admin/loans/new
---- NÃO IMPLEMENTADAS ----
/admin/authors
/admin/publishers
/admin/categories
/admin/reports
/admin/settings

Observação:

  • algumas rotas administrativas apontam para páginas placeholder no frontend.

🌐 API

Base local padrão:

  • http://localhost:7654

Documentação Swagger local:

  • http://localhost:7654/api-docs
  • http://localhost:7654/swagger.json

Frontend consome API via helper (getApiUrl) em:

  • apps/web/src/helpers/api-url.ts

🖼 Uploads

  • Armazenamento local em: apps/api/thumbnails
  • Servido estaticamente em: GET /thumbnails/:filename
  • Middleware: Multer (apps/api/src/middleware/upload-middleware.ts)
  • Nome do arquivo: hash aleatório + extensão original

Limites e formatos

  • Não há limite de tamanho configurado atualmente no Multer.
  • Não há validação explícita de MIME type/extensão no backend atual.

Recomendação para produção:

  • adicionar limite de tamanho
  • validar MIME type
  • mover armazenamento para bucket (S3, GCS, etc.)

🔑 Recuperação de Senha

Fluxo implementado:

  1. Solicitar recuperação: POST /auth/forgot-password
  2. API gera token e envia e-mail via Resend
  3. Frontend valida token: GET /auth/reset-password/:token
  4. Frontend envia nova senha: POST /auth/reset-password

📄 Paginação

Padrão implementado em endpoints list:

GET /books/all?page=1&limit=20GET /users?page=1&limit=10GET /loans?page=1&limit=10GET /loans/my-loans?page=1&limit=10

Resposta segue formato semelhante:

{
"data": [],
"page": 1,
"limit": 10,
"total": 0,
"totalPages": 0
}

🔎 Busca

Exemplos reais:

GET /books/all?search=harryGET /users?search=joaoGET /loans?search=maria

🧪 Filtros

Exemplos disponíveis hoje:

GET /books/all?author=MachadoGET /books/all?category=RomanceGET /books/all?isbn=978GET /books/all?availability=trueGET /users?status=ACTIVEGET /loans?status=BORROWEDGET /loans?status=LATEGET /loans?status=RETURNED

Ordenação também disponível em listagens:

GET /books/all?sortBy=title&sortOrder=ASCGET /users?sortBy=name&sortOrder=DESC

🛠 Desenvolvimento

Fluxo recomendado para contribuição:

  1. Criar branch de feature:
git checkout -b feat/nome-da-feature
  1. Implementar alterações
  2. Rodar lint/build localmente
  3. Commitar com mensagens claras
  4. Abrir Pull Request com contexto e evidências

Exemplo de verificação local:

npm run lint --workspace @librix/web
npm run build --workspace @librix/api
npm run build --workspace @librix/web

📐 Boas Práticas

  • TypeScript em frontend e backend
  • SCSS Modules para isolamento de estilos
  • Componentização de UI
  • Uso de hooks para estado/contexto
  • Organização por domínio (controllers, pages, components)
  • Validação de entrada com Zod
  • Linting com ESLint

Observação:

  • ainda existem pontos do frontend/backend com any que podem ser gradualmente eliminados.

📄 Licença

Projeto licenciado sob MIT.

Consulte o arquivo LICENSE na raiz para o texto completo.


📬 Contato

Responsável atual pelo repositório:

  • João Pinho — jvopinho.contato@gmail.com

Repositório:

About

📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - jvopinho/Librix: 📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP · GitHub
Skip to content

Repository files navigation

📚 Librix

Librix é um sistema web para gerenciamento de bibliotecas, com controle de usuários, livros, empréstimos, autenticação JWT, permissões granulares e área administrativa.


📌 Índice


🚀 Funcionalidades

Implementadas no estado atual

  • Login com JWT (/auth/sign-in)
  • Recuperação de senha com token (/auth/forgot-password, /auth/reset-password/:token, /auth/reset-password)
  • Ativação de conta por convite (/users/activate_account)
  • Dashboard/Home com indicadores e atalhos
  • Catálogo público de livros
  • Detalhes de livro
  • Gestão de livros (CRUD administrativo)
  • Upload de capa de livro
  • Gestão de usuários (CRUD administrativo)
  • Edição de perfil do usuário e troca de senha
  • Empréstimos (criação, devolução, edição e exclusão)
  • Histórico de empréstimos (com paginação e status)
  • Autocompletes (autores, editoras, tags, livros disponíveis e todos os livros)
  • Controle de permissões por feature flag
  • Rotas protegidas para autenticação e autorização
  • Layout público e layout administrativo responsivos

Em progresso ou parcialmente disponível

  • Área de favoritos (página existente, sem persistência no backend)
  • Relatórios administrativos: endpoint /reports/dashboard implementado e rota administrativa disponível
  • Cadastro aberto (/register) usa atualmente o fluxo de ativação por convite

🧰 Tecnologias Utilizadas

Frontend

  • React 19
  • TypeScript
  • React Router DOM v7
  • SCSS Modules
  • Lucide React
  • Vite

Backend

  • Node.js
  • Express 5
  • TypeScript
  • Sequelize ORM
  • JWT (jsonwebtoken)
  • Zod (validação)
  • Multer (uploads)
  • Resend (e-mail)

Banco de dados

  • PostgreSQL

Outros

  • Docker
  • Docker Compose
  • ESLint
  • npm Workspaces (monorepo)

🗂 Estrutura do Projeto

librix/
├── apps/
│ ├── api/ # Backend (Express + Sequelize)
│ │ ├── src/
│ │ │ ├── controllers/ # Regras de negócio e endpoints
│ │ │ ├── database/ # Modelos e conexão Sequelize
│ │ │ ├── http/ # App Express e rotas
│ │ │ ├── middleware/ # Auth, validação de body, upload
│ │ │ └── schemas/ # Schemas Zod
│ │ └── thumbnails/ # Uploads de capas no backend
│ └── web/ # Frontend (React + Vite)
│ └── src/
│ ├── components/ # Componentes reutilizáveis
│ ├── contexts/ # Context API (usuário)
│ ├── layouts/ # Layout público e administrativo
│ ├── pages/ # Páginas públicas, privadas e admin
│ └── styles/ # Variáveis e estilos globais
├── migrations/ # Migrations Sequelize (monorepo root)
└── packages/
├── flags/ # Bitflags de permissões
└── types/ # Tipos compartilhados entre apps

✅ Pré-requisitos

  • Node.js 20+
  • npm 10+
  • PostgreSQL 14+ (local) ou Docker + Docker Compose
  • Git

Opcional:

  • VS Code com extensões de TypeScript/ESLint/SCSS

📥 Clonando o Projeto

git clone https://github.com/jvopinho/librix.git
cd librix

📦 Instalando as Dependências

Este projeto é um monorepo com npm workspaces.

npm install

Isso instala as dependências de:

  • apps/api
  • apps/web
  • packages/flags
  • packages/types

⚙️ Configuração do Ambiente

Backend

Arquivo: apps/api/.env

Você pode copiar de apps/api/.env.example:

cp apps/api/.env.example apps/api/.env

Exemplo completo:

PORT=3001POSTGRES_USER=postgresPOSTGRES_PASSWORD=passwordPOSTGRES_DB=postgresPOSTGRES_PORT=5432POSTGRES_ENDPOINT=localhost:5432RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxJWT_SESSION_SECRET=supersecretkeyJWT_FIRST_ACCESS_SECRET=supersecretkeyPASSWORD_SALT_ROUNDS=10WEB_URL=http://localhost:5173

Significado das variáveis

  • PORT: porta lógica da API (observação: atualmente o servidor inicia fixo em 7654 no código)
  • POSTGRES_USER: usuário do banco PostgreSQL
  • POSTGRES_PASSWORD: senha do banco PostgreSQL
  • POSTGRES_DB: nome do banco
  • POSTGRES_PORT: porta do PostgreSQL
  • POSTGRES_ENDPOINT: host:porta do PostgreSQL
  • RESEND_API_KEY: chave da API de envio de e-mails (ativação e recuperação)
  • JWT_SESSION_SECRET: segredo para token de sessão
  • JWT_FIRST_ACCESS_SECRET: segredo adicional de primeiro acesso
  • PASSWORD_SALT_ROUNDS: custo do hash bcrypt
  • WEB_URL: URL da aplicação frontend para CORS e links de e-mail

Frontend

Arquivo: apps/web/.env (opcional)

VITE_API_URL=http://localhost:7654

Significado

  • VITE_API_URL: base URL da API consumida no frontend.
  • Se não for definido, o frontend usa http://localhost:7654 por padrão.

🗄 Banco de Dados

1) Criar banco via Docker (recomendado para dev)

npm run compose:dev:up

Comando acima sobe o PostgreSQL com base no arquivo docker-compose.dev.yml e no .env do backend.

2) Rodar migrations

npm run db:migrate --workspace @librix/api

3) Gerar nova migration

Há script no backend, mas em ambiente de shell o fluxo mais previsível é:

cd apps/api
npx dotenv -e .env -- sequelize-cli migration:generate --name nome_da_migration

4) Atualizar schema com novas migrations

npm run db:migrate --workspace @librix/api

5) Resetar banco (desenvolvimento)

cd apps/api
npx dotenv -e .env -- sequelize-cli db:migrate:undo:all
npx dotenv -e .env -- sequelize-cli db:migrate

6) Seed

Atualmente não há script de seed versionado no projeto.

  • Para popular dados, use os endpoints administrativos após autenticação.

▶️ Rodando o Projeto

Backend

npm run dev --workspace @librix/api
  • API disponível em: http://localhost:7654

Frontend

npm run dev --workspace @librix/web
  • Frontend disponível em: http://localhost:5173 (padrão Vite)

👤 Usuário Administrador

O usuário administrador possui id 1, quando a api iniciar ela verifica se existe o usuário cadastrado, caso não possua ela irá criar e em seguida enviar o login e senha no terminal.


📜 Scripts Disponíveis

EscopoScriptComandoDescrição
rootcompose:dev:upnpm run compose:dev:upSobe PostgreSQL via Docker Compose
rootcompose:dev:startnpm run compose:dev:startInicia containers já criados
apidevnpm run dev --workspace @librix/apiDesenvolvimento backend com watch
apibuildnpm run build --workspace @librix/apiBuild TypeScript backend
apistartnpm run start --workspace @librix/apiInicia backend compilado
apidb:migratenpm run db:migrate --workspace @librix/apiExecuta migrations
apidb:generatenpm run db:generate --workspace @librix/apiGera migration (depende do shell)
webdevnpm run dev --workspace @librix/webDesenvolvimento frontend
webbuildnpm run build --workspace @librix/webBuild frontend
webpreviewnpm run preview --workspace @librix/webPreview do build frontend
weblintnpm run lint --workspace @librix/webLint frontend
flagsbuildnpm run build --workspace @librix/flagsBuild do pacote de permissões

🔄 Fluxo da Aplicação

Usuário
↓
Login / Ativação de Conta
↓
Autenticação (JWT)
↓
Resolução de Permissões (feature flags)
↓
Dashboard / Home
↓
Operações (livros, usuários, empréstimos, administração)

🔐 Controle de Permissões

O sistema usa feature flags com bitfield em @librix/flags.

Administrador

Pode:

  • gerenciar usuários
  • gerenciar livros
  • gerenciar empréstimos
  • acessar relatórios
  • acessar dashboard administrativo

Bibliotecário / Gestor (perfil intermediário)

Pode:

  • gerenciar livros
  • gerenciar empréstimos
  • visualizar/editar usuários (conforme features atribuídas)

Leitor

Pode:

  • visualizar catálogo
  • visualizar detalhes de livros
  • visualizar próprios empréstimos
  • realizar operações restritas ao próprio contexto (dependendo das features)

Observação importante:

  • permissões efetivas dependem das features atribuídas ao usuário na base.

🧭 Rotas Principais

Públicas

/
/home
/books
/books/:id
/login
/register
/forgot-password
/reset-password/:token
/activate-account
/users/activate
/users/activate/invalid

Protegidas (usuário autenticado)

/profile
/my-loans
/favorites

Administrativas

/admin
/admin/dashboard
/admin/books
/admin/books/create
/admin/books/new
/admin/books/edit/:id
/admin/users
/admin/loans
/admin/loans/new
---- NÃO IMPLEMENTADAS ----
/admin/authors
/admin/publishers
/admin/categories
/admin/reports
/admin/settings

Observação:

  • algumas rotas administrativas apontam para páginas placeholder no frontend.

🌐 API

Base local padrão:

  • http://localhost:7654

Documentação Swagger local:

  • http://localhost:7654/api-docs
  • http://localhost:7654/swagger.json

Frontend consome API via helper (getApiUrl) em:

  • apps/web/src/helpers/api-url.ts

🖼 Uploads

  • Armazenamento local em: apps/api/thumbnails
  • Servido estaticamente em: GET /thumbnails/:filename
  • Middleware: Multer (apps/api/src/middleware/upload-middleware.ts)
  • Nome do arquivo: hash aleatório + extensão original

Limites e formatos

  • Não há limite de tamanho configurado atualmente no Multer.
  • Não há validação explícita de MIME type/extensão no backend atual.

Recomendação para produção:

  • adicionar limite de tamanho
  • validar MIME type
  • mover armazenamento para bucket (S3, GCS, etc.)

🔑 Recuperação de Senha

Fluxo implementado:

  1. Solicitar recuperação: POST /auth/forgot-password
  2. API gera token e envia e-mail via Resend
  3. Frontend valida token: GET /auth/reset-password/:token
  4. Frontend envia nova senha: POST /auth/reset-password

📄 Paginação

Padrão implementado em endpoints list:

GET /books/all?page=1&limit=20GET /users?page=1&limit=10GET /loans?page=1&limit=10GET /loans/my-loans?page=1&limit=10

Resposta segue formato semelhante:

{
"data": [],
"page": 1,
"limit": 10,
"total": 0,
"totalPages": 0
}

🔎 Busca

Exemplos reais:

GET /books/all?search=harryGET /users?search=joaoGET /loans?search=maria

🧪 Filtros

Exemplos disponíveis hoje:

GET /books/all?author=MachadoGET /books/all?category=RomanceGET /books/all?isbn=978GET /books/all?availability=trueGET /users?status=ACTIVEGET /loans?status=BORROWEDGET /loans?status=LATEGET /loans?status=RETURNED

Ordenação também disponível em listagens:

GET /books/all?sortBy=title&sortOrder=ASCGET /users?sortBy=name&sortOrder=DESC

🛠 Desenvolvimento

Fluxo recomendado para contribuição:

  1. Criar branch de feature:
git checkout -b feat/nome-da-feature
  1. Implementar alterações
  2. Rodar lint/build localmente
  3. Commitar com mensagens claras
  4. Abrir Pull Request com contexto e evidências

Exemplo de verificação local:

npm run lint --workspace @librix/web
npm run build --workspace @librix/api
npm run build --workspace @librix/web

📐 Boas Práticas

  • TypeScript em frontend e backend
  • SCSS Modules para isolamento de estilos
  • Componentização de UI
  • Uso de hooks para estado/contexto
  • Organização por domínio (controllers, pages, components)
  • Validação de entrada com Zod
  • Linting com ESLint

Observação:

  • ainda existem pontos do frontend/backend com any que podem ser gradualmente eliminados.

📄 Licença

Projeto licenciado sob MIT.

Consulte o arquivo LICENSE na raiz para o texto completo.


📬 Contato

Responsável atual pelo repositório:

  • João Pinho — jvopinho.contato@gmail.com

Repositório:

About

📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - jvopinho/Librix: 📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP · GitHub
Skip to content

Repository files navigation

📚 Librix

Librix é um sistema web para gerenciamento de bibliotecas, com controle de usuários, livros, empréstimos, autenticação JWT, permissões granulares e área administrativa.


📌 Índice


🚀 Funcionalidades

Implementadas no estado atual

  • Login com JWT (/auth/sign-in)
  • Recuperação de senha com token (/auth/forgot-password, /auth/reset-password/:token, /auth/reset-password)
  • Ativação de conta por convite (/users/activate_account)
  • Dashboard/Home com indicadores e atalhos
  • Catálogo público de livros
  • Detalhes de livro
  • Gestão de livros (CRUD administrativo)
  • Upload de capa de livro
  • Gestão de usuários (CRUD administrativo)
  • Edição de perfil do usuário e troca de senha
  • Empréstimos (criação, devolução, edição e exclusão)
  • Histórico de empréstimos (com paginação e status)
  • Autocompletes (autores, editoras, tags, livros disponíveis e todos os livros)
  • Controle de permissões por feature flag
  • Rotas protegidas para autenticação e autorização
  • Layout público e layout administrativo responsivos

Em progresso ou parcialmente disponível

  • Área de favoritos (página existente, sem persistência no backend)
  • Relatórios administrativos: endpoint /reports/dashboard implementado e rota administrativa disponível
  • Cadastro aberto (/register) usa atualmente o fluxo de ativação por convite

🧰 Tecnologias Utilizadas

Frontend

  • React 19
  • TypeScript
  • React Router DOM v7
  • SCSS Modules
  • Lucide React
  • Vite

Backend

  • Node.js
  • Express 5
  • TypeScript
  • Sequelize ORM
  • JWT (jsonwebtoken)
  • Zod (validação)
  • Multer (uploads)
  • Resend (e-mail)

Banco de dados

  • PostgreSQL

Outros

  • Docker
  • Docker Compose
  • ESLint
  • npm Workspaces (monorepo)

🗂 Estrutura do Projeto

librix/
├── apps/
│ ├── api/ # Backend (Express + Sequelize)
│ │ ├── src/
│ │ │ ├── controllers/ # Regras de negócio e endpoints
│ │ │ ├── database/ # Modelos e conexão Sequelize
│ │ │ ├── http/ # App Express e rotas
│ │ │ ├── middleware/ # Auth, validação de body, upload
│ │ │ └── schemas/ # Schemas Zod
│ │ └── thumbnails/ # Uploads de capas no backend
│ └── web/ # Frontend (React + Vite)
│ └── src/
│ ├── components/ # Componentes reutilizáveis
│ ├── contexts/ # Context API (usuário)
│ ├── layouts/ # Layout público e administrativo
│ ├── pages/ # Páginas públicas, privadas e admin
│ └── styles/ # Variáveis e estilos globais
├── migrations/ # Migrations Sequelize (monorepo root)
└── packages/
├── flags/ # Bitflags de permissões
└── types/ # Tipos compartilhados entre apps

✅ Pré-requisitos

  • Node.js 20+
  • npm 10+
  • PostgreSQL 14+ (local) ou Docker + Docker Compose
  • Git

Opcional:

  • VS Code com extensões de TypeScript/ESLint/SCSS

📥 Clonando o Projeto

git clone https://github.com/jvopinho/librix.git
cd librix

📦 Instalando as Dependências

Este projeto é um monorepo com npm workspaces.

npm install

Isso instala as dependências de:

  • apps/api
  • apps/web
  • packages/flags
  • packages/types

⚙️ Configuração do Ambiente

Backend

Arquivo: apps/api/.env

Você pode copiar de apps/api/.env.example:

cp apps/api/.env.example apps/api/.env

Exemplo completo:

PORT=3001POSTGRES_USER=postgresPOSTGRES_PASSWORD=passwordPOSTGRES_DB=postgresPOSTGRES_PORT=5432POSTGRES_ENDPOINT=localhost:5432RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxJWT_SESSION_SECRET=supersecretkeyJWT_FIRST_ACCESS_SECRET=supersecretkeyPASSWORD_SALT_ROUNDS=10WEB_URL=http://localhost:5173

Significado das variáveis

  • PORT: porta lógica da API (observação: atualmente o servidor inicia fixo em 7654 no código)
  • POSTGRES_USER: usuário do banco PostgreSQL
  • POSTGRES_PASSWORD: senha do banco PostgreSQL
  • POSTGRES_DB: nome do banco
  • POSTGRES_PORT: porta do PostgreSQL
  • POSTGRES_ENDPOINT: host:porta do PostgreSQL
  • RESEND_API_KEY: chave da API de envio de e-mails (ativação e recuperação)
  • JWT_SESSION_SECRET: segredo para token de sessão
  • JWT_FIRST_ACCESS_SECRET: segredo adicional de primeiro acesso
  • PASSWORD_SALT_ROUNDS: custo do hash bcrypt
  • WEB_URL: URL da aplicação frontend para CORS e links de e-mail

Frontend

Arquivo: apps/web/.env (opcional)

VITE_API_URL=http://localhost:7654

Significado

  • VITE_API_URL: base URL da API consumida no frontend.
  • Se não for definido, o frontend usa http://localhost:7654 por padrão.

🗄 Banco de Dados

1) Criar banco via Docker (recomendado para dev)

npm run compose:dev:up

Comando acima sobe o PostgreSQL com base no arquivo docker-compose.dev.yml e no .env do backend.

2) Rodar migrations

npm run db:migrate --workspace @librix/api

3) Gerar nova migration

Há script no backend, mas em ambiente de shell o fluxo mais previsível é:

cd apps/api
npx dotenv -e .env -- sequelize-cli migration:generate --name nome_da_migration

4) Atualizar schema com novas migrations

npm run db:migrate --workspace @librix/api

5) Resetar banco (desenvolvimento)

cd apps/api
npx dotenv -e .env -- sequelize-cli db:migrate:undo:all
npx dotenv -e .env -- sequelize-cli db:migrate

6) Seed

Atualmente não há script de seed versionado no projeto.

  • Para popular dados, use os endpoints administrativos após autenticação.

▶️ Rodando o Projeto

Backend

npm run dev --workspace @librix/api
  • API disponível em: http://localhost:7654

Frontend

npm run dev --workspace @librix/web
  • Frontend disponível em: http://localhost:5173 (padrão Vite)

👤 Usuário Administrador

O usuário administrador possui id 1, quando a api iniciar ela verifica se existe o usuário cadastrado, caso não possua ela irá criar e em seguida enviar o login e senha no terminal.


📜 Scripts Disponíveis

EscopoScriptComandoDescrição
rootcompose:dev:upnpm run compose:dev:upSobe PostgreSQL via Docker Compose
rootcompose:dev:startnpm run compose:dev:startInicia containers já criados
apidevnpm run dev --workspace @librix/apiDesenvolvimento backend com watch
apibuildnpm run build --workspace @librix/apiBuild TypeScript backend
apistartnpm run start --workspace @librix/apiInicia backend compilado
apidb:migratenpm run db:migrate --workspace @librix/apiExecuta migrations
apidb:generatenpm run db:generate --workspace @librix/apiGera migration (depende do shell)
webdevnpm run dev --workspace @librix/webDesenvolvimento frontend
webbuildnpm run build --workspace @librix/webBuild frontend
webpreviewnpm run preview --workspace @librix/webPreview do build frontend
weblintnpm run lint --workspace @librix/webLint frontend
flagsbuildnpm run build --workspace @librix/flagsBuild do pacote de permissões

🔄 Fluxo da Aplicação

Usuário
↓
Login / Ativação de Conta
↓
Autenticação (JWT)
↓
Resolução de Permissões (feature flags)
↓
Dashboard / Home
↓
Operações (livros, usuários, empréstimos, administração)

🔐 Controle de Permissões

O sistema usa feature flags com bitfield em @librix/flags.

Administrador

Pode:

  • gerenciar usuários
  • gerenciar livros
  • gerenciar empréstimos
  • acessar relatórios
  • acessar dashboard administrativo

Bibliotecário / Gestor (perfil intermediário)

Pode:

  • gerenciar livros
  • gerenciar empréstimos
  • visualizar/editar usuários (conforme features atribuídas)

Leitor

Pode:

  • visualizar catálogo
  • visualizar detalhes de livros
  • visualizar próprios empréstimos
  • realizar operações restritas ao próprio contexto (dependendo das features)

Observação importante:

  • permissões efetivas dependem das features atribuídas ao usuário na base.

🧭 Rotas Principais

Públicas

/
/home
/books
/books/:id
/login
/register
/forgot-password
/reset-password/:token
/activate-account
/users/activate
/users/activate/invalid

Protegidas (usuário autenticado)

/profile
/my-loans
/favorites

Administrativas

/admin
/admin/dashboard
/admin/books
/admin/books/create
/admin/books/new
/admin/books/edit/:id
/admin/users
/admin/loans
/admin/loans/new
---- NÃO IMPLEMENTADAS ----
/admin/authors
/admin/publishers
/admin/categories
/admin/reports
/admin/settings

Observação:

  • algumas rotas administrativas apontam para páginas placeholder no frontend.

🌐 API

Base local padrão:

  • http://localhost:7654

Documentação Swagger local:

  • http://localhost:7654/api-docs
  • http://localhost:7654/swagger.json

Frontend consome API via helper (getApiUrl) em:

  • apps/web/src/helpers/api-url.ts

🖼 Uploads

  • Armazenamento local em: apps/api/thumbnails
  • Servido estaticamente em: GET /thumbnails/:filename
  • Middleware: Multer (apps/api/src/middleware/upload-middleware.ts)
  • Nome do arquivo: hash aleatório + extensão original

Limites e formatos

  • Não há limite de tamanho configurado atualmente no Multer.
  • Não há validação explícita de MIME type/extensão no backend atual.

Recomendação para produção:

  • adicionar limite de tamanho
  • validar MIME type
  • mover armazenamento para bucket (S3, GCS, etc.)

🔑 Recuperação de Senha

Fluxo implementado:

  1. Solicitar recuperação: POST /auth/forgot-password
  2. API gera token e envia e-mail via Resend
  3. Frontend valida token: GET /auth/reset-password/:token
  4. Frontend envia nova senha: POST /auth/reset-password

📄 Paginação

Padrão implementado em endpoints list:

GET /books/all?page=1&limit=20GET /users?page=1&limit=10GET /loans?page=1&limit=10GET /loans/my-loans?page=1&limit=10

Resposta segue formato semelhante:

{
"data": [],
"page": 1,
"limit": 10,
"total": 0,
"totalPages": 0
}

🔎 Busca

Exemplos reais:

GET /books/all?search=harryGET /users?search=joaoGET /loans?search=maria

🧪 Filtros

Exemplos disponíveis hoje:

GET /books/all?author=MachadoGET /books/all?category=RomanceGET /books/all?isbn=978GET /books/all?availability=trueGET /users?status=ACTIVEGET /loans?status=BORROWEDGET /loans?status=LATEGET /loans?status=RETURNED

Ordenação também disponível em listagens:

GET /books/all?sortBy=title&sortOrder=ASCGET /users?sortBy=name&sortOrder=DESC

🛠 Desenvolvimento

Fluxo recomendado para contribuição:

  1. Criar branch de feature:
git checkout -b feat/nome-da-feature
  1. Implementar alterações
  2. Rodar lint/build localmente
  3. Commitar com mensagens claras
  4. Abrir Pull Request com contexto e evidências

Exemplo de verificação local:

npm run lint --workspace @librix/web
npm run build --workspace @librix/api
npm run build --workspace @librix/web

📐 Boas Práticas

  • TypeScript em frontend e backend
  • SCSS Modules para isolamento de estilos
  • Componentização de UI
  • Uso de hooks para estado/contexto
  • Organização por domínio (controllers, pages, components)
  • Validação de entrada com Zod
  • Linting com ESLint

Observação:

  • ainda existem pontos do frontend/backend com any que podem ser gradualmente eliminados.

📄 Licença

Projeto licenciado sob MIT.

Consulte o arquivo LICENSE na raiz para o texto completo.


📬 Contato

Responsável atual pelo repositório:

  • João Pinho — jvopinho.contato@gmail.com

Repositório:

About

📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - jvopinho/Librix: 📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP · GitHub
Skip to content

Repository files navigation

📚 Librix

Librix é um sistema web para gerenciamento de bibliotecas, com controle de usuários, livros, empréstimos, autenticação JWT, permissões granulares e área administrativa.


📌 Índice


🚀 Funcionalidades

Implementadas no estado atual

  • Login com JWT (/auth/sign-in)
  • Recuperação de senha com token (/auth/forgot-password, /auth/reset-password/:token, /auth/reset-password)
  • Ativação de conta por convite (/users/activate_account)
  • Dashboard/Home com indicadores e atalhos
  • Catálogo público de livros
  • Detalhes de livro
  • Gestão de livros (CRUD administrativo)
  • Upload de capa de livro
  • Gestão de usuários (CRUD administrativo)
  • Edição de perfil do usuário e troca de senha
  • Empréstimos (criação, devolução, edição e exclusão)
  • Histórico de empréstimos (com paginação e status)
  • Autocompletes (autores, editoras, tags, livros disponíveis e todos os livros)
  • Controle de permissões por feature flag
  • Rotas protegidas para autenticação e autorização
  • Layout público e layout administrativo responsivos

Em progresso ou parcialmente disponível

  • Área de favoritos (página existente, sem persistência no backend)
  • Relatórios administrativos: endpoint /reports/dashboard implementado e rota administrativa disponível
  • Cadastro aberto (/register) usa atualmente o fluxo de ativação por convite

🧰 Tecnologias Utilizadas

Frontend

  • React 19
  • TypeScript
  • React Router DOM v7
  • SCSS Modules
  • Lucide React
  • Vite

Backend

  • Node.js
  • Express 5
  • TypeScript
  • Sequelize ORM
  • JWT (jsonwebtoken)
  • Zod (validação)
  • Multer (uploads)
  • Resend (e-mail)

Banco de dados

  • PostgreSQL

Outros

  • Docker
  • Docker Compose
  • ESLint
  • npm Workspaces (monorepo)

🗂 Estrutura do Projeto

librix/
├── apps/
│ ├── api/ # Backend (Express + Sequelize)
│ │ ├── src/
│ │ │ ├── controllers/ # Regras de negócio e endpoints
│ │ │ ├── database/ # Modelos e conexão Sequelize
│ │ │ ├── http/ # App Express e rotas
│ │ │ ├── middleware/ # Auth, validação de body, upload
│ │ │ └── schemas/ # Schemas Zod
│ │ └── thumbnails/ # Uploads de capas no backend
│ └── web/ # Frontend (React + Vite)
│ └── src/
│ ├── components/ # Componentes reutilizáveis
│ ├── contexts/ # Context API (usuário)
│ ├── layouts/ # Layout público e administrativo
│ ├── pages/ # Páginas públicas, privadas e admin
│ └── styles/ # Variáveis e estilos globais
├── migrations/ # Migrations Sequelize (monorepo root)
└── packages/
├── flags/ # Bitflags de permissões
└── types/ # Tipos compartilhados entre apps

✅ Pré-requisitos

  • Node.js 20+
  • npm 10+
  • PostgreSQL 14+ (local) ou Docker + Docker Compose
  • Git

Opcional:

  • VS Code com extensões de TypeScript/ESLint/SCSS

📥 Clonando o Projeto

git clone https://github.com/jvopinho/librix.git
cd librix

📦 Instalando as Dependências

Este projeto é um monorepo com npm workspaces.

npm install

Isso instala as dependências de:

  • apps/api
  • apps/web
  • packages/flags
  • packages/types

⚙️ Configuração do Ambiente

Backend

Arquivo: apps/api/.env

Você pode copiar de apps/api/.env.example:

cp apps/api/.env.example apps/api/.env

Exemplo completo:

PORT=3001POSTGRES_USER=postgresPOSTGRES_PASSWORD=passwordPOSTGRES_DB=postgresPOSTGRES_PORT=5432POSTGRES_ENDPOINT=localhost:5432RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxJWT_SESSION_SECRET=supersecretkeyJWT_FIRST_ACCESS_SECRET=supersecretkeyPASSWORD_SALT_ROUNDS=10WEB_URL=http://localhost:5173

Significado das variáveis

  • PORT: porta lógica da API (observação: atualmente o servidor inicia fixo em 7654 no código)
  • POSTGRES_USER: usuário do banco PostgreSQL
  • POSTGRES_PASSWORD: senha do banco PostgreSQL
  • POSTGRES_DB: nome do banco
  • POSTGRES_PORT: porta do PostgreSQL
  • POSTGRES_ENDPOINT: host:porta do PostgreSQL
  • RESEND_API_KEY: chave da API de envio de e-mails (ativação e recuperação)
  • JWT_SESSION_SECRET: segredo para token de sessão
  • JWT_FIRST_ACCESS_SECRET: segredo adicional de primeiro acesso
  • PASSWORD_SALT_ROUNDS: custo do hash bcrypt
  • WEB_URL: URL da aplicação frontend para CORS e links de e-mail

Frontend

Arquivo: apps/web/.env (opcional)

VITE_API_URL=http://localhost:7654

Significado

  • VITE_API_URL: base URL da API consumida no frontend.
  • Se não for definido, o frontend usa http://localhost:7654 por padrão.

🗄 Banco de Dados

1) Criar banco via Docker (recomendado para dev)

npm run compose:dev:up

Comando acima sobe o PostgreSQL com base no arquivo docker-compose.dev.yml e no .env do backend.

2) Rodar migrations

npm run db:migrate --workspace @librix/api

3) Gerar nova migration

Há script no backend, mas em ambiente de shell o fluxo mais previsível é:

cd apps/api
npx dotenv -e .env -- sequelize-cli migration:generate --name nome_da_migration

4) Atualizar schema com novas migrations

npm run db:migrate --workspace @librix/api

5) Resetar banco (desenvolvimento)

cd apps/api
npx dotenv -e .env -- sequelize-cli db:migrate:undo:all
npx dotenv -e .env -- sequelize-cli db:migrate

6) Seed

Atualmente não há script de seed versionado no projeto.

  • Para popular dados, use os endpoints administrativos após autenticação.

▶️ Rodando o Projeto

Backend

npm run dev --workspace @librix/api
  • API disponível em: http://localhost:7654

Frontend

npm run dev --workspace @librix/web
  • Frontend disponível em: http://localhost:5173 (padrão Vite)

👤 Usuário Administrador

O usuário administrador possui id 1, quando a api iniciar ela verifica se existe o usuário cadastrado, caso não possua ela irá criar e em seguida enviar o login e senha no terminal.


📜 Scripts Disponíveis

EscopoScriptComandoDescrição
rootcompose:dev:upnpm run compose:dev:upSobe PostgreSQL via Docker Compose
rootcompose:dev:startnpm run compose:dev:startInicia containers já criados
apidevnpm run dev --workspace @librix/apiDesenvolvimento backend com watch
apibuildnpm run build --workspace @librix/apiBuild TypeScript backend
apistartnpm run start --workspace @librix/apiInicia backend compilado
apidb:migratenpm run db:migrate --workspace @librix/apiExecuta migrations
apidb:generatenpm run db:generate --workspace @librix/apiGera migration (depende do shell)
webdevnpm run dev --workspace @librix/webDesenvolvimento frontend
webbuildnpm run build --workspace @librix/webBuild frontend
webpreviewnpm run preview --workspace @librix/webPreview do build frontend
weblintnpm run lint --workspace @librix/webLint frontend
flagsbuildnpm run build --workspace @librix/flagsBuild do pacote de permissões

🔄 Fluxo da Aplicação

Usuário
↓
Login / Ativação de Conta
↓
Autenticação (JWT)
↓
Resolução de Permissões (feature flags)
↓
Dashboard / Home
↓
Operações (livros, usuários, empréstimos, administração)

🔐 Controle de Permissões

O sistema usa feature flags com bitfield em @librix/flags.

Administrador

Pode:

  • gerenciar usuários
  • gerenciar livros
  • gerenciar empréstimos
  • acessar relatórios
  • acessar dashboard administrativo

Bibliotecário / Gestor (perfil intermediário)

Pode:

  • gerenciar livros
  • gerenciar empréstimos
  • visualizar/editar usuários (conforme features atribuídas)

Leitor

Pode:

  • visualizar catálogo
  • visualizar detalhes de livros
  • visualizar próprios empréstimos
  • realizar operações restritas ao próprio contexto (dependendo das features)

Observação importante:

  • permissões efetivas dependem das features atribuídas ao usuário na base.

🧭 Rotas Principais

Públicas

/
/home
/books
/books/:id
/login
/register
/forgot-password
/reset-password/:token
/activate-account
/users/activate
/users/activate/invalid

Protegidas (usuário autenticado)

/profile
/my-loans
/favorites

Administrativas

/admin
/admin/dashboard
/admin/books
/admin/books/create
/admin/books/new
/admin/books/edit/:id
/admin/users
/admin/loans
/admin/loans/new
---- NÃO IMPLEMENTADAS ----
/admin/authors
/admin/publishers
/admin/categories
/admin/reports
/admin/settings

Observação:

  • algumas rotas administrativas apontam para páginas placeholder no frontend.

🌐 API

Base local padrão:

  • http://localhost:7654

Documentação Swagger local:

  • http://localhost:7654/api-docs
  • http://localhost:7654/swagger.json

Frontend consome API via helper (getApiUrl) em:

  • apps/web/src/helpers/api-url.ts

🖼 Uploads

  • Armazenamento local em: apps/api/thumbnails
  • Servido estaticamente em: GET /thumbnails/:filename
  • Middleware: Multer (apps/api/src/middleware/upload-middleware.ts)
  • Nome do arquivo: hash aleatório + extensão original

Limites e formatos

  • Não há limite de tamanho configurado atualmente no Multer.
  • Não há validação explícita de MIME type/extensão no backend atual.

Recomendação para produção:

  • adicionar limite de tamanho
  • validar MIME type
  • mover armazenamento para bucket (S3, GCS, etc.)

🔑 Recuperação de Senha

Fluxo implementado:

  1. Solicitar recuperação: POST /auth/forgot-password
  2. API gera token e envia e-mail via Resend
  3. Frontend valida token: GET /auth/reset-password/:token
  4. Frontend envia nova senha: POST /auth/reset-password

📄 Paginação

Padrão implementado em endpoints list:

GET /books/all?page=1&limit=20GET /users?page=1&limit=10GET /loans?page=1&limit=10GET /loans/my-loans?page=1&limit=10

Resposta segue formato semelhante:

{
"data": [],
"page": 1,
"limit": 10,
"total": 0,
"totalPages": 0
}

🔎 Busca

Exemplos reais:

GET /books/all?search=harryGET /users?search=joaoGET /loans?search=maria

🧪 Filtros

Exemplos disponíveis hoje:

GET /books/all?author=MachadoGET /books/all?category=RomanceGET /books/all?isbn=978GET /books/all?availability=trueGET /users?status=ACTIVEGET /loans?status=BORROWEDGET /loans?status=LATEGET /loans?status=RETURNED

Ordenação também disponível em listagens:

GET /books/all?sortBy=title&sortOrder=ASCGET /users?sortBy=name&sortOrder=DESC

🛠 Desenvolvimento

Fluxo recomendado para contribuição:

  1. Criar branch de feature:
git checkout -b feat/nome-da-feature
  1. Implementar alterações
  2. Rodar lint/build localmente
  3. Commitar com mensagens claras
  4. Abrir Pull Request com contexto e evidências

Exemplo de verificação local:

npm run lint --workspace @librix/web
npm run build --workspace @librix/api
npm run build --workspace @librix/web

📐 Boas Práticas

  • TypeScript em frontend e backend
  • SCSS Modules para isolamento de estilos
  • Componentização de UI
  • Uso de hooks para estado/contexto
  • Organização por domínio (controllers, pages, components)
  • Validação de entrada com Zod
  • Linting com ESLint

Observação:

  • ainda existem pontos do frontend/backend com any que podem ser gradualmente eliminados.

📄 Licença

Projeto licenciado sob MIT.

Consulte o arquivo LICENSE na raiz para o texto completo.


📬 Contato

Responsável atual pelo repositório:

  • João Pinho — jvopinho.contato@gmail.com

Repositório:

About

📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - jvopinho/Librix: 📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP · GitHub
Skip to content

Repository files navigation

📚 Librix

Librix é um sistema web para gerenciamento de bibliotecas, com controle de usuários, livros, empréstimos, autenticação JWT, permissões granulares e área administrativa.


📌 Índice


🚀 Funcionalidades

Implementadas no estado atual

  • Login com JWT (/auth/sign-in)
  • Recuperação de senha com token (/auth/forgot-password, /auth/reset-password/:token, /auth/reset-password)
  • Ativação de conta por convite (/users/activate_account)
  • Dashboard/Home com indicadores e atalhos
  • Catálogo público de livros
  • Detalhes de livro
  • Gestão de livros (CRUD administrativo)
  • Upload de capa de livro
  • Gestão de usuários (CRUD administrativo)
  • Edição de perfil do usuário e troca de senha
  • Empréstimos (criação, devolução, edição e exclusão)
  • Histórico de empréstimos (com paginação e status)
  • Autocompletes (autores, editoras, tags, livros disponíveis e todos os livros)
  • Controle de permissões por feature flag
  • Rotas protegidas para autenticação e autorização
  • Layout público e layout administrativo responsivos

Em progresso ou parcialmente disponível

  • Área de favoritos (página existente, sem persistência no backend)
  • Relatórios administrativos: endpoint /reports/dashboard implementado e rota administrativa disponível
  • Cadastro aberto (/register) usa atualmente o fluxo de ativação por convite

🧰 Tecnologias Utilizadas

Frontend

  • React 19
  • TypeScript
  • React Router DOM v7
  • SCSS Modules
  • Lucide React
  • Vite

Backend

  • Node.js
  • Express 5
  • TypeScript
  • Sequelize ORM
  • JWT (jsonwebtoken)
  • Zod (validação)
  • Multer (uploads)
  • Resend (e-mail)

Banco de dados

  • PostgreSQL

Outros

  • Docker
  • Docker Compose
  • ESLint
  • npm Workspaces (monorepo)

🗂 Estrutura do Projeto

librix/
├── apps/
│ ├── api/ # Backend (Express + Sequelize)
│ │ ├── src/
│ │ │ ├── controllers/ # Regras de negócio e endpoints
│ │ │ ├── database/ # Modelos e conexão Sequelize
│ │ │ ├── http/ # App Express e rotas
│ │ │ ├── middleware/ # Auth, validação de body, upload
│ │ │ └── schemas/ # Schemas Zod
│ │ └── thumbnails/ # Uploads de capas no backend
│ └── web/ # Frontend (React + Vite)
│ └── src/
│ ├── components/ # Componentes reutilizáveis
│ ├── contexts/ # Context API (usuário)
│ ├── layouts/ # Layout público e administrativo
│ ├── pages/ # Páginas públicas, privadas e admin
│ └── styles/ # Variáveis e estilos globais
├── migrations/ # Migrations Sequelize (monorepo root)
└── packages/
├── flags/ # Bitflags de permissões
└── types/ # Tipos compartilhados entre apps

✅ Pré-requisitos

  • Node.js 20+
  • npm 10+
  • PostgreSQL 14+ (local) ou Docker + Docker Compose
  • Git

Opcional:

  • VS Code com extensões de TypeScript/ESLint/SCSS

📥 Clonando o Projeto

git clone https://github.com/jvopinho/librix.git
cd librix

📦 Instalando as Dependências

Este projeto é um monorepo com npm workspaces.

npm install

Isso instala as dependências de:

  • apps/api
  • apps/web
  • packages/flags
  • packages/types

⚙️ Configuração do Ambiente

Backend

Arquivo: apps/api/.env

Você pode copiar de apps/api/.env.example:

cp apps/api/.env.example apps/api/.env

Exemplo completo:

PORT=3001POSTGRES_USER=postgresPOSTGRES_PASSWORD=passwordPOSTGRES_DB=postgresPOSTGRES_PORT=5432POSTGRES_ENDPOINT=localhost:5432RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxJWT_SESSION_SECRET=supersecretkeyJWT_FIRST_ACCESS_SECRET=supersecretkeyPASSWORD_SALT_ROUNDS=10WEB_URL=http://localhost:5173

Significado das variáveis

  • PORT: porta lógica da API (observação: atualmente o servidor inicia fixo em 7654 no código)
  • POSTGRES_USER: usuário do banco PostgreSQL
  • POSTGRES_PASSWORD: senha do banco PostgreSQL
  • POSTGRES_DB: nome do banco
  • POSTGRES_PORT: porta do PostgreSQL
  • POSTGRES_ENDPOINT: host:porta do PostgreSQL
  • RESEND_API_KEY: chave da API de envio de e-mails (ativação e recuperação)
  • JWT_SESSION_SECRET: segredo para token de sessão
  • JWT_FIRST_ACCESS_SECRET: segredo adicional de primeiro acesso
  • PASSWORD_SALT_ROUNDS: custo do hash bcrypt
  • WEB_URL: URL da aplicação frontend para CORS e links de e-mail

Frontend

Arquivo: apps/web/.env (opcional)

VITE_API_URL=http://localhost:7654

Significado

  • VITE_API_URL: base URL da API consumida no frontend.
  • Se não for definido, o frontend usa http://localhost:7654 por padrão.

🗄 Banco de Dados

1) Criar banco via Docker (recomendado para dev)

npm run compose:dev:up

Comando acima sobe o PostgreSQL com base no arquivo docker-compose.dev.yml e no .env do backend.

2) Rodar migrations

npm run db:migrate --workspace @librix/api

3) Gerar nova migration

Há script no backend, mas em ambiente de shell o fluxo mais previsível é:

cd apps/api
npx dotenv -e .env -- sequelize-cli migration:generate --name nome_da_migration

4) Atualizar schema com novas migrations

npm run db:migrate --workspace @librix/api

5) Resetar banco (desenvolvimento)

cd apps/api
npx dotenv -e .env -- sequelize-cli db:migrate:undo:all
npx dotenv -e .env -- sequelize-cli db:migrate

6) Seed

Atualmente não há script de seed versionado no projeto.

  • Para popular dados, use os endpoints administrativos após autenticação.

▶️ Rodando o Projeto

Backend

npm run dev --workspace @librix/api
  • API disponível em: http://localhost:7654

Frontend

npm run dev --workspace @librix/web
  • Frontend disponível em: http://localhost:5173 (padrão Vite)

👤 Usuário Administrador

O usuário administrador possui id 1, quando a api iniciar ela verifica se existe o usuário cadastrado, caso não possua ela irá criar e em seguida enviar o login e senha no terminal.


📜 Scripts Disponíveis

EscopoScriptComandoDescrição
rootcompose:dev:upnpm run compose:dev:upSobe PostgreSQL via Docker Compose
rootcompose:dev:startnpm run compose:dev:startInicia containers já criados
apidevnpm run dev --workspace @librix/apiDesenvolvimento backend com watch
apibuildnpm run build --workspace @librix/apiBuild TypeScript backend
apistartnpm run start --workspace @librix/apiInicia backend compilado
apidb:migratenpm run db:migrate --workspace @librix/apiExecuta migrations
apidb:generatenpm run db:generate --workspace @librix/apiGera migration (depende do shell)
webdevnpm run dev --workspace @librix/webDesenvolvimento frontend
webbuildnpm run build --workspace @librix/webBuild frontend
webpreviewnpm run preview --workspace @librix/webPreview do build frontend
weblintnpm run lint --workspace @librix/webLint frontend
flagsbuildnpm run build --workspace @librix/flagsBuild do pacote de permissões

🔄 Fluxo da Aplicação

Usuário
↓
Login / Ativação de Conta
↓
Autenticação (JWT)
↓
Resolução de Permissões (feature flags)
↓
Dashboard / Home
↓
Operações (livros, usuários, empréstimos, administração)

🔐 Controle de Permissões

O sistema usa feature flags com bitfield em @librix/flags.

Administrador

Pode:

  • gerenciar usuários
  • gerenciar livros
  • gerenciar empréstimos
  • acessar relatórios
  • acessar dashboard administrativo

Bibliotecário / Gestor (perfil intermediário)

Pode:

  • gerenciar livros
  • gerenciar empréstimos
  • visualizar/editar usuários (conforme features atribuídas)

Leitor

Pode:

  • visualizar catálogo
  • visualizar detalhes de livros
  • visualizar próprios empréstimos
  • realizar operações restritas ao próprio contexto (dependendo das features)

Observação importante:

  • permissões efetivas dependem das features atribuídas ao usuário na base.

🧭 Rotas Principais

Públicas

/
/home
/books
/books/:id
/login
/register
/forgot-password
/reset-password/:token
/activate-account
/users/activate
/users/activate/invalid

Protegidas (usuário autenticado)

/profile
/my-loans
/favorites

Administrativas

/admin
/admin/dashboard
/admin/books
/admin/books/create
/admin/books/new
/admin/books/edit/:id
/admin/users
/admin/loans
/admin/loans/new
---- NÃO IMPLEMENTADAS ----
/admin/authors
/admin/publishers
/admin/categories
/admin/reports
/admin/settings

Observação:

  • algumas rotas administrativas apontam para páginas placeholder no frontend.

🌐 API

Base local padrão:

  • http://localhost:7654

Documentação Swagger local:

  • http://localhost:7654/api-docs
  • http://localhost:7654/swagger.json

Frontend consome API via helper (getApiUrl) em:

  • apps/web/src/helpers/api-url.ts

🖼 Uploads

  • Armazenamento local em: apps/api/thumbnails
  • Servido estaticamente em: GET /thumbnails/:filename
  • Middleware: Multer (apps/api/src/middleware/upload-middleware.ts)
  • Nome do arquivo: hash aleatório + extensão original

Limites e formatos

  • Não há limite de tamanho configurado atualmente no Multer.
  • Não há validação explícita de MIME type/extensão no backend atual.

Recomendação para produção:

  • adicionar limite de tamanho
  • validar MIME type
  • mover armazenamento para bucket (S3, GCS, etc.)

🔑 Recuperação de Senha

Fluxo implementado:

  1. Solicitar recuperação: POST /auth/forgot-password
  2. API gera token e envia e-mail via Resend
  3. Frontend valida token: GET /auth/reset-password/:token
  4. Frontend envia nova senha: POST /auth/reset-password

📄 Paginação

Padrão implementado em endpoints list:

GET /books/all?page=1&limit=20GET /users?page=1&limit=10GET /loans?page=1&limit=10GET /loans/my-loans?page=1&limit=10

Resposta segue formato semelhante:

{
"data": [],
"page": 1,
"limit": 10,
"total": 0,
"totalPages": 0
}

🔎 Busca

Exemplos reais:

GET /books/all?search=harryGET /users?search=joaoGET /loans?search=maria

🧪 Filtros

Exemplos disponíveis hoje:

GET /books/all?author=MachadoGET /books/all?category=RomanceGET /books/all?isbn=978GET /books/all?availability=trueGET /users?status=ACTIVEGET /loans?status=BORROWEDGET /loans?status=LATEGET /loans?status=RETURNED

Ordenação também disponível em listagens:

GET /books/all?sortBy=title&sortOrder=ASCGET /users?sortBy=name&sortOrder=DESC

🛠 Desenvolvimento

Fluxo recomendado para contribuição:

  1. Criar branch de feature:
git checkout -b feat/nome-da-feature
  1. Implementar alterações
  2. Rodar lint/build localmente
  3. Commitar com mensagens claras
  4. Abrir Pull Request com contexto e evidências

Exemplo de verificação local:

npm run lint --workspace @librix/web
npm run build --workspace @librix/api
npm run build --workspace @librix/web

📐 Boas Práticas

  • TypeScript em frontend e backend
  • SCSS Modules para isolamento de estilos
  • Componentização de UI
  • Uso de hooks para estado/contexto
  • Organização por domínio (controllers, pages, components)
  • Validação de entrada com Zod
  • Linting com ESLint

Observação:

  • ainda existem pontos do frontend/backend com any que podem ser gradualmente eliminados.

📄 Licença

Projeto licenciado sob MIT.

Consulte o arquivo LICENSE na raiz para o texto completo.


📬 Contato

Responsável atual pelo repositório:

  • João Pinho — jvopinho.contato@gmail.com

Repositório:

About

📚 Librix: Plataforma para Gerenciamento de Biblioteca, desenvolvida como projeto de Back-end para o curso de Análise e Desenvolvimento de Sistemas da UTFPR-CP

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages