{"id":29016398,"url":"https://github.com/hyuseinleshov/habit-tracker-api","last_synced_at":"2026-04-11T04:33:12.735Z","repository":{"id":301124083,"uuid":"1007862928","full_name":"hyuseinleshov/habit-tracker-api","owner":"hyuseinleshov","description":"A backend REST API for tracking personal habits, built with Java and Spring Boot. It supports habit creation, recurring check-ins, streak calculations, and user authentication.","archived":false,"fork":false,"pushed_at":"2026-03-01T21:27:27.000Z","size":1786,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-02T00:51:28.679Z","etag":null,"topics":["backend","ci","docker","flyway","gradle","habit-tracker","java","jpa","jwt-authentication","postgresql","rest-api","spring-boot","spring-security","swagger","testcontainers"],"latest_commit_sha":null,"homepage":"","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/hyuseinleshov.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,"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-06-24T16:40:41.000Z","updated_at":"2026-03-01T21:27:27.000Z","dependencies_parsed_at":"2025-06-25T09:35:39.184Z","dependency_job_id":"3353e522-7a0d-4b9e-bfd0-de3866a4849b","html_url":"https://github.com/hyuseinleshov/habit-tracker-api","commit_stats":null,"previous_names":["hyuseinleshov/habit-tracker-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hyuseinleshov/habit-tracker-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyuseinleshov%2Fhabit-tracker-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyuseinleshov%2Fhabit-tracker-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyuseinleshov%2Fhabit-tracker-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyuseinleshov%2Fhabit-tracker-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hyuseinleshov","download_url":"https://codeload.github.com/hyuseinleshov/habit-tracker-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyuseinleshov%2Fhabit-tracker-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31669116,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"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":["backend","ci","docker","flyway","gradle","habit-tracker","java","jpa","jwt-authentication","postgresql","rest-api","spring-boot","spring-security","swagger","testcontainers"],"created_at":"2025-06-25T22:08:12.805Z","updated_at":"2026-04-11T04:33:12.717Z","avatar_url":"https://github.com/hyuseinleshov.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca id=\"readme-top\"\u003e\u003c/a\u003e\n\n\u003c!-- PROJECT SHIELDS --\u003e\n[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![MIT License][license-shield]][license-url]\n\n\n\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/hyuseinleshov/habit-tracker-api\"\u003e\n    \u003cimg src=\"images/logo.png\" alt=\"Habit Tracker Logo\" width=\"80\" height=\"80\"\u003e\n  \u003c/a\u003e\n\n\u003ch3 align=\"center\"\u003eHabit Tracker API\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\n    A backend REST API for tracking daily/weekly habits, check‑ins, and streaks.\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/hyuseinleshov/habit-tracker-api/issues/new?labels=bug\u0026template=bug-report---.md\"\u003eReport Bug\u003c/a\u003e\n    \u0026middot;\n    \u003ca href=\"https://github.com/hyuseinleshov/habit-tracker-api/issues/new?labels=enhancement\u0026template=feature-request---.md\"\u003eRequest Feature\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\u003ca href=\"#about-the-project\"\u003eAbout The Project\u003c/a\u003e\n        \u003cul\u003e\n          \u003cli\u003e\u003ca href=\"#built-with\"\u003eBuilt With\u003c/a\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#run-with-docker\"\u003eRun with Docker (No Cloning Required)\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#getting-started\"\u003eGetting Started (Development)\u003c/a\u003e\n        \u003cul\u003e\n          \u003cli\u003e\u003ca href=\"#prerequisites\"\u003ePrerequisites\u003c/a\u003e\u003c/li\u003e\n          \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n          \u003cli\u003e\u003ca href=\"#environment-variables\"\u003eEnvironment Variables\u003c/a\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#api-documentation\"\u003eAPI Documentation\u003c/a\u003e\n        \u003cul\u003e\n          \u003cli\u003e\u003ca href=\"#core-api-categories\"\u003eCore API Categories\u003c/a\u003e\u003c/li\u003e\n          \u003cli\u003e\u003ca href=\"#example-endpoints\"\u003eExample Endpoints\u003c/a\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#project-structure\"\u003eProject Structure\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#database-schema\"\u003eDatabase Schema\u003c/a\u003e\n        \u003cul\u003e\n          \u003cli\u003e\u003ca href=\"#key-entities\"\u003eKey Entities\u003c/a\u003e\u003c/li\u003e\n          \u003cli\u003e\u003ca href=\"#database-design-principles\"\u003eDatabase Design Principles\u003c/a\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#security\"\u003eSecurity\u003c/a\u003e\n        \u003cul\u003e\n          \u003cli\u003e\u003ca href=\"#authentication-flow\"\u003eAuthentication Flow\u003c/a\u003e\u003c/li\u003e\n          \u003cli\u003e\u003ca href=\"#secured-endpoints\"\u003eSecured Endpoints\u003c/a\u003e\u003c/li\u003e\n          \u003cli\u003e\u003ca href=\"#token-management\"\u003eToken Management\u003c/a\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#testing\"\u003eTesting\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contact\"\u003eContact\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n## About The Project\n\nHabit Tracker API is a Spring Boot backend that helps users manage daily and weekly habits. Users can:\n- Register/login with JWT authentication\n- Create, read, update, delete habits\n- Perform check‑ins per habit\n- View current streaks and historic stats\n\nThis project is structured with clean architecture, Docker, CI pipelines, and full API documentation.\n\n\u003e **Frontend**: The companion UI for this API is available at [habit-tracker-ui](https://github.com/ShenolShengov/habit-tracker-ui).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- BUILT WITH --\u003e\n### Built With\n\n* [![Java][java-shield]][java-url]\n* [![Spring Boot][spring-boot-shield]][spring-boot-url]\n* [![Gradle][gradle-shield]][gradle-url]\n* [![PostgreSQL][postgresql-shield]][postgresql-url]\n* [![Redis][redis-shield]][redis-url]\n* [![Docker][docker-shield]][docker-url]\n* [![JWT][jwt-shield]][jwt-url]\n* [![JUnit5][junit5-shield]][junit5-url]\n* [![Hibernate][hibernate-shield]][hibernate-url]\n* [![Lombok][lombok-shield]][lombok-url]\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- RUN WITH DOCKER --\u003e\n## Run with Docker\n\nYou can run the full application (backend + frontend + database + cache) without cloning any repository. All you need is Docker.\n\n1. Create a `.env` file with the required environment variables (see [Environment Variables](#environment-variables)):\n\n    ```bash\n    # Database Configuration\n    POSTGRES_USER=habittracker\n    POSTGRES_PASSWORD=your-secure-password\n    POSTGRES_DB=habittracker_db\n\n    # JWT Configuration (REQUIRED - must be base64-encoded)\n    JWT_SECRET=bXlTdXBlclNlY3JldEtleUZvckRldmVsb3BtZW50T25seURvTm90VXNlSW5Qcm9kdWN0aW9uMTIzNDU2Nzg5MA==\n\n    # Application Configuration\n    SPRING_PROFILES_ACTIVE=dev\n    ```\n\n2. Create a `compose.yml` file in the same directory:\n\n    ```yaml\n    services:\n      postgres-db:\n        image: postgres:15-alpine\n        restart: always\n        container_name: postgres-db\n        environment:\n          POSTGRES_USER: ${POSTGRES_USER}\n          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}\n          POSTGRES_DB: ${POSTGRES_DB}\n        ports:\n          - \"5432:5432\"\n        volumes:\n          - postgres-data:/var/lib/postgresql/data\n        healthcheck:\n          test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}\"]\n          interval: 10s\n          timeout: 5s\n          retries: 5\n        networks:\n          - habit-tracker-network\n\n      redis:\n        image: redis:7-alpine\n        restart: always\n        container_name: redis\n        command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru\n        ports:\n          - \"6379:6379\"\n        volumes:\n          - redis-data:/data\n        healthcheck:\n          test: [\"CMD\", \"redis-cli\", \"ping\"]\n          interval: 10s\n          timeout: 5s\n          retries: 5\n        networks:\n          - habit-tracker-network\n\n      app:\n        image: shenol10/habit-tracker-api-app:1.0.0\n        container_name: habit-tracker-api\n        restart: always\n        ports:\n          - \"8080:8080\"\n        environment:\n          POSTGRES_USER: ${POSTGRES_USER}\n          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}\n          POSTGRES_DB: ${POSTGRES_DB}\n          SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}\n          SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-db:5432/${POSTGRES_DB}\n          SPRING_DATA_REDIS_HOST: redis\n          SPRING_DATA_REDIS_PORT: 6379\n          JWT_SECRET: ${JWT_SECRET}\n          JWT_ISSUER: ${JWT_ISSUER:-habit-tracker-api}\n          JWT_EXPIRATION_DURATION: ${JWT_EXPIRATION_DURATION:-PT10M}\n          REFRESH_TOKEN_EXPIRATION_DURATION: ${REFRESH_TOKEN_EXPIRATION_DURATION:-P7D}\n          HABIT_RETENTION_PERIOD: ${HABIT_RETENTION_PERIOD:-P14D}\n          USER_RETENTION_PERIOD: ${USER_RETENTION_PERIOD:-P14D}\n        depends_on:\n          postgres-db:\n            condition: service_healthy\n          redis:\n            condition: service_healthy\n        networks:\n          - habit-tracker-network\n\n      frontend:\n        image: shenol10/habit-tracker-frontend:1.0.0\n        container_name: habit-tracker-frontend\n        restart: always\n        ports:\n          - \"5173:80\"\n        depends_on:\n          - app\n        networks:\n          - habit-tracker-network\n\n    networks:\n      habit-tracker-network:\n        driver: bridge\n\n    volumes:\n      postgres-data:\n      redis-data:\n    ```\n\n3. Start everything:\n\n    ```bash\n    docker compose up -d\n    ```\n\n4. Access the application:\n    - **Frontend**: http://localhost:5173\n    - **API**: http://localhost:8080\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- GETTING STARTED --\u003e\n## Getting Started\n\nFollow these instructions to set up the project for local development.\n\n### Prerequisites\n\n* Docker and Docker Compose\n\n### Installation\n\n1. Clone the repository:\n\n    ```bash\n    git clone https://github.com/hyuseinleshov/habit-tracker-api.git\n    cd habit-tracker-api\n    ```\n\n2. Create a `.env` file with required environment variables (see [Environment Variables](#environment-variables) section or copy from `.env.example`):\n\n    ```bash\n    cp .env.example .env\n    # Edit .env and set your JWT_SECRET\n    ```\n\n3. Start the backend with infrastructure (builds from source):\n\n    ```bash\n    docker compose -f compose-dev.yml up --build\n    ```\n\n4. The API will be available at `http://localhost:8080`\n\n**Common Docker Commands:**\n\n```bash\n# Start services in background\ndocker compose -f compose-dev.yml up -d\n\n# View logs\ndocker compose -f compose-dev.yml logs -f app\n\n# Stop services\ndocker compose -f compose-dev.yml down\n\n# Rebuild after code changes\ndocker compose -f compose-dev.yml up --build app\n\n# Clean restart (removes volumes and data)\ndocker compose -f compose-dev.yml down -v\ndocker compose -f compose-dev.yml up --build\n```\n\n### Environment Variables\n\nThe application uses environment variables for configuration. Here are the essential ones you need to set:\n\n#### Required Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `POSTGRES_USER` | PostgreSQL database username |\n| `POSTGRES_PASSWORD` | PostgreSQL database password |\n| `POSTGRES_DB` | PostgreSQL database name |\n| `JWT_SECRET` | Secret key for signing JWT tokens |\n\n#### Configuration Example\n\nCreate a `.env` file in the project root directory (or copy from `.env.example`):\n\n```bash\n# Database Configuration\nPOSTGRES_USER=habittracker\nPOSTGRES_PASSWORD=your-secure-password\nPOSTGRES_DB=habittracker_db\n\n# JWT Configuration (REQUIRED - must be base64-encoded)\nJWT_SECRET=bXlTdXBlclNlY3JldEtleUZvckRldmVsb3BtZW50T25seURvTm90VXNlSW5Qcm9kdWN0aW9uMTIzNDU2Nzg5MA==\n\n# Application Configuration\nSPRING_PROFILES_ACTIVE=dev\n```\n\n\u003e **Important**: The `JWT_SECRET` must be a base64-encoded string. You can generate one using:\n\u003e ```bash\n\u003e echo -n \"your-secret-key-at-least-256-bits-long\" | base64\n\u003e ```\n\n\u003e **Note**: The application has many configurable options with sensible defaults. For a complete list of configuration properties and their default values, refer to:\n\u003e\n\u003e - `application.yml` - Base configuration\n\u003e - `application-dev.yml` - Development profile configuration\n\u003e - `application-prod.yml` - Production profile configuration (if available)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- API DOCUMENTATION --\u003e\n## API Documentation\n\nThe Habit Tracker API follows RESTful principles and uses JSON for request/response payloads. Below are key endpoint categories with examples.\n\n### Core API Categories\n\n- **Authentication**: User registration, login, and token refresh\n- **User Profile**: User information management\n- **Habits**: CRUD operations for habits\n- **Check-ins**: Recording and retrieving habit completions\n- **Statistics**: Retrieving habit performance metrics\n\n### Example Endpoints\n\n#### Authentication\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| POST | `/api/auth/register` | Register a new user |\n| POST | `/api/auth/login` | Login with existing credentials |\n| POST | `/api/auth/refresh` | Refresh an expired JWT token |\n\n#### User Profile\n\n| Method | Endpoint | Description                                                  |\n|--------|----------|--------------------------------------------------------------|\n| GET    | `/api/me` | Get the current user's profile, including 'email'            |\n| PUT    | `/api/me` | Update the current user's profile (support updating 'email') |\n| DELETE | `/api/me` | Soft delete current user                                     |\n\n\u003e **Note**: The API evolves with the application. For complete and up-to-date API documentation:\n\u003e\n\u003e 1. Check the controller classes in the source code\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- PROJECT STRUCTURE --\u003e\n## Project Structure\n\nThe project follows a clean architecture approach with domain-driven design principles. The codebase is organized into logical modules based on business domains:\n\n- **auth**: Authentication and authorization functionality\n- **security**: Security configuration and JWT implementation\n- **user**: User profile management\n- **habit**: Core habit tracking functionality\n- **checkin**: Check-in recording and tracking\n- **core**: Shared utilities and base components\n\nEach module follows a consistent structure with controllers, services, repositories, and models as appropriate for its functionality.\n\n\u003e **Note**: For the most up-to-date and detailed project structure, please refer to the source code repository.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- DATABASE SCHEMA --\u003e\n## Database Schema\n\nThe application uses a relational database (PostgreSQL) for persistent data storage and Redis for caching and temporary data.\n\n### Key Entities\n\n- **Authentication Domain**: Users, roles, and permissions\n- **User Profile Domain**: User preferences and settings\n- **Habit Domain**: Habit definitions and configurations\n- **Check-in Domain**: Records of habit completions\n\n### Database Design Principles\n\n- UUID primary keys for all entities\n- Timestamp tracking (created_at) for all records\n- Proper foreign key relationships between related entities\n- Role-based access control through user-role associations\n\n\u003e **Note**: The database schema evolves with the application. For the most up-to-date schema details, refer to the entity classes in the source code or use database inspection tools.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- TESTING --\u003e\n## Testing\n\nThe project includes comprehensive tests:\n\n- **Unit Tests**: Test individual components in isolation\n- **Integration Tests**: Test interactions between components\n- **API Tests**: Test the REST API endpoints\n\nTo run the tests:\n\n```bash\n./gradlew test\n```\n\nFor development, you can use the pre-configured test users:\n- Regular user: `user@example.com` / `user123`\n- Admin user: `admin@example.com` / `admin123`\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- SECURITY --\u003e\n## Security\n\nThe Habit Tracker API implements a comprehensive security system to protect user data and ensure secure access to the application.\n\n### Authentication Flow\n\nThe application uses JWT (JSON Web Token) based authentication with the following flow:\n\n1. **Registration**:\n    - Users register with email, password, and timezone\n    - Password is encrypted using BCrypt\n    - User is assigned the USER role\n    - A JWT access token and refresh token are generated and returned\n\n2. **Login**:\n    - Users authenticate with email and password\n    - Upon successful authentication, a JWT access token and refresh token are generated and returned\n    - Any existing refresh tokens for the user are revoked\n\n3. **Token Refresh**:\n    - When the access token expires, clients can use the refresh token to obtain a new access token\n    - The used refresh token is revoked, and a new refresh token is generated\n    - This implements a rotation scheme for refresh tokens, enhancing security\n\n### Secured Endpoints\n\nThe API implements the following security measures for endpoints:\n\n- Public endpoints (no authentication required):\n    - `/api/auth/register` - User registration\n    - `/api/auth/login` - User login\n    - `/api/auth/refresh` - Token refresh\n\n- All other endpoints require authentication with a valid JWT token\n\n- Method-level security is enabled, allowing for fine-grained access control based on roles and permissions\n\n### Token Management\n\nThe application uses a sophisticated token management system:\n\n- **JWT Access Tokens**:\n    - Contain user email as the subject\n    - Include issuedAt, expiration, and notBefore claims\n    - Signed with a secret key\n    - Configurable expiration time\n\n- **Refresh Tokens**:\n    - Stored securely in the database\n    - One-time use (revoked after use)\n    - Associated with a specific user\n    - Used to obtain new access tokens when the current one expires\n\n- **Security Features**:\n    - Stateless authentication (no session state on the server)\n    - Token validation on each request\n    - Comprehensive error handling for token validation failures\n    - Protection against token reuse\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- CONTRIBUTING --\u003e\n## Contributing\n\nWe welcome contributions! Follow these steps:\n\n1. Fork the project\n2. Create your branch (`feature/xyz`, `fix/abc`)\n3. Commit your changes (`feat: add xyz feature`)\n4. Push to your branch\n5. Open a Pull Request\n\nAdhere to our branch/commit conventions.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- LICENSE --\u003e\n## License\n\nDistributed under the MIT License. See [`LICENSE`](LICENSE) for details.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- CONTACT --\u003e\n## Contact\n\n- **Hyusein Leshov** – hl.dev.acc@gmail.com\n- **Shenol Shengov** – shenolshengov41@gmail.com\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n[contributors-shield]: https://img.shields.io/github/contributors/hyuseinleshov/habit-tracker-api.svg?style=for-the-badge\n[contributors-url]: https://github.com/hyuseinleshov/habit-tracker-api/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/hyuseinleshov/habit-tracker-api.svg?style=for-the-badge\n[forks-url]: https://github.com/hyuseinleshov/habit-tracker-api/network/members\n[stars-shield]: https://img.shields.io/github/stars/hyuseinleshov/habit-tracker-api.svg?style=for-the-badge\n[stars-url]: https://github.com/hyuseinleshov/habit-tracker-api/stargazers\n[issues-shield]: https://img.shields.io/github/issues/hyuseinleshov/habit-tracker-api.svg?style=for-the-badge\n[issues-url]: https://github.com/hyuseinleshov/habit-tracker-api/issues\n[license-shield]: https://img.shields.io/github/license/hyuseinleshov/habit-tracker-api.svg?style=for-the-badge\n[license-url]: https://github.com/hyuseinleshov/habit-tracker-api/blob/main/LICENSE\n[java-shield]: https://img.shields.io/badge/Java-DE0A26?logo=openjdk\u0026logoColor=white\u0026style=for-the-badge\n[java-url]: https://www.oracle.com/java/\n[spring-boot-shield]: https://img.shields.io/badge/Spring%20Boot-6DB33F?logo=springboot\u0026logoColor=white\u0026style=for-the-badge\n[spring-boot-url]: https://spring.io/projects/spring-boot\n[gradle-shield]: https://img.shields.io/badge/Gradle-02303A?logo=gradle\u0026logoColor=white\u0026style=for-the-badge\n[gradle-url]: https://gradle.org/\n[postgresql-shield]: https://img.shields.io/badge/PostgreSQL-4169E1?logo=postgresql\u0026logoColor=white\u0026style=for-the-badge\n[postgresql-url]: https://www.postgresql.org/\n[redis-shield]: https://img.shields.io/badge/Redis-DC382D?logo=redis\u0026logoColor=white\u0026style=for-the-badge\n[redis-url]: https://redis.io/\n[docker-shield]: https://img.shields.io/badge/Docker-2496ED?logo=docker\u0026logoColor=white\u0026style=for-the-badge\n[docker-url]: https://www.docker.com/\n[jwt-shield]: https://img.shields.io/badge/JWT-000000?logo=jsonwebtokens\u0026logoColor=white\u0026style=for-the-badge\n[jwt-url]: https://jwt.io/\n[junit5-shield]: https://img.shields.io/badge/JUnit5-25A162?logo=junit5\u0026logoColor=white\u0026style=for-the-badge\n[junit5-url]: https://junit.org/junit5/\n[hibernate-shield]: https://img.shields.io/badge/Hibernate-59666C?logo=hibernate\u0026logoColor=white\u0026style=for-the-badge\n[hibernate-url]: https://hibernate.org/\n[lombok-shield]: https://img.shields.io/badge/Lombok-BC4521?logo=lombok\u0026logoColor=white\u0026style=for-the-badge\n[lombok-url]: https://projectlombok.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyuseinleshov%2Fhabit-tracker-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhyuseinleshov%2Fhabit-tracker-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyuseinleshov%2Fhabit-tracker-api/lists"}