{"id":24522807,"url":"https://github.com/gbzarelli/jynx","last_synced_at":"2026-04-29T14:34:27.482Z","repository":{"id":43471771,"uuid":"286308960","full_name":"gbzarelli/jynx","owner":"gbzarelli","description":"[JAVA] [QUARKUS] Jynx is an asynchronous label image detector.","archived":false,"fork":false,"pushed_at":"2022-03-01T17:54:16.000Z","size":534,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-22T03:35:41.766Z","etag":null,"topics":["clean-architecture","gcp-storage","gcp-vision","java","jdk17","panache","quarkus","rabbitmq"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gbzarelli.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-08-09T20:06:38.000Z","updated_at":"2023-01-06T00:35:50.000Z","dependencies_parsed_at":"2022-08-17T14:46:06.411Z","dependency_job_id":null,"html_url":"https://github.com/gbzarelli/jynx","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbzarelli%2Fjynx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbzarelli%2Fjynx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbzarelli%2Fjynx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbzarelli%2Fjynx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gbzarelli","download_url":"https://codeload.github.com/gbzarelli/jynx/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243733686,"owners_count":20339103,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["clean-architecture","gcp-storage","gcp-vision","java","jdk17","panache","quarkus","rabbitmq"],"created_at":"2025-01-22T03:35:43.481Z","updated_at":"2026-04-29T14:34:22.439Z","avatar_url":"https://github.com/gbzarelli.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Issues](https://img.shields.io/github/issues/gbzarelli/jynx.svg) \n![Forks](https://img.shields.io/github/forks/gbzarelli/jynx.svg) \n![Stars](https://img.shields.io/github/stars/gbzarelli/jynx.svg) \n![Release Version](https://img.shields.io/github/release/gbzarelli/jynx.svg)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/2e1e3fc1bed3498e8b55aff82c503b92)](https://app.codacy.com/manual/gbzarelli/jynx?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=gbzarelli/jynx\u0026utm_campaign=Badge_Grade_Dashboard)\n![Build WorkFlow](https://github.com/gbzarelli/jynx/workflows/Jynx%20Build%20Workflow/badge.svg) \n\n# Jynx (Project under development...) \n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/jynx.png\" height=\"450\"\u003e\n\u003c/p\u003e\n\nJynx is an asynchronous label image detector. It exposes an endpoint that receive any image, write in a storage, \nsend to a processing queue using RabbitMQ and the consumer renders the image using Google Vision API.\n\nThe Jynx is my first project in Quarkus the Supersonic Subatomic Java Framework and the goal is improve my knowledge \nwith this Framework.\n\nIf you want to learn more about Quarkus, please visit its website: https://quarkus.io/ .\n\n## Technologies\n\n- [`Quarkus`](https://quarkus.io/) - Framework\n- [`PostgreSQL`](https://www.postgresql.org) - Database\n- [`RabbitMQ`](https://www.rabbitmq.com) - Messaging Server\n- [`ArchUnit`](https://www.archunit.org) - Unit test your Java architecture \n- [`GCP Vision`](https://cloud.google.com/vision) - Google Cloud Machine Learn\n- [`GCP Storage`](https://cloud.google.com/storage) - Google Cloud Storage\n- [`Hibernate ORM with Panache`](https://quarkus.io/guides/hibernate-orm-panache) - Hibernate ORM is the de facto JPA implementation\n- [`GitHub Actions`](https://docs.github.com/en/actions) - Automate, customize, and execute your software development workflows (CI/CD)br\n\n# How this project work\n\nThis project has one endpoint to register images, it writes that image in a storage, register the information in \na database and send the identification in a messaging service to be async processed. This endpoint return an \nidentification marked with processing status.\n\nThe async process will be started when the queue receives the message. The routine get the identification message \nto will recovery the information of database and recovery the image to will be process. The process send to label \nimage detection service the image, and the response will be recorded in database and finally will notify the \nmessaging service in other exchange.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/flux-jynx.png\" width=\"250\"\u003e\n\u003c/p\u003e\n\n# Architecture\n\nThe architecture used in this project was based on `Clean Architecture` but more flexible with only one layer separated by packages.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/helpdev-clean-arch.png\" height=\"450\"\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://medium.com/luizalabs/descomplicando-a-clean-architecture-cf4dfc4a1ac6\"\u003e\n    Article about Clean Architecture by Guilherme Zarelli\u003c/a\u003e\n\u003c/p\u003e\n\nTo guarantee this architecture, the dependency `ArchUnit` will be used.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/archunit.png\" height=\"380\"\u003e\n    \u003cbr\u003e\n\u003c/p\u003e\n\n## Environments\n\n| ENV                            \t| Description             \t| Default value   \t|\n|--------------------------------\t|-------------------------\t|-----------------\t|\n| DATABASE_URL                   \t| Database URL            \t| IN DEVELOP MODE \t|\n| DATABASE_USERNAME              \t| Database username       \t| IN DEVELOP MODE \t|\n| DATABASE_PASSWORD              \t| Database Password       \t| IN DEVELOP MODE \t|\n| RABBITMQ_HOST                  \t| RabbitMQ Host           \t| IN DEVELOP MODE \t|\n| RABBITMQ_VHOST                 \t| RabbitMQ Vhost          \t| IN DEVELOP MODE \t|\n| RABBITMQ_USERNAME              \t| RabbitMQ username       \t| IN DEVELOP MODE \t|\n| RABBITMQ_PASSWORD              \t| RabbitMQ password       \t| IN DEVELOP MODE \t|\n| GOOGLE_APPLICATION_CREDENTIALS \t| File of GCP Credentials \t| NO              \t|\n\n## Running the application in dev mode\n\nYou can run the infrastructure needed for this project using the (`docker-compose.yml`)[./docker-compose.yml]\n\n```\ndocker-compose up -d\n```\n\nYou can run your application in dev mode that enables live coding using:\n\n```\n./gradlew quarkusDev\n```\n\nAccess Swagger UI:\n\n```\nhttp://localhost:8080/q/swagger-ui\n```\n\n### Requests Samples\n\nSee the request samples in this file: [request-samples.html](./request-samples.html)\n\n## Packaging and running the application\n\nThe application can be packaged using `./gradlew quarkusBuild`.\nIt produces the `jynx-1.0-SNAPSHOT-runner.jar` file in the `build` directory.\nBe aware that it’s not an _über-jar_ as the dependencies are copied into the `build/lib` directory.\n\nThe application is now runnable using `java -jar build/jynx-1.0-SNAPSHOT-runner.jar`.\n\nIf you want to build an _über-jar_, just add the `--uber-jar` option to the command line:\n```\n./gradlew quarkusBuild --uber-jar\n```\n\n## Creating a native executable\n\nYou can create a native executable using: `./gradlew build -Dquarkus.package.type=native`.\n\nOr, if you don't have GraalVM installed, you can run the native executable build in a container using: `./gradlew build -Dquarkus.package.type=native -Dquarkus.native.container-build=true`.\n\nYou can then execute your native executable with: `./build/jynx-1.0-SNAPSHOT-runner`\n\nIf you want to learn more about building native executables, please consult https://quarkus.io/guides/gradle-tooling#building-a-native-executable.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgbzarelli%2Fjynx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgbzarelli%2Fjynx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgbzarelli%2Fjynx/lists"}