{"id":22729531,"url":"https://github.com/huythanh0x/udemy_coupon_server_java_spring","last_synced_at":"2026-04-16T00:32:03.984Z","repository":{"id":266469103,"uuid":"827671693","full_name":"Huythanh0x/udemy_coupon_server_java_spring","owner":"Huythanh0x","description":"100% off Udemy coupons. Access paid courses for free at my site","archived":false,"fork":false,"pushed_at":"2026-04-11T05:33:52.000Z","size":459,"stargazers_count":5,"open_issues_count":7,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-11T07:21:41.115Z","etag":null,"topics":["free","java","spring","udemy"],"latest_commit_sha":null,"homepage":"https://coupons.thanh0x.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Huythanh0x.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","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":"2024-07-12T06:21:46.000Z","updated_at":"2026-04-11T05:33:58.000Z","dependencies_parsed_at":"2024-12-04T22:01:23.035Z","dependency_job_id":null,"html_url":"https://github.com/Huythanh0x/udemy_coupon_server_java_spring","commit_stats":null,"previous_names":["huythanh0x/udemy_coupon_server_java_spring"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Huythanh0x/udemy_coupon_server_java_spring","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huythanh0x%2Fudemy_coupon_server_java_spring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huythanh0x%2Fudemy_coupon_server_java_spring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huythanh0x%2Fudemy_coupon_server_java_spring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huythanh0x%2Fudemy_coupon_server_java_spring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Huythanh0x","download_url":"https://codeload.github.com/Huythanh0x/udemy_coupon_server_java_spring/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Huythanh0x%2Fudemy_coupon_server_java_spring/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31866293,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T15:24:51.572Z","status":"ssl_error","status_checked_at":"2026-04-15T15:24:39.138Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["free","java","spring","udemy"],"created_at":"2024-12-10T18:10:27.749Z","updated_at":"2026-04-16T00:32:03.975Z","avatar_url":"https://github.com/Huythanh0x.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Spring Boot: 100% Off Udemy Coupon Server\n\n![Java](https://img.shields.io/badge/Java-17-blue)\n![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.1.1-brightgreen)\n![License](https://img.shields.io/badge/License-MIT-yellow)\n\n\u003ca href=\"https://coupons.thanh0x.com/\"\u003e \u003cimg alt=\"Spring Boot Coupon Server\" src=\"https://raw.githubusercontent.com/datacenter0x/static/main/uPic/RqCLnh.png\"\u003e\u003c/a\u003e\n\nThe Spring Boot Coupon Server is a robust application designed to crawl 100% off coupons from various websites and validate them using the official Udemy API. It provides several API endpoints for fetching, searching, and filtering these free coupons, with built-in authentication and authorization.\n## Features\n\n- **Coupon Crawling**: Automatically fetch coupons from multiple sources.\n- **Coupon Validation**: Validate coupons using the Udemy API then filter 100% off coupon only\n- **Search Functionality**: Search for coupons by query.\n- **Filter Functionality**: Filter coupons based on various criteria.\n- **Authentication \u0026 Authorization**: Secure access to API endpoints.\n\n## Architecture\n- `modules/coupon-domain`: entities, repositories, shared DTOs, Flyway migrations.\n- `modules/coupon-api-service`: REST APIs, security/auth, Swagger UI (port 8080).\n- `modules/coupon-crawler-service`: crawler workers + schedulers (port 8081).\n\n## Prerequisites\n- [Java 17](https://jdk.java.net/17/) or higher (JDK)\n- with [Docker](https://www.docker.com/) (for MySQL container)\n- or [Docker Compose](https://docs.docker.com/compose/)\n\n## Getting Started\n\n### Clone the Repository\n\n```shell\ngit clone https://github.com/huythanh0x/udemy_coupon_server_java_spring\ncd udemy_coupon_server_java_spring\n```\n\n### Start the Services\n1. Full stack via Docker Compose (published images - CI parity) - recommended:\n\n```shell\ndocker compose -f docker-compose.prod.yml up\n```\n\nThis pulls the API/crawler images built by GitHub Actions (and starts MySQL/Redis plus the observability stack).\n\n2. Local development (run services from source, MySQL via local compose):\n\n```shell\ndocker compose -f docker-compose.local.yml up -d\n./gradlew :modules:coupon-api-service:bootRun --args='--spring.profiles.active=local'\n# optional crawler worker\n./gradlew :modules:coupon-crawler-service:bootRun --args='--spring.profiles.active=local'\n```\n\n## Database migrations\n\n- Schema changes and seed data are managed by [Flyway](https://flywaydb.org/).\n- Migration scripts live under `modules/coupon-domain/src/main/resources/db/migration` (e.g., `V1__init_schema.sql`).\n- When the Spring Boot app starts it automatically runs pending migrations; no manual SQL is required.\n- For local verification you can run `./gradlew :modules:coupon-api-service:flywayMigrate` (or the crawler equivalent) once MySQL is up.\n\n## API Documentation\nOnce the server is running, navigate to [Swagger UI](http://localhost:8080/swagger-ui/index.html) for interactive docs or fetch the OpenAPI JSON at `/v3/api-docs`. See `docs/getting-started.md` for setup instructions and `docs/business-logic.md` for flow details.\n\nYou can also view the live Swagger API documentation at [swagger-ui/index.html](https://coupons-api.thanh0x.com/swagger-ui/index.html).\n\n## Contributing\nWe welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for more details.\n\n## License\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE.md) file for details.\n\n## Contact\nFor any inquiries or issues, please open an issue on GitHub or contact us at \u003ca href=\"mailto:huythanh0x@gmail.com\"\u003ehuythanh0x@gmail.com\u003c/a\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhuythanh0x%2Fudemy_coupon_server_java_spring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhuythanh0x%2Fudemy_coupon_server_java_spring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhuythanh0x%2Fudemy_coupon_server_java_spring/lists"}