{"id":31842604,"url":"https://github.com/luizcurti/aws-sls-upload-s3","last_synced_at":"2026-05-15T01:33:37.746Z","repository":{"id":318208579,"uuid":"1064759700","full_name":"luizcurti/aws-sls-upload-s3","owner":"luizcurti","description":"Node.js service with Lambda + Serverless ","archived":false,"fork":false,"pushed_at":"2026-02-20T18:38:54.000Z","size":119,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-20T23:48:11.563Z","etag":null,"topics":["api","lambda","nodejs","serverless"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/luizcurti.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-09-26T14:07:12.000Z","updated_at":"2026-02-20T18:39:22.000Z","dependencies_parsed_at":"2025-10-05T21:07:46.994Z","dependency_job_id":"0cc17367-b4ea-48cf-9ee0-05d1905a1060","html_url":"https://github.com/luizcurti/aws-sls-upload-s3","commit_stats":null,"previous_names":["luizcurti/aws-sls-upload-s3"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/luizcurti/aws-sls-upload-s3","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luizcurti%2Faws-sls-upload-s3","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luizcurti%2Faws-sls-upload-s3/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luizcurti%2Faws-sls-upload-s3/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luizcurti%2Faws-sls-upload-s3/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luizcurti","download_url":"https://codeload.github.com/luizcurti/aws-sls-upload-s3/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luizcurti%2Faws-sls-upload-s3/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33050272,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"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":["api","lambda","nodejs","serverless"],"created_at":"2025-10-12T06:28:11.257Z","updated_at":"2026-05-15T01:33:37.738Z","avatar_url":"https://github.com/luizcurti.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AWS S3 Image Upload (Serverless)\n\nA Serverless TypeScript application that receives an `imageURL`, downloads the image, and uploads it to an S3 bucket using AWS SDK v3.\n\n## Stack\n\n- AWS Lambda + API Gateway HTTP API\n- S3 (`@aws-sdk/client-s3`)\n- Serverless Framework v4\n- Jest + ESLint + TypeScript\n- LocalStack (local development)\n\n## Prerequisites\n\n- Node.js `\u003e= 20`\n- npm\n- Docker (for LocalStack)\n- AWS CLI (local scripts)\n\n## Instalação\n\n```bash\nnpm install\ncp .env.example .env.local\n```\n\n## Environment variables\n\nSet these in `.env.local`:\n\n- `S3_BUCKET_NAME`: target bucket\n- `AWS_REGION` / `AWS_DEFAULT_REGION`: AWS region\n- `IS_LOCAL=true`: for local LocalStack integration\n- `AWS_ENDPOINT_URL=http://localhost:4566`: LocalStack endpoint\n\nOn deploy, `serverless.yml` injects `BUCKET_NAME` from `S3_BUCKET_NAME`.\n\n## API\n\nEndpoint:\n\n- `POST /upload`\n\nRequest:\n\n```json\n{\n  \"imageURL\": \"https://example.com/image.jpg\"\n}\n```\n\nSuccess response (`200`):\n\n```json\n{\n  \"link\": \"https://\u003cbucket\u003e.s3.amazonaws.com/image.jpg\"\n}\n```\n\nCommon errors:\n\n- `400`: invalid body or missing `imageURL`\n- `500`: bucket not configured or fetch/upload failure\n\n## Local development\n\n```bash\nnpm run localstack:setup\nnpm run deploy:local\n```\n\nUseful commands:\n\n- `npm run docker:up`\n- `npm run docker:down`\n- `npm run docker:logs`\n- `npm run localstack:status`\n\n## Qualidade\n\n- `npm run lint`\n- `npm run lint:tsc`\n- `npm test`\n- `npm run test:coverage`\n- `npm run validate`\n\n## CI/CD\n\nPipeline defined in [.github/workflows/ci.yml](.github/workflows/ci.yml), running on `push` and `pull_request` for `main`.\n\n### Job `test`\n\n1. `npm install`\n2. `npm run lint`\n3. `npm run lint:tsc`\n4. `npm run test:coverage`\n5. Upload de cobertura para Codecov (não bloqueante)\n\n### Job `build`\n\n1. `npm install`\n2. `npm run build:ci`\n\n## Checklist local antes de PR\n\nRun the same CI checks locally to avoid failures:\n\n```bash\nnpm run lint\nnpm run lint:tsc\nnpm run test:coverage\nnpm run build:ci\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluizcurti%2Faws-sls-upload-s3","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluizcurti%2Faws-sls-upload-s3","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluizcurti%2Faws-sls-upload-s3/lists"}