{"id":50434615,"url":"https://github.com/top-submissions/template-react-expressjs","last_synced_at":"2026-05-31T16:30:39.916Z","repository":{"id":338149385,"uuid":"1153410906","full_name":"top-submissions/template-react-expressjs","owner":"top-submissions","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-20T06:05:34.000Z","size":645,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-20T21:50:47.786Z","etag":null,"topics":["authentication","crud","css-modules","express","fullstack","javascript","jwt","nodejs","postgresql","prisma","react","react-router","rest-api","role-based-access-control","template","testing","the-odin-project","typescript-ready","vite","vitest"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/top-submissions.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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":"2026-02-09T09:14:17.000Z","updated_at":"2026-03-20T06:09:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"7ff1bb31-8374-4b76-8428-0b44d866fd5b","html_url":"https://github.com/top-submissions/template-react-expressjs","commit_stats":null,"previous_names":["top-submissions/template-react-expressjs"],"tags_count":0,"template":true,"template_full_name":"top-submissions/template-react","purl":"pkg:github/top-submissions/template-react-expressjs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/top-submissions%2Ftemplate-react-expressjs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/top-submissions%2Ftemplate-react-expressjs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/top-submissions%2Ftemplate-react-expressjs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/top-submissions%2Ftemplate-react-expressjs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/top-submissions","download_url":"https://codeload.github.com/top-submissions/template-react-expressjs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/top-submissions%2Ftemplate-react-expressjs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33739860,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"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":["authentication","crud","css-modules","express","fullstack","javascript","jwt","nodejs","postgresql","prisma","react","react-router","rest-api","role-based-access-control","template","testing","the-odin-project","typescript-ready","vite","vitest"],"created_at":"2026-05-31T16:30:37.857Z","updated_at":"2026-05-31T16:30:39.909Z","avatar_url":"https://github.com/top-submissions.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Project Name\n\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![The Odin Project](https://img.shields.io/badge/The%20Odin%20Project-NodeJS-red)](https://www.theodinproject.com/paths/full-stack-javascript/courses/nodejs)\n\n\u003e A full-stack application built with React and Express as part of The Odin Project's NodeJS curriculum. Features JWT authentication, role-based access control, PostgreSQL via Prisma ORM, and a modular search system.\n\n## 📋 Table of Contents\n\n- [Project Name](#project-name)\n  - [📋 Table of Contents](#-table-of-contents)\n  - [✨ Features](#-features)\n  - [🚀 Getting Started](#-getting-started)\n  - [📁 Project Structure](#-project-structure)\n  - [📖 Documentation](#-documentation)\n  - [🧪 Testing](#-testing)\n  - [💡 Future Improvements](#-future-improvements)\n  - [🛠️ Technologies Used](#️-technologies-used)\n  - [🙏 Acknowledgments](#-acknowledgments)\n\n## ✨ Features\n\n- JWT authentication with HttpOnly cookies\n- Role-based access control (USER / ADMIN / SUPER_ADMIN)\n- Full-stack search with filters, sorting, and URL-state persistence\n- Prisma ORM with PostgreSQL\n- Vitest + React Testing Library test suite (client \u0026 server)\n- Dark/light theme toggle\n- Responsive layout with mobile Navbar\n\n## 🚀 Getting Started\n\nSee **[docs/setup.md](docs/setup.md)** for the full environment setup guide.\n\n**Quick start** (after setup):\n\n```bash\nnpm run install:all   # install all dependencies\nnpm run dev           # start client + server concurrently\n```\n\n## 📁 Project Structure\n\n```\ntemplate-react-expressjs/\n├── client/               # React + Vite frontend\n│   └── src/\n│       ├── components/   # UI components grouped by domain\n│       ├── config/       # searchConfig.js — drives all search UI\n│       ├── layouts/      # MainLayout (Navbar + Outlet)\n│       ├── modules/api/  # Fetch wrappers per domain\n│       ├── pages/        # Route-level components\n│       ├── providers/    # Auth, Theme, Toast context\n│       ├── routes/       # AuthRoute, AdminRoute guards\n│       ├── routes.jsx    # createBrowserRouter config\n│       └── styles/       # Global CSS variables, reset, animations\n├── server/               # Express backend\n│   └── src/\n│       ├── config/       # Passport, CORS, cookie options\n│       ├── controllers/  # Route handlers\n│       ├── db/queries/   # Prisma query functions per domain\n│       ├── middleware/   # Auth, error, app middleware\n│       └── routes/       # Express routers\n├── docs/\n│   ├── setup.md          # Environment setup (PostgreSQL, .env, pgAdmin)\n│   ├── architecture.md   # Stack overview, request flow, patterns\n│   └── testing.md        # Testing conventions and patterns\n├── CONTRIBUTING.md       # Branching, commit conventions, PR process\n├── CHANGELOG.md          # Version history\n└── package.json          # Root orchestration scripts\n```\n\n## 📖 Documentation\n\n| Doc                                          | Description                                                             |\n| -------------------------------------------- | ----------------------------------------------------------------------- |\n| [docs/setup.md](docs/setup.md)               | PostgreSQL installation (Windows/macOS/Linux), `.env` config, pgAdmin 4 |\n| [docs/architecture.md](docs/architecture.md) | Stack overview, request flow, client/server structure, auth flow        |\n| [docs/testing.md](docs/testing.md)           | Testing patterns, mocking conventions, what to test                     |\n| [CONTRIBUTING.md](CONTRIBUTING.md)           | Branching strategy, commit conventions, PR process                      |\n| [CHANGELOG.md](CHANGELOG.md)                 | Version history                                                         |\n\n## 🧪 Testing\n\n```bash\ncd client \u0026\u0026 npm run test:watch   # client — watch mode\ncd server \u0026\u0026 npm run test:watch   # server — watch mode\n```\n\nSee [docs/testing.md](docs/testing.md) for patterns, mocking conventions, and gotchas.\n\n## 💡 Future Improvements\n\n- [ ] Gallery and list view modes for search results\n- [ ] Pagination on search results\n- [ ] Email verification on signup\n- [ ] File upload support (profile avatars)\n- [ ] Rate limiting on auth endpoints\n\n## 🛠️ Technologies Used\n\n**Client:** React 19, React Router 7, Vite, CSS Modules, Lucide React, Vitest, React Testing Library\n\n**Server:** Node.js, Express, Prisma ORM, PostgreSQL, Passport.js (Local + JWT), bcryptjs, express-validator\n\n**Tooling:** ESLint, Prettier, concurrently, nodemon\n\n## 🙏 Acknowledgments\n\n- **The Odin Project** — For providing an amazing free curriculum\n- **The TOP Community** — For being supportive and helpful throughout\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\nBuilt with 💡 and ☕ as part of my journey through \u003ca href=\"https://www.theodinproject.com/paths/full-stack-javascript/courses/nodejs\"\u003eThe Odin Project — NodeJS\u003c/a\u003e\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftop-submissions%2Ftemplate-react-expressjs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftop-submissions%2Ftemplate-react-expressjs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftop-submissions%2Ftemplate-react-expressjs/lists"}