# Rephi
A production-ready Phoenix boilerplate with JWT authentication, RBAC authorization, WebSocket support, and multi-frontend architecture.
## 🚀 Inicio Rápido
### Prerrequisitos
- **Elixir** 1.14 o superior
- **Erlang** 24 o superior
- **PostgreSQL** 12 o superior
- **Node.js** 18 o superior
- **npm** o **yarn**
### 📥 Instalación Inicial
1. **Clonar el repositorio**
```bash
git clone <repository-url>
cd rephi
```
2. **Configurar variables de entorno**
```bash
cp .env.example .env
```
Edita el archivo `.env` con tus configuraciones:
- Credenciales de base de datos
- Claves secretas (genera nuevas con `mix phx.gen.secret`)
- Configuración de puertos y hosts
### 🔧 Configuración del Backend
1. **Instalar dependencias**
```bash
mix deps.get
```
2. **Configurar la base de datos**
```bash
mix ecto.create
mix ecto.migrate
```
O usar el comando de setup completo:
```bash
mix setup
```
3. **Iniciar el servidor Phoenix**
```bash
mix phx.server
```
O con shell interactivo:
```bash
iex -S mix phx.server
```
El backend estará disponible en `http://localhost:4000`
### 💻 Configuración del Frontend
1. **Navegar al directorio del frontend**
```bash
cd front/rephi-front
```
2. **Instalar dependencias**
```bash
npm install
```
3. **Iniciar el servidor de desarrollo**
```bash
npm run dev
```
El frontend estará disponible en `http://localhost:5173` (o el puerto configurado)
## 📚 API Documentation
La documentación interactiva de la API está disponible mediante Swagger:
- **Swagger UI**: `http://localhost:4000/api/swagger`
- **Swagger JSON**: `http://localhost:4000/api/swagger/swagger.json`
Para regenerar la documentación después de cambios:
```bash
mix phx.swagger.generate
```
## 🛠️ Comandos Útiles
### Backend
```bash
# Ejecutar pruebas
mix test
# Formatear código
mix format
# Limpiar y reconstruir
mix clean && mix compile
# Resetear base de datos
mix ecto.reset
# Generar documentación Swagger
mix phx.swagger.generate
```
### Frontend
```bash
# Construir para producción
npm run build
# Ejecutar linter
npm run lint
# Verificar tipos TypeScript
npm run typecheck
# Iniciar servidor de producción
npm start
```
## 🏗️ Arquitectura
### Backend (Phoenix/Elixir)
- **API REST** bajo `/api/*`
- **Autenticación JWT** con Guardian
- **WebSockets** con Phoenix Channels
- **Base de datos** PostgreSQL con Ecto
- **Documentación** automática con Phoenix Swagger
### Frontend (Remix/React)
- **SPA Mode** sin SSR
- **Estado Global** con Zustand (persistido)
- **Formularios** con React Hook Form + Zod
- **Estilos** con Tailwind CSS v4
- **Cliente API** con Axios
## 🔐 Autenticación y Autorización
### Autenticación JWT
1. Los usuarios se registran/autentican en `/api/users/register` o `/api/users/login`
2. El JWT se almacena en Zustand y localStorage
3. Axios interceptor añade automáticamente el header `Authorization: Bearer {token}`
4. Los endpoints protegidos requieren autenticación válida
### Sistema de Roles y Permisos (RBAC)
Rephi incluye un sistema completo de control de acceso basado en roles (RBAC) con las siguientes características:
#### 🎭 Roles y Jerarquías
- **Roles jerárquicos**: Los roles pueden heredar permisos de otros roles
- **Roles por defecto**:
- `admin` → hereda de `manager`
- `manager` → hereda de `user`
- `user` → acceso básico
#### 🔑 Permisos Granulares
Los permisos están organizados por categorías:
- **users:** - Gestión de usuarios (`users:view`, `users:create`, `users:edit`, `users:delete`)
- **roles:** - Gestión de roles (`roles:view`, `roles:create`, `roles:edit`, `roles:delete`, `roles:assign`)
- **permissions:** - Gestión de permisos (`permissions:view`, `permissions:create`, etc.)
- **system:** - Configuración del sistema (`system:settings`, `system:logs`, `system:manage`)
#### 🛡️ Verificaciones de Autorización
**En Controladores:**
```elixir
# Proteger acciones individuales
plug AuthorizationPlug, {:permission, "users:edit"}
plug AuthorizationPlug, {:role, "admin"}
plug AuthorizationPlug, {:any_permission, ["users:create", "users:edit"]}
plug AuthorizationPlug, {:all_permissions, ["users:edit", "system:manage"]}
# Verificaciones manuales
if can?(conn, "users:edit") do
# Usuario puede editar usuarios
end
if has_role?(conn, "admin") do
# Usuario tiene rol de admin
end
```
**En el Contexto:**
```elixir
# Verificaciones directas
Authorization.can?(user, "users:edit")
Authorization.has_role?(user, "admin")
Authorization.role_has_permission?(role, permission)
# Verificaciones flexibles
Authorization.can_by?(user: user, permission: "system:manage")
Authorization.can_by?(user: user, role: "admin")
# Obtener datos
Authorization.get_user_roles(user)
Authorization.get_user_permissions(user)
Authorization.get_role_permissions(role)
```
#### 📡 API de Roles y Permisos
**Gestión de Roles:**
```bash
GET /api/roles # Listar roles
POST /api/roles # Crear rol
GET /api/roles/:id # Obtener rol específico
PUT /api/roles/:id # Actualizar rol
DELETE /api/roles/:id # Eliminar rol
# Asignación de roles a usuarios
POST /api/users/:user_id/roles/:role_id # Asignar rol
DELETE /api/users/:user_id/roles/:role_id # Quitar rol
```
**Gestión de Permisos:**
```bash
GET /api/permissions # Listar permisos
POST /api/permissions # Crear permiso
GET /api/permissions/:id # Obtener permiso específico
PUT /api/permissions/:id # Actualizar permiso
DELETE /api/permissions/:id # Eliminar permiso
# Asignación de permisos a roles
POST /api/roles/:role_id/permissions/:perm_id # Asignar permiso
DELETE /api/roles/:role_id/permissions/:perm_id # Quitar permiso
```
**Información del Usuario Actual:**
```bash
GET /api/me # Incluye roles y permisos del usuario autenticado
```
#### 🌱 Datos Semilla
Al ejecutar `mix ecto.reset` o `mix run priv/repo/seeds.exs`, se crean automáticamente:
- **3 roles** con jerarquía (admin → manager → user)
- **17 permisos** categorizados por funcionalidad
- **Usuario administrador** (`admin@admin.com` / `password123!!`) con rol admin
#### 💡 JWT Integrado
Los tokens JWT incluyen automáticamente:
- Lista de roles del usuario (`"roles": ["admin", "manager"]`)
- Lista de permisos efectivos (`"permissions": ["users:view", "users:create", ...]`)
#### 🔧 Helpers de Autorización
Disponibles en todos los controladores y vistas:
```elixir
can?(conn, "permission:slug") # ¿Tiene permiso específico?
has_role?(conn, "role_slug") # ¿Tiene rol específico?
can_any?(conn, ["perm1", "perm2"]) # ¿Tiene alguno de estos permisos?
can_all?(conn, ["perm1", "perm2"]) # ¿Tiene todos estos permisos?
current_user_roles(conn) # Roles del usuario actual
current_user_permissions(conn) # Permisos del usuario actual
authorize(conn, permission: "users:edit") # Verificación flexible
```
## 📡 WebSockets
La conexión WebSocket se establece en `ws://localhost:4000/socket` con canales específicos por usuario.
**✅ Seguridad**: Las conexiones WebSocket validan el token JWT antes de permitir la conexión. Los tokens inválidos o ausentes son rechazados automáticamente.
## Testing
```bash
# Run backend tests
mix test
# Run with coverage
mix test --cover
```
## Deployment
### Building for Production
```bash
# Backend
MIX_ENV=prod mix compile
MIX_ENV=prod mix assets.deploy
# Frontends
mix frontends.build
```
### Docker Support
```bash
docker build -t rephi .
docker run -p 4000:4000 rephi
```
## Publishing to Hex.pm
1. Update the version in `mix.exs`
2. Update `CHANGELOG.md` with release notes
3. Ensure tests pass: `mix test`
4. Create git tag: `git tag -a v0.1.0 -m "Release v0.1.0"`
5. Publish: `mix hex.publish`
## Contributing
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.