{"id":30178673,"url":"https://github.com/aeberdinelli/product-engineer-challenge","last_synced_at":"2025-08-12T05:37:01.562Z","repository":{"id":309307602,"uuid":"1034260676","full_name":"aeberdinelli/product-engineer-challenge","owner":"aeberdinelli","description":"Don't take a look at the commits list, I do use atomic commits. I had to re-push resetting the git repo as `infra` was generated by CDK within its own git and codebase first 🤦🏼‍♂️.","archived":false,"fork":false,"pushed_at":"2025-08-11T07:19:07.000Z","size":572,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-11T07:21:51.440Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/aeberdinelli.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}},"created_at":"2025-08-08T05:36:36.000Z","updated_at":"2025-08-11T07:19:11.000Z","dependencies_parsed_at":"2025-08-11T07:21:58.062Z","dependency_job_id":"806a19d3-8aab-45af-a6b4-0d1eb30d83cc","html_url":"https://github.com/aeberdinelli/product-engineer-challenge","commit_stats":null,"previous_names":["aeberdinelli/product-engineer-challenge"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/aeberdinelli/product-engineer-challenge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aeberdinelli%2Fproduct-engineer-challenge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aeberdinelli%2Fproduct-engineer-challenge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aeberdinelli%2Fproduct-engineer-challenge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aeberdinelli%2Fproduct-engineer-challenge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aeberdinelli","download_url":"https://codeload.github.com/aeberdinelli/product-engineer-challenge/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aeberdinelli%2Fproduct-engineer-challenge/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270008897,"owners_count":24511700,"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-08-12T02:00:09.011Z","response_time":80,"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":[],"created_at":"2025-08-12T05:36:58.221Z","updated_at":"2025-08-12T05:37:01.530Z","avatar_url":"https://github.com/aeberdinelli.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Psychiatrist Scheduler\n\nA tiny, cheap-to-run MVP where users can find psychiatrists, view weekly availability (online / in-person), and request appointments. Admins can approve/reject requests.\n\n## Quickstart frontend\n\n### 📋 Requirements\n- **Node 20 LTS**\n- **AWS CLI**\n\n### 🔧 Configure API base URL\nCreate `web/.env`:\n```env\nVITE_API_BASE=https://\u003cyour-api-endpoint\u003e\n```\n\u003e This is the CDK output `ApiEndpoint` (no trailing slash).\n\n### ▶️ Install \u0026 run\n```bash\ncd web\nnpm install\nnpm run dev\n```\nOpen http://localhost:5173\n\n## Deploy backend (AWS)\n\n### 📋 Requirements\n- AWS account with permissions to deploy\n- **AWS CLI** configured:\n  ```bash\n  aws configure\n  ```\n- **CDK v2** installed:\n  ```bash\n  npm i -g aws-cdk\n  ```\n\n### 🚀 Bootstrap the environment (first time per account/region)\n```bash\ncd infra\nnpm install\ncdk bootstrap\n```\n\n### 🚢 Deploy\n```bash\ncd infra\ncdk deploy\n```\n\nAfter deploy:\n- Copy the `ApiEndpoint` from the CDK outputs into `web/.env` as `VITE_API_BASE`.\n- If your browser shows CORS issues, we already enable permissive CORS in the stack. Redeploy if you changed it.\n\n## 📂 Project Structure\n\n```\npsychiatrist-scheduler/\n├── api/                      # Lambda handlers (TypeScript)\n│   └── ...\n│\n├── infra/                    # AWS CDK app (TypeScript)\n│   ├── bin/\n│   │   └── psychiatrist-scheduler.ts # CDK entrypoint\n│   ├── lib/\n│   │   └── infra.ts          # Stack: DynamoDB, GSIs, Lambdas, HTTP API, CORS\n│   └── package.json\n│\n├── web/                      # React + Vite frontend (TypeScript)\n│   ├── src/\n│   │   ├── api.ts            # Lightweight API client\n│   │   ├── App.tsx           # Routes + AppBar\n│   │   └── pages/\n│   │       ├── PsychiatristsPage.tsx # Search + weekly availability + request\n│   │       └── AdminPage.tsx         # Approve/Reject + list all appointments\n│   ├── index.html, main.tsx, ...\n│   └── package.json\n```\n\n## 🛠 Tech Used\n\n- **Frontend**\n  - [React](https://react.dev/) + [Vite](https://vitejs.dev/) + TypeScript\n  - [MUI](https://mui.com/) for UI components\n  - [Luxon](https://moment.github.io/luxon/) for date/time handling\n\n- **Backend**\n  - AWS Lambda (Node.js 20)\n  - API Gateway HTTP API\n  - DynamoDB (single-table design + GSIs)\n  - [schemy-ts](https://github.com/aeberdinelli/schemy) for schema validation\n\n- **Infra**\n  - [AWS CDK v2](https://docs.aws.amazon.com/cdk/v2/guide/home.html) for IaC\n  - Permissive CORS for quick prototyping\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faeberdinelli%2Fproduct-engineer-challenge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faeberdinelli%2Fproduct-engineer-challenge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faeberdinelli%2Fproduct-engineer-challenge/lists"}