{"id":21486257,"url":"https://github.com/barata-ribeiro/medimanage","last_synced_at":"2026-04-09T21:02:20.926Z","repository":{"id":251497685,"uuid":"831755219","full_name":"Barata-Ribeiro/MediManage","owner":"Barata-Ribeiro","description":"A full-stack application designed to streamline the management of small clinics. It handles patient records, scheduling appointments, and some administrative tasks.","archived":false,"fork":false,"pushed_at":"2025-10-08T08:28:35.000Z","size":3830,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-08T11:58:02.078Z","etag":null,"topics":["appointment-scheduling","intertiajs","laravel-framework","laravel-react-tailwind","laravel12","medical","medical-clinics","reactjs","tailwindcss","typescript","typescript-react"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Barata-Ribeiro.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":"2024-07-21T14:35:32.000Z","updated_at":"2025-10-08T08:28:39.000Z","dependencies_parsed_at":"2024-08-03T14:05:25.348Z","dependency_job_id":"5286e03e-04e5-47b4-b792-cd763d9d7ff5","html_url":"https://github.com/Barata-Ribeiro/MediManage","commit_stats":null,"previous_names":["barata-ribeiro/medimanage"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Barata-Ribeiro/MediManage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Barata-Ribeiro%2FMediManage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Barata-Ribeiro%2FMediManage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Barata-Ribeiro%2FMediManage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Barata-Ribeiro%2FMediManage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Barata-Ribeiro","download_url":"https://codeload.github.com/Barata-Ribeiro/MediManage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Barata-Ribeiro%2FMediManage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278939314,"owners_count":26072277,"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","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"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":["appointment-scheduling","intertiajs","laravel-framework","laravel-react-tailwind","laravel12","medical","medical-clinics","reactjs","tailwindcss","typescript","typescript-react"],"created_at":"2024-11-23T13:20:07.439Z","updated_at":"2025-10-08T11:58:02.220Z","avatar_url":"https://github.com/Barata-Ribeiro.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003cimg alt=\"The main logo of MediManage\" width=\"400\" src=\"client/public/images/medimanage-logo.svg\" title=\"MediManage Logo\"/\u003e\n\u003c/div\u003e\n\n**MediManage** is a full-stack application designed to streamline the management of small clinics. It provides an intuitive interface for handling patient records, scheduling appointments, and overseeing other essential administrative tasks. With its robust features and user-friendly design, MediManage ensures efficient and organized clinic operations. This project was developed with a focus on Java Spring Boot studies. Therefore, the Front End may not be fully implemented.\n\n## 📚 Features\n\n- **Patient Management**: Easily add, update, and manage patient information.\n- **Consultation Scheduling**: Schedule and track patient appointments with ease.\n- **Prescriptions**: Generate and manage prescriptions PDF files.\n- **Secure Authentication**: Protect sensitive data with robust security measures.\n- **Reporting and Analytics**: Generate insightful reports to optimize clinic operations.\n\n## 🚀 Built With\n\n### Frontend\n\nThe frontend of MediManage is built using modern technologies to ensure a responsive and seamless user experience.\n\n- **Next.js** (`next`): A React framework for server-rendered applications.\n- **React** (`react`, `react-dom`): A JavaScript library for building user interfaces.\n- **Tailwind CSS** (`tailwindcss`, `@tailwindcss/forms`, `@tailwindcss/typography`): A utility-first CSS framework for rapid UI development.\n- **NextAuth.js** (`next-auth`): Authentication for Next.js applications.\n- **Zod** (`zod`): A TypeScript-first schema validation library.\n- **React Icons** (`react-icons`): Include popular icons in your React projects easily.\n- **React Intersection Observer** (`react-intersection-observer`): A React implementation of the Intersection Observer API.\n- **React PDF Renderer** (`@react-pdf/renderer`): Create PDF files in React.\n\n### Backend\n\nThe backend leverages the power of Spring Boot to provide a scalable and secure foundation for the application.\n\n- **Spring Boot Starter Web** (`spring-boot-starter-web`): Build web applications, including RESTful services.\n- **Spring Boot Starter Data JPA** (`spring-boot-starter-data-jpa`): Simplify data persistence with JPA.\n- **Spring Boot Starter Security** (`spring-boot-starter-security`): Secure the application with Spring Security.\n- **Spring Boot Starter Validation** (`spring-boot-starter-validation`): Provide validation support.\n- **PostgreSQL Driver** (`postgresql`): Connect to PostgreSQL databases.\n- **H2 Database** (`h2`): An in-memory database for development and testing.\n- **Java JWT** (`java-jwt`): JSON Web Token (JWT) creation and verification.\n- **ModelMapper** (`modelmapper`): Simplify object mapping.\n- **Lombok** (`lombok`): Reduce boilerplate code with annotations.\n- **SpringDoc OpenAPI** (`springdoc-openapi-starter-webmvc-ui`, `springdoc-openapi-starter-webflux-ui`): Generate API documentation.\n- **Spring Boot DevTools** (`spring-boot-devtools`): Enhance the development experience with automatic restarts.\n\n## 🛠️ Project Setup\n\n### Prerequisites\n\n- **Frontend**:\n    - [Node.js](https://nodejs.org/) (v18 or later)\n    - [npm](https://www.npmjs.com/) or [Yarn](https://yarnpkg.com/)\n\n- **Backend**:\n    - [Docker](https://www.docker.com/) and [Docker Compose](https://docs.docker.com/compose/)\n\n### Frontend Setup\n\n1. **Clone the Repository**\n\n   ```bash\n   git clone https://github.com/Barata-Ribeiro/MediManage.git\n   cd MediManage/client\n   ```\n\n2. **Install Dependencies**\n\n   Using npm:\n\n   ```bash\n   npm install\n   ```\n\n   Or using Yarn:\n\n   ```bash\n   yarn install\n   ```\n\n3. **Configure Environment Variables**\n\n   Create a `.env.local` file in the `client` directory and add the necessary environment variables:\n\n   ```env\n   TOKEN_NAME=TOKEN_NAME \n   JWT_BACKEND_SECRET=JWT_RANDOM_KEY \n   NEXT_PUBLIC_INSTITUTION_NAME=CLINIC_PUBLIC_NAME \n   AUTH_SECRET=AUTO_GEN_AUTH_JS_KEY # Added by npx auth. Read more: https://cli.authjs.dev\n   ```\n\n4. **Run the Development Server**\n\n   ```bash\n   npm run dev\n   ```\n\n   The application will be available at [http://localhost:3000](http://localhost:3000).\n\n5. **Build for Production**\n\n   ```bash\n   npm run build\n   npm start\n   ```\n\n### Backend Setup\n\n1. **Navigate to the Server Directory**\n\n   ```bash\n   cd MediManage/server\n   ```\n\n2. **Create `docker-compose.yml`**\n\n   Create a `docker-compose.yml` file in the `server` directory with the following content:\n\n   ```yaml\n   name: medimanage-backend\n\n   services:\n     medimanage-database:\n       image: postgres:latest\n       container_name: medimanage-database\n       restart: always\n       environment:\n         POSTGRES_DB: medimanage_db\n         POSTGRES_USER: postgres\n         POSTGRES_PASSWORD: postgres\n         PGDATA: /var/lib/postgresql/data/pgdata\n       ports:\n         - \"5432:5432\"\n       volumes:\n         - pgdata:/var/lib/postgresql/data\n\n     medimanage-app:\n       build: .\n       container_name: medimanage-app\n       restart: always\n       environment:\n         DB_ORIGIN: medimanage-database\n         DB_PORT: 5432\n         DB_NAME: medimanage_db\n         DB_USER: postgres\n         DB_PASSWORD: postgres\n         JWT_SECRET: secret\n         CORS_ORIGINS: http://localhost:3000\n       ports:\n         - \"8080:8080\"\n       depends_on:\n         - medimanage-database\n\n   volumes:\n     pgdata:\n   ```\n\n3. **Create `Dockerfile`**\n\n   Create a `Dockerfile` in the `server` directory with the following content:\n\n   ```dockerfile\n   # Build stage\n   FROM maven:3.9.9-eclipse-temurin-21 as builder\n   LABEL authors=\"Barata Ribeiro \u003cjoaomendesjorge@barataribeiro.com\u003e\"\n   WORKDIR /app\n   COPY src /app/src\n   COPY pom.xml /app\n   RUN mvn clean package -DskipTests\n\n   # Run stage\n   FROM eclipse-temurin:21-jre-alpine\n   WORKDIR /app\n   COPY --from=builder /app/target/*.jar app.jar\n   EXPOSE 8080\n   ENTRYPOINT [\"java\", \"-jar\", \"/app/app.jar\", \"--spring.profiles.active=production\"]\n   ```\n\n4. **Configure Environment Variables**\n\n   Ensure the following environment variables are set in the `docker-compose.yml` under the `medimanage-app` service:\n\n   ```yaml\n   environment:\n     DB_ORIGIN: medimanage-database\n     DB_PORT: 5432\n     DB_NAME: medimanage_db\n     DB_USER: postgres\n     DB_PASSWORD: postgres\n     JWT_SECRET: secret\n     CORS_ORIGINS: http://localhost:3000\n   ```\n\n   **Additional Environment Variables:**\n\n    - `CORS_ORIGIN=URLS_SEPARATE_BY_COMMAS`\n    - `JWT_SECRET=SECRET_KEY`\n\n5. **Run the Services**\n\n   From the `server` directory, run:\n\n   ```bash\n   docker-compose up --build\n   ```\n\n   This command will build the backend application and start both the PostgreSQL database and the backend service. The backend will be accessible at [http://localhost:8080](http://localhost:8080).\n\n## 🗂️ Folder Structure\n\n### Client\n\n```\nclient/\n├── .idea\n├── node_modules\n├── public/\n├── src/\n│   ├── actions/\n│   ├── app/\n│   ├── components/\n│   ├── context/\n│   ├── hooks/\n│   ├── interfaces/\n│   ├── utils/\n│   ├── auth.ts\n│   ├── constants.ts\n│   ├── middleware.ts\n├── .env.local\n├── .eslintrc.json\n├── .gitignore\n├── .prettierrc\n├── next.config.mjs\n├── next-env.d.ts\n├── package.json\n├── package-lock.json\n├── postcss.config.mjs\n├── README.md\n├── tailwind.config.ts\n└── tsconfig.json\n```\n\n### Server\n\n```\nserver/\n├── .idea\n├── .mvn/\n├── src/\n│   ├── main/\n│       ├── java/\n│           └── com/barataribeiro/medimanage/\n│               ├── builders/\n│               ├── config/\n│               ├── constants/\n│               ├── controllers/\n│               ├── dtos/\n│               ├── entities/\n│               ├── exceptions/\n│               ├── repositories/\n│               ├── services/\n│               └── MediManageApplication.java\n├── target/\n├── .gitignore\n├── docker-compose.yml\n├── Dockerfile\n├── HELP.md\n├── MediManage.iml\n├── mvnw\n├── mvnw.cmd\n└── pom.xml\n```\n\n## 🗄️ Environment Variables\n\n### Client `.env.local` Example\n\n```env\nTOKEN_NAME=TOKEN_NAME \nJWT_BACKEND_SECRET=JWT_RANDOM_KEY \nNEXT_PUBLIC_INSTITUTION_NAME=CLINIC_PUBLIC_NAME \nAUTH_SECRET=AUTO_GEN_AUTH_JS_KEY # Added by npx auth. Read more: https://cli.authjs.dev\n```\n\n### Backend Properties\n\n#### Development (`application-dev.properties`)\n\n```properties\nspring.application.name=MediManage\nspringdoc.api-docs.path=/api-docs\nspring.threads.virtual.enabled=true\n\n# Database Configuration\nspring.datasource.url=jdbc:h2:file:~/data/medi_manage_db_test\nspring.datasource.driverClassName=org.h2.Driver\nspring.datasource.username=sa\nspring.datasource.password=\nspring.h2.console.enabled=true\nspring.h2.console.path=/h2-console\n\n# Hibernate\nspring.jpa.database-platform=org.hibernate.dialect.H2Dialect\nspring.jpa.hibernate.ddl-auto=update\nspring.jpa.show-sql=true\nspring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true\n\n# Security and Seed\napi.security.token.secret=${JWT_SECRET}\napi.security.cors.origins=${CORS_ORIGINS}\napi.security.argon2.salt=${ENCODER_SALT:16}\napi.security.argon2.length=${ENCODER_LENGTH:32}\napi.security.argon2.parallelism=${ENCODER_PARALLELISM:2}\napi.security.argon2.memory=${ENCODER_MEMORY:65536}\napi.security.argon2.iterations=${ENCODER_ITERATIONS:4}\n\n# Spring Docs\nspringdoc.swagger-ui.operationsSorter=alpha\nspringdoc.swagger-ui.tagsSorter=alpha\n```\n\n#### Production (`application-prod.properties`)\n\n```properties\nspring.application.name=MediManage\nspringdoc.api-docs.path=/api-docs\nspring.threads.virtual.enabled=true\n\n# Database Configuration\nspring.datasource.url=jdbc:postgresql://${DB_ORIGIN:localhost}:${DB_PORT:5432}/${DB_NAME:medi_manage_db}\nspring.datasource.username=${DB_USER:postgres}\nspring.datasource.password=${DB_PASSWORD:postgres}\nspring.datasource.driver-class-name=org.postgresql.Driver\n\n# Hibernate\nspring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect\nspring.jpa.hibernate.ddl-auto=update\nspring.jpa.show-sql=true\nspring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true\n\n# Security and Seed\napi.security.token.secret=${JWT_SECRET}\napi.security.cors.origins=${CORS_ORIGINS}\napi.security.argon2.salt=${ENCODER_SALT:16}\napi.security.argon2.length=${ENCODER_LENGTH:32}\napi.security.argon2.parallelism=${ENCODER_PARALLELISM:2}\napi.security.argon2.memory=${ENCODER_MEMORY:65536}\napi.security.argon2.iterations=${ENCODER_ITERATIONS:4}\n```\n\n## 🤝 Contributing \n\nContributions, issues, and feature requests are welcome! Feel free to check the [issues page](https://github.com/Barata-Ribeiro/MediManage/issues) if you want to contribute.\n\n## 📜 License \n\nThis project is free software available under the [GPLv3](LICENSE) license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbarata-ribeiro%2Fmedimanage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbarata-ribeiro%2Fmedimanage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbarata-ribeiro%2Fmedimanage/lists"}