{"id":31180395,"url":"https://github.com/dracudev/learnhub-app","last_synced_at":"2026-04-07T21:31:46.686Z","repository":{"id":306151201,"uuid":"1024767076","full_name":"dracudev/learnhub-app","owner":"dracudev","description":"EJS-driven Node.js app offering user, course, and enrollment features via its integrated API.","archived":false,"fork":false,"pushed_at":"2025-08-19T10:45:22.000Z","size":900,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-19T17:14:09.323Z","etag":null,"topics":["api","api-rest","crud","css","ejs","expressjs","javascript","jwt","mysql","nodejs","orm","sequelize"],"latest_commit_sha":null,"homepage":"https://dracudev-learnhub-app.vercel.app/","language":"CSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dracudev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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-07-23T08:07:33.000Z","updated_at":"2025-08-19T10:45:25.000Z","dependencies_parsed_at":"2025-08-15T10:11:50.826Z","dependency_job_id":"73fd183f-e507-4280-b0b1-0663e2064095","html_url":"https://github.com/dracudev/learnhub-app","commit_stats":null,"previous_names":["dracudev/course-catalog","dracudev/course-catalog-app","dracudev/learn-hub-app","dracudev/learnhub-app"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dracudev/learnhub-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dracudev%2Flearnhub-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dracudev%2Flearnhub-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dracudev%2Flearnhub-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dracudev%2Flearnhub-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dracudev","download_url":"https://codeload.github.com/dracudev/learnhub-app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dracudev%2Flearnhub-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31530641,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["api","api-rest","crud","css","ejs","expressjs","javascript","jwt","mysql","nodejs","orm","sequelize"],"created_at":"2025-09-19T16:58:09.757Z","updated_at":"2026-04-07T21:31:46.661Z","avatar_url":"https://github.com/dracudev.png","language":"CSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LearnHub | Online Courses\n\n![LearnHub](public/images/mockup.png)\n\n\u003e A comprehensive online learning platform for managing courses, user enrollment, and educational content with role-based access control.\n\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-learnhub--app.vercel.app-blue?style=for-the-badge\u0026logo=vercel)](https://learnhub-app.vercel.app/)\n[![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg?style=for-the-badge)](LICENSE.md)\n\n## Table of Contents\n\n- [Description](#description)\n- [Features](#features)\n- [Technologies Used](#technologies-used)\n- [Setup Instructions](#setup-instructions)\n- [Default Users](#default-users)\n- [API Routes](#api-routes)\n- [Scripts](#scripts)\n- [File Structure](#file-structure)\n- [Database Schema](#database-schema)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Description\n\nA Node.js application for managing courses with user authentication and enrollment features, built with Express.js and a database abstraction layer that supports easy ORM switching.\n\n## Features\n\n- JWT-based authentication for APIs\n- Role-based access (public, registered, admin)\n- Course management (CRUD operations)\n- Course enrollment system\n- Admin dashboard\n- User profiles with profile picture upload\n- Database abstraction layer (easy ORM switching)\n- Security middleware: helmet, express-rate-limit\n- Multi-environment support (MySQL for dev, PostgreSQL for prod)\n\n## Technologies Used\n\n- **Backend**: Node.js, Express.js\n- **Database**: MySQL (development), PostgreSQL (production) with Sequelize ORM\n- **Architecture**: Database abstraction layer\n- **Authentication**: bcrypt, express-session, jsonwebtoken (JWT)\n- **Security**: helmet, express-rate-limit\n- **View Engine**: EJS\n- **Validation**: express-validator\n- **Deployment**: Vercel (serverless)\n\n## Setup Instructions\n\n1. **Clone the repository**\n\n   ```bash\n   git clone https://github.com/dracudev/learnhub-app\n   cd learnhub-app\n   ```\n\n2. **Install dependencies**\n\n   ```bash\n   npm install\n   ```\n\n3. **Set up environment variables**\n   Create a `.env` file in the root directory:\n\n   ```env\n   # Development (MySQL)\n   PORT=3000\n   DB_HOST=localhost\n   DB_USER=root\n   DB_PASS=your_mysql_password\n   DB_NAME=course_management\n   DB_PORT=3306\n   SESSION_SECRET=your_secret_key_here\n   NODE_ENV=development\n   \n   # Production (PostgreSQL)\n   POSTGRES_URL=your_postgresql_connection_string\n   ```\n\n4. **Set up the database**\n\n   ```bash\n   # Run migrations to create tables\n   npm run migrate\n   \n   # Seed the database with initial data\n   npm run seed\n   ```\n\n5. **Start the development server**\n\n   ```bash\n   npm run dev\n   ```\n\n## Default Users\n\nAfter seeding, you can log in with:\n\n**Admin User:**\n\n- Email: \u003cadmin@admin.com\u003e\n- Password: admin\n\n**Regular User:**\n\n- Email: \u003cuser@user.com\u003e\n- Password: user\n\n## API Routes\n\n### Authentication\n\n- `GET /auth/signup` - Sign up form\n- `POST /auth/signup` - Create new user\n- `GET /auth/login` - Login form\n- `POST /auth/login` - Authenticate user\n- `POST /auth/logout` - Logout user\n\n### Courses\n\n- `GET /courses` - List all courses\n- `GET /courses/:id` - Course details\n- `GET /admin/dashboard` - Admin dashboard (admin only)\n- `GET /courses/create` - Create course form (admin only)\n- `POST /courses/create` - Create new course (admin only)\n- `GET /courses/:id/edit` - Edit course form (admin only)\n- `POST /courses/:id/edit` - Update course (admin only)\n- `POST /courses/:id/delete` - Delete course (admin only)\n\n### User Profile\n\n- `GET /user/profile` - User profile and enrolled courses\n- `POST /user/enroll/:courseId` - Enroll in course\n- `POST /user/unenroll/:courseId` - Unenroll from course\n\n## Scripts\n\n- `npm start` - Start production server (with deployment script)\n- `npm run dev` - Start development server with nodemon\n- `npm run migrate` - Run database migrations\n- `npm run seed` - Run all seeders\n- `npm run neon:setup` - Set up production database (PostgreSQL)\n- `npm run build` - Install dependencies\n\n## File Structure\n\n```tree\n├── app.js                   # Main application entry point\n├── package.json            # Dependencies and scripts\n├── vercel.json             # Deployment configuration\n├── api/\n│   └── index.js            # Serverless function entry\n├── database/\n│   ├── config/             # Database configuration\n│   ├── migrations/         # Database migrations\n│   ├── schemas/           # Database schemas\n│   └── seeders/           # Sample data\n├── public/\n│   ├── images/            # Static images\n│   └── styles/            # CSS files\n└── src/\n    ├── server.js          # Express server\n    ├── controllers/       # Route handlers\n    ├── middleware/        # Custom middleware\n    ├── models/           # Database models\n    ├── routes/           # Route definitions\n    └── views/            # EJS templates\n```\n\n## Database Schema\n\n### Users Table\n\n| Column           | Type         | Details                        |\n|------------------|--------------|--------------------------------|\n| id               | INTEGER      | Primary Key                    |\n| name             | STRING       |                                |\n| email            | STRING       | Unique                         |\n| password         | STRING       | Hashed                         |\n| role             | STRING       | public, registered, admin      |\n| profile_picture  | STRING       |                                |\n| created_at       | DATETIME     |                                |\n\n### Courses Table\n\n| Column       | Type     | Details                |\n|--------------|----------|------------------------|\n| id           | INTEGER  | Primary Key            |\n| title        | STRING   |                        |\n| description  | TEXT     |                        |\n| category     | STRING   |                        |\n| visibility   | STRING   | public, private        |\n| created_at   | DATETIME |                        |\n\n### Enrollments Table\n\n| Column          | Type     | Details                          |\n|-----------------|----------|----------------------------------|\n| id              | INTEGER  | Primary Key                      |\n| user_id         | INTEGER  | Foreign Key (Users)              |\n| course_id       | INTEGER  | Foreign Key (Courses)            |\n| enrollment_date | DATETIME |                                  |\n| (user_id, course_id) | UNIQUE   | Composite unique constraint |\n\n## License\n\nThis project is licensed under the ISC License - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdracudev%2Flearnhub-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdracudev%2Flearnhub-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdracudev%2Flearnhub-app/lists"}