{"id":20251695,"url":"https://github.com/jillmpla/node_js_space_events_app","last_synced_at":"2026-04-16T05:04:39.081Z","repository":{"id":247019431,"uuid":"824827344","full_name":"jillmpla/node_js_space_events_app","owner":"jillmpla","description":"Space-themed event management app built with Node.js, Express, EJS, and MongoDB Atlas. MVC architecture with session-based authentication and role-based authorization, RSVP workflow, and Cloudinary uploads.","archived":false,"fork":false,"pushed_at":"2025-11-13T06:10:56.000Z","size":21212,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-14T22:06:20.122Z","etag":null,"topics":["bcrypt","ejs","events","events-management","events-manager","express","helmet","javascript","mongodb","mongodb-atlas","mongoose","multer","mvc","mvc-pattern","node-js","nodejs","webapp","webapplication"],"latest_commit_sha":null,"homepage":"https://celestialgatherings.com/","language":"EJS","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/jillmpla.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}},"created_at":"2024-07-06T04:07:24.000Z","updated_at":"2025-11-13T06:11:00.000Z","dependencies_parsed_at":"2024-07-06T05:46:23.076Z","dependency_job_id":"b1c7b52e-913d-48ba-a437-5c133354cb04","html_url":"https://github.com/jillmpla/node_js_space_events_app","commit_stats":null,"previous_names":["jillmpla/node_js_space_events_app"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jillmpla/node_js_space_events_app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jillmpla%2Fnode_js_space_events_app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jillmpla%2Fnode_js_space_events_app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jillmpla%2Fnode_js_space_events_app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jillmpla%2Fnode_js_space_events_app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jillmpla","download_url":"https://codeload.github.com/jillmpla/node_js_space_events_app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jillmpla%2Fnode_js_space_events_app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31872036,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T15:24:51.572Z","status":"online","status_checked_at":"2026-04-16T02:00:06.042Z","response_time":69,"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":["bcrypt","ejs","events","events-management","events-manager","express","helmet","javascript","mongodb","mongodb-atlas","mongoose","multer","mvc","mvc-pattern","node-js","nodejs","webapp","webapplication"],"created_at":"2024-11-14T10:12:22.251Z","updated_at":"2026-04-16T05:04:39.075Z","avatar_url":"https://github.com/jillmpla.png","language":"EJS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🌌 Celestial Gatherings\n\nCelestial Gatherings is a **space-themed event management platform** that makes it easy to create, share, and join events under the stars. Built with **Node.js, Express.js, MongoDB Atlas, and EJS**, it follows the MVC pattern and provides a smooth, secure experience for both event hosts and guests.  \n\nThe app combines **robust backend functionality** with a **clean, responsive UI/UX**, giving users everything they need to plan astronomy meetups, science talks, watch parties, or any gathering that feels *out of this world*.\n\n🔗 **Live Demo:** [celestialgatherings.com](https://www.celestialgatherings.com)  \n\u003e📌 *Note: Demo resets daily.*\n\nWant to explore without signing up?  \nUse the following demo credentials:\n\n- **Email:** `johndoe2@gmail.com`  \n- **Password:** `JaaL42$Aa`  \n\n---\n\n## ✨ Core Functionality\n\n- **Event Management**  \n  Create, edit, and manage events with full CRUD capabilities. Each event includes title, category, location, description, start/end dates, and optional image.\n\n- **RSVP System**  \n  Registered users can RSVP `YES / NO / MAYBE`. Hosts are prevented from RSVPing to their own events to keep data clean and meaningful.\n\n- **Authentication \u0026 Profiles**  \n  Secure sign-up and login with session-based auth. Logged-in users can view their profile, hosted events, and RSVPs.\n\n- **Image Hosting**  \n  Upload event images via **Cloudinary** (with Multer). If no image is uploaded, a placeholder is used.\n\n- **User Feedback**  \n  Flash messages and custom error pages provide clear guidance for success, warning, and error states.\n\n- **Responsive UI/UX**  \n  Space-inspired theme with accessible forms, visible focus states, and navigation that adapts to login state.\n\n---\n\n## 🛠️ Tech Stack\n\n- **Frontend**: EJS templates, Bootstrap 4, custom CSS\n- **Backend**: Node.js, Express.js\n- **Database**: MongoDB Atlas with Mongoose\n- **Authentication**: `express-session` + `connect-mongo` session storage\n- **File Uploads**: Multer + Cloudinary (`multer-storage-cloudinary`)\n- **Validation \u0026 Security**: express-validator, validator, Helmet, express-rate-limit, bcryptjs\n- **Performance \u0026 Logging**: compression, morgan\n- **Utilities**: Luxon (date/time), he (HTML entity encoding)\n\n---\n\n## 🔐 Authentication \u0026 Authorization\n\n- **Guests** can:\n  - Browse events\n\n- **Registered Users** can:\n  - Sign up / log in securely\n  - RSVP to events\n  - Host new events\n  - Edit or delete events they created\n  - Manage RSVPs\n\n- **Authorization** middleware ensures only event hosts can modify their own events.\n\n---\n\n## 🧑‍🎨 UI/UX\n\n- **Space-inspired theme** with deep blues and cosmic accents  \n- **Accessible forms** with visible focus states, proper input validation, and keyboard-friendly navigation  \n- **Dynamic header navigation**: changes based on login state (Sign Up/Login vs. Profile/New Event/Logout)  \n- **Custom error views**: informative 400, 401, 404, and 500 pages  \n- **Responsive layouts**: looks great on desktop, tablet, and mobile\n\n---\n\n## 🧩 Design System\n\n- Shared style variables in one place (colors, spacing, corners, shadows, type)\n- Consistent hover/active/focus states across main nav and account links\n- Text scales smoothly on all screens; clean spacing; sticky footer; no layout shift\n\n---\n\n## ♿ Accessibility\n- Full keyboard support: clear focus outline + \"skip to content\" link\n- Semantic landmarks (header, nav, main, footer), time elements, meaningful headings\n- Forms announce errors; labels tied to inputs; status messages are announced\n- Large, readable text and strong color contrast (meets WCAG AA level)\n- Respects \"Reduce Motion\" preference\n\n---\n\n## 🧪 Validation \u0026 Error Handling\n\n- Uses **express-validator** to validate/sanitize form input  \n- Passwords are hashed securely with **bcrypt** before storage  \n- Friendly error pages for:\n  - Invalid IDs  \n  - Unauthorized access  \n  - Missing resources  \n  - Server/database errors\n\n---\n\n## 📚 Key Libraries\n\n- Backend: `express`, `mongoose`, `express-session`, `connect-mongo`\n- Auth/Security: `bcryptjs`, `express-rate-limit`, `helmet`, `validator`\n- File Uploads: `multer`, `multer-storage-cloudinary`, `cloudinary`\n- Validation/Formatting: `express-validator`, `luxon`, `he`\n- UX/Feedback: `connect-flash`\n- Performance/Logging: `compression`, `morgan`\n\n---\n\n## 🧱 Project Structure (MVC)\nThis codebase follows the Model-View-Controller (MVC) pattern. This keeps the app maintainable, testable, and easy to extend.\n\n- **Models (Mongoose):** data schema + validation.\n- **Views (EJS):** server-rendered HTML templates.\n- **Controllers (Express):** request in → response out.\n- **Routes:** HTTP method + path → controller.\n- **Middleware:** pre-route logic (auth/sessions/logging).\n\n```bash\n├─ app.js                         #app entrypoint: Express config, sessions, MongoDB, routes, views\n├─ middlewares.js                 #auth/role checks (isAuthenticated, isGuest, isHost/isNotHost)\n├─ controllers/                   #controllers (request handlers)\n│  ├─ mainController.js           #home/about/contact\n│  ├─ userController.js           #auth, profile\n│  └─ eventController.js          #event CRUD, RSVP\n├─ models/                        #models (Mongoose schemas)\n│  ├─ user.js\n│  ├─ eventModel.js\n│  └─ rsvp.js\n├─ routes/                        #express routers\n│  ├─ mainRoutes.js\n│  ├─ userRoutes.js\n│  └─ eventRoutes.js\n├─ views/                         #views (EJS templates)\n│  ├─ about.ejs\n│  ├─ contact.ejs -\n│  ├─ edit.ejs -\n│  ├─ error.ejs\n│  ├─ event.ejs -\n│  ├─ events.ejs\n│  ├─ index.ejs\n│  ├─ login.ejs\n│  ├─ newEvent.ejs\n│  ├─ profile.ejs\n│  ├─ signup.ejs -\n│  └─ partials/                   #shared UI\n│     ├─ header.ejs\n│     ├─ footer.ejs\n│     └─ nav.ejs\n├─ public/                        #static assets served by Express\n│  ├─ css/\n│  ├─ images/\n│  └─ javascript/                 #client-side scripts\n├─ package.json\n└─ package-lock.json\n```\n---\n\n## 🚀 Getting Started (Local Dev)\n\n1) Clone repository\n\n```bash\ngit clone https://github.com/jillmpla/node_js_space_events_app.git\ncd node_js_space_events_app\n```\n\n2) Install dependencies\n\n```bash\nnpm install\n```\n\n3) Create a .env file with your keys\n\n```bash\nMONGODB_URI=...\nSECRET_KEY=...\nCLOUDINARY_CLOUD_NAME=...\nCLOUDINARY_API_KEY=...\nCLOUDINARY_API_SECRET=...\nCLOUDINARY_URL=...\n```\n\n4) Run the app\n\n```bash\nnpm start\n```\n\n5) Visit: http://localhost:3000\n\n---\n\n## 📜 License\nThis project is licensed under the MIT License. See the [License](./LICENSE) file for details.\n\n## If you find this project useful, consider giving it a star! ⭐","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjillmpla%2Fnode_js_space_events_app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjillmpla%2Fnode_js_space_events_app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjillmpla%2Fnode_js_space_events_app/lists"}