{"id":32478036,"url":"https://github.com/pnvdev/url-shortener-api","last_synced_at":"2026-07-02T23:32:41.249Z","repository":{"id":318223046,"uuid":"1070359957","full_name":"pnvdev/url-shortener-api","owner":"pnvdev","description":"Laravel API for a url shortener project","archived":false,"fork":false,"pushed_at":"2025-10-07T03:12:07.000Z","size":99,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-26T23:38:40.399Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pnvdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-05T19:10:12.000Z","updated_at":"2025-10-07T03:12:11.000Z","dependencies_parsed_at":"2025-10-05T23:23:25.900Z","dependency_job_id":"1cc5f23b-62d0-4ef2-988b-e64fecafe559","html_url":"https://github.com/pnvdev/url-shortener-api","commit_stats":null,"previous_names":["pnvdev/url-shortener-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pnvdev/url-shortener-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnvdev%2Furl-shortener-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnvdev%2Furl-shortener-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnvdev%2Furl-shortener-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnvdev%2Furl-shortener-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pnvdev","download_url":"https://codeload.github.com/pnvdev/url-shortener-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnvdev%2Furl-shortener-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35067031,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-02T02:00:06.368Z","response_time":173,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-26T23:26:52.971Z","updated_at":"2026-07-02T23:32:41.240Z","avatar_url":"https://github.com/pnvdev.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🔗 URL Shortener API\n\nUna API REST moderna y eficiente para acortar URLs, construida con Laravel 8 y documentada con Swagger/OpenAPI.\n\n[![Laravel](https://img.shields.io/badge/Laravel-8.x-FF2D20?style=for-the-badge\u0026logo=laravel\u0026logoColor=white)](https://laravel.com)\n[![PHP](https://img.shields.io/badge/PHP-8.2-777BB4?style=for-the-badge\u0026logo=php\u0026logoColor=white)](https://php.net)\n[![MySQL](https://img.shields.io/badge/MySQL-5.7%2B-4479A1?style=for-the-badge\u0026logo=mysql\u0026logoColor=white)](https://www.mysql.com/)\n[![License](https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge)](LICENSE)\n\n## 📋 Tabla de Contenidos\n\n- [Características](#-características)\n- [Requisitos Previos](#-requisitos-previos)\n- [Instalación Local](#-instalación-local)\n- [Despliegue en la Nube](#-despliegue-en-la-nube)\n- [Documentación de la API](#-documentación-de-la-api)\n- [Pruebas](#-pruebas)\n- [Solución de Problemas](#-solución-de-problemas)\n- [Licencia](#-licencia)\n\n## ✨ Características\n\n- 🚀 **API RESTful** - Endpoints claros y bien estructurados\n- 📝 **Documentación Swagger** - Documentación interactiva de la API\n- 🔐 **Validación de URLs** - Validación completa de URLs originales\n- 🎲 **Códigos Únicos** - Generación automática de códigos cortos únicos\n- 📊 **Estadísticas** - Contador de clics para cada URL acortada\n- 🗄️ **Base de Datos MySQL** - Almacenamiento persistente y confiable\n- ✅ **Testing** - Suite completa de tests unitarios y de integración\n\n## 🔧 Requisitos Previos\n\nAntes de comenzar, asegúrate de tener instalado:\n\n- **PHP** \u003e= 7.3 (recomendado: PHP 8.2)\n- **Composer** \u003e= 2.0\n- **MySQL** \u003e= 5.7 o **MariaDB** \u003e= 10.2\n- **Node.js** \u003e= 12.x y **NPM** \u003e= 6.x (opcional, para assets)\n- **Git** (para clonar el repositorio)\n\n### Verificar instalaciones:\n\n```bash\nphp --version\ncomposer --version\nmysql --version\nnode --version\nnpm --version\n```\n\n## 🚀 Instalación Local\n\n### Paso 1: Clonar el Repositorio\n\n```bash\ngit clone https://github.com/pnvdev/url-shortener-api.git\ncd url-shortener-api\n```\n\n### Paso 2: Instalar Dependencias\n\n```bash\n# Instalar dependencias de PHP\ncomposer install\n\n# (Opcional) Instalar dependencias de Node.js\nnpm install\n```\n\n### Paso 3: Configurar Variables de Entorno\n\n```bash\n# Copiar el archivo de ejemplo\ncp .env.example .env\n\n# Generar la clave de aplicación\nphp artisan key:generate\n```\n\n### Paso 4: Configurar Base de Datos\n\nEdita el archivo `.env` con tu configuración de base de datos:\n\n```env\nDB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=url_shortener\nDB_USERNAME=root\nDB_PASSWORD=tu_contraseña\n```\n\nCrea la base de datos:\n\n```bash\n# En MySQL\nmysql -u root -p\nCREATE DATABASE url_shortener CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nEXIT;\n```\n\n### Paso 5: Ejecutar Migraciones\n\n```bash\nphp artisan migrate\n```\n\n### Paso 6: Generar Documentación de Swagger\n\n```bash\nphp artisan l5-swagger:generate\n```\n\n### Paso 7: Iniciar el Servidor de Desarrollo\n\n```bash\nphp artisan serve\n```\n\nLa aplicación estará disponible en: `http://localhost:8000`\n\nLa documentación Swagger estará en: `http://localhost:8000/api/documentation`\n\n### 🧪 Ejecutar Tests (Opcional)\n\n```bash\n# Ejecutar todos los tests\nphp artisan test\n\n# O con PHPUnit\n./vendor/bin/phpunit\n```\n\n## ☁️ Despliegue en la Nube\n\n### Opción 1: Despliegue en AWS EC2\n\n#### Paso 1: Crear una Instancia EC2\n\n1. Accede a [AWS Console](https://console.aws.amazon.com)\n2. Ve a **EC2** \u003e **Launch Instance**\n3. Configura tu instancia:\n   - **AMI**: Ubuntu Server 22.04 LTS\n   - **Instance Type**: t2.micro (Free tier) o t2.small\n   - **Key pair**: Crea una nueva o selecciona una existente\n   - **Security Group**: Permite SSH (22), HTTP (80), HTTPS (443)\n\n#### Paso 2: Conectarse al Servidor\n\n```bash\nchmod 400 tu-key.pem\nssh -i \"tu-key.pem\" ubuntu@tu-ip-ec2\n```\n\n#### Paso 3: Actualizar el Sistema\n\n```bash\nsudo apt update \u0026\u0026 sudo apt upgrade -y\n```\n\n#### Paso 4: Instalar LEMP Stack (Linux, Nginx, MySQL, PHP)\n\n```bash\n# Instalar Nginx\nsudo apt install nginx -y\n\n# Instalar MySQL\nsudo apt install mysql-server -y\nsudo mysql_secure_installation\n\n# Instalar PHP y extensiones necesarias\nsudo apt install php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl php8.2-zip php8.2-bcmath php8.2-json php8.2-tokenizer -y\n\n# Verificar instalación de PHP\nphp -v\n```\n\n#### Paso 5: Instalar Composer\n\n```bash\ncd ~\ncurl -sS https://getcomposer.org/installer -o composer-setup.php\nsudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer\ncomposer --version\n```\n\n#### Paso 6: Configurar MySQL\n\n```bash\n# Acceder a MySQL\nsudo mysql\n\n# Crear base de datos y usuario\nCREATE DATABASE url_shortener CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nCREATE USER 'url_shortener_user'@'localhost' IDENTIFIED BY 'contraseña_segura';\nGRANT ALL PRIVILEGES ON url_shortener.* TO 'url_shortener_user'@'localhost';\nFLUSH PRIVILEGES;\nEXIT;\n```\n\n#### Paso 7: Clonar el Repositorio\n\n```bash\n# Instalar Git\nsudo apt install git -y\n\n# Crear directorio para aplicaciones web\nsudo mkdir -p /var/www\ncd /var/www\n\n# Clonar el repositorio\nsudo git clone https://github.com/pnvdev/url-shortener-api.git\ncd url-shortener-api\n\n# Establecer permisos\nsudo chown -R www-data:www-data /var/www/url-shortener-api\nsudo chmod -R 755 /var/www/url-shortener-api\nsudo chmod -R 775 /var/www/url-shortener-api/storage\nsudo chmod -R 775 /var/www/url-shortener-api/bootstrap/cache\n```\n\n#### Paso 8: Instalar Dependencias\n\n```bash\ncd /var/www/url-shortener-api\nsudo composer install --optimize-autoloader --no-dev\n```\n\n#### Paso 9: Configurar Variables de Entorno\n\n```bash\n# Copiar archivo de configuración\nsudo cp .env.example .env\n\n# Editar el archivo .env\nsudo nano .env\n```\n\nConfigurar las siguientes variables:\n\n```env\nAPP_NAME=\"URL Shortener API\"\nAPP_ENV=production\nAPP_KEY=\nAPP_DEBUG=false\nAPP_URL=http://tu-ip-ec2\n\nDB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=url_shortener\nDB_USERNAME=url_shortener_user\nDB_PASSWORD=contraseña_segura\n\nL5_SWAGGER_CONST_HOST=http://tu-ip-ec2\n```\n\n```bash\n# Generar clave de aplicación\nsudo php artisan key:generate\n\n# Ejecutar migraciones\nsudo php artisan migrate --force\n\n# Generar documentación Swagger\nsudo php artisan l5-swagger:generate\n\n# Optimizar aplicación\nsudo php artisan config:cache\nsudo php artisan route:cache\nsudo php artisan view:cache\n```\n\n#### Paso 10: Configurar Nginx\n\n```bash\nsudo nano /etc/nginx/sites-available/url-shortener\n```\n\nAgregar la siguiente configuración:\n\n```nginx\nserver {\n    listen 80;\n    server_name tu-ip-ec2;\n    root /var/www/url-shortener-api/public;\n\n    add_header X-Frame-Options \"SAMEORIGIN\";\n    add_header X-Content-Type-Options \"nosniff\";\n\n    index index.php;\n\n    charset utf-8;\n\n    location / {\n        try_files $uri $uri/ /index.php?$query_string;\n    }\n\n    location = /favicon.ico { access_log off; log_not_found off; }\n    location = /robots.txt  { access_log off; log_not_found off; }\n\n    error_page 404 /index.php;\n\n    location ~ \\.php$ {\n        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;\n        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;\n        include fastcgi_params;\n    }\n\n    location ~ /\\.(?!well-known).* {\n        deny all;\n    }\n}\n```\n\n```bash\n# Habilitar el sitio\nsudo ln -s /etc/nginx/sites-available/url-shortener /etc/nginx/sites-enabled/\nsudo rm /etc/nginx/sites-enabled/default\n\n# Verificar configuración de Nginx\nsudo nginx -t\n\n# Reiniciar Nginx\nsudo systemctl restart nginx\n```\n\n## 📚 Documentación de la API\n\n### Endpoints Disponibles\n\n#### 1. Crear URL Corta\n\n```http\nPOST /api/short-urls\nContent-Type: application/json\n\n{\n  \"original_url\": \"https://www.ejemplo.com/una/url/muy/larga\"\n}\n```\n\n**Respuesta exitosa (201):**\n\n```json\n{\n  \"id\": 1,\n  \"original_url\": \"https://www.ejemplo.com/una/url/muy/larga\",\n  \"short_code\": \"abc123\",\n  \"short_url\": \"http://tu-ip-ec2/s/abc123\",\n  \"clicks\": 0,\n  \"created_at\": \"2025-10-06T10:30:00.000000Z\"\n}\n```\n\n#### 2. Redirigir a URL Original\n\n```http\nGET /s/{shortCode}\n```\n\nRedirige automáticamente a la URL original e incrementa el contador de clics.\n\n### Documentación Interactiva\n\nAccede a la documentación completa de Swagger en:\n\n```\nhttp://tu-ip-ec2/api/documentation\n```\n\n## 🧪 Pruebas\n\n### Ejecutar Tests Localmente\n\n```bash\n# Todos los tests\nphp artisan test\n\n# Tests específicos\nphp artisan test --filter=UrlTest\n\n# Con cobertura de código\nphp artisan test --coverage\n```\n\n### Ejecutar Tests en Producción\n\n```bash\n# En tu servidor\ncd /var/www/url-shortener-api\nphp artisan test --env=testing\n```\n\n## 🔍 Solución de Problemas\n\n### Error: \"Class 'Composer\\InstalledVersions' not found\"\n\n```bash\ncomposer dump-autoload\n```\n\n### Error: Permisos de Storage\n\n```bash\nsudo chmod -R 775 storage bootstrap/cache\nsudo chown -R www-data:www-data storage bootstrap/cache\n```\n\n### Error: \"No application encryption key has been specified\"\n\n```bash\nphp artisan key:generate\n```\n\n### Error: Swagger no se genera\n\n```bash\nphp artisan config:clear\nphp artisan cache:clear\nphp artisan l5-swagger:generate\n```\n\n### Error de Conexión a Base de Datos\n\n1. Verifica las credenciales en `.env`\n2. Asegúrate de que MySQL está ejecutándose\n3. Verifica que el firewall permita conexiones\n\n```bash\n# Verificar MySQL\nsudo systemctl status mysql\n\n# Reiniciar MySQL\nsudo systemctl restart mysql\n```\n\n### Error 502 Bad Gateway (Nginx)\n\n```bash\n# Verificar PHP-FPM\nsudo systemctl status php8.2-fpm\n\n# Reiniciar PHP-FPM\nsudo systemctl restart php8.2-fpm\n```\n\n## 🔐 Seguridad\n\n### Recomendaciones de Producción\n\n1. **Nunca** dejes `APP_DEBUG=true` en producción\n2. Usa contraseñas seguras para la base de datos\n3. Configura HTTPS con certificados SSL\n4. Mantén PHP y Laravel actualizados\n5. Configura rate limiting para prevenir abuso\n6. Realiza backups regulares de la base de datos\n\n## 🤝 Contribuir\n\nLas contribuciones son bienvenidas. Por favor:\n\n1. Fork el proyecto\n2. Crea una rama para tu feature (`git checkout -b feature/AmazingFeature`)\n3. Commit tus cambios (`git commit -m 'Add some AmazingFeature'`)\n4. Push a la rama (`git push origin feature/AmazingFeature`)\n5. Abre un Pull Request\n\n## 📝 Licencia\n\nEste proyecto está bajo la licencia MIT. Ver el archivo [LICENSE](LICENSE) para más detalles.\n\n## 📧 Contacto\n\n- **GitHub**: [@pnvdev](https://github.com/pnvdev)\n- **Proyecto**: [url-shortener-api](https://github.com/pnvdev/url-shortener-api)\n\n---\n\n⭐ Si este proyecto te fue útil, considera darle una estrella en GitHub!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpnvdev%2Furl-shortener-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpnvdev%2Furl-shortener-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpnvdev%2Furl-shortener-api/lists"}