{"id":23740457,"url":"https://github.com/b-l-i-n-d/edtech","last_synced_at":"2025-07-06T18:13:15.924Z","repository":{"id":188412430,"uuid":"678691366","full_name":"b-l-i-n-d/edTech","owner":"b-l-i-n-d","description":"A edTech platform using mongoDB, express, nextjs and nodejs","archived":false,"fork":false,"pushed_at":"2023-08-15T15:57:42.000Z","size":4678,"stargazers_count":3,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-05-24T11:09:28.031Z","etag":null,"topics":["ant-design","cloudinary","expressjs","handlebars","joi","jwt","mongodb","mongoose","nextjs","passportjs","reactmarkdown","reactplayer","redux-toolkit","reduxpersist","rtk-query","typescript"],"latest_commit_sha":null,"homepage":"https://ed-tech-six.vercel.app","language":"TypeScript","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/b-l-i-n-d.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}},"created_at":"2023-08-15T06:20:37.000Z","updated_at":"2025-03-29T07:22:57.000Z","dependencies_parsed_at":"2025-02-20T17:43:00.797Z","dependency_job_id":"775ff949-7c6e-4359-8305-207d6f6a8958","html_url":"https://github.com/b-l-i-n-d/edTech","commit_stats":null,"previous_names":["b-l-i-n-d/edtech"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-l-i-n-d%2FedTech","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-l-i-n-d%2FedTech/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-l-i-n-d%2FedTech/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-l-i-n-d%2FedTech/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/b-l-i-n-d","download_url":"https://codeload.github.com/b-l-i-n-d/edTech/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-l-i-n-d%2FedTech/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":257292207,"owners_count":22522341,"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","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":["ant-design","cloudinary","expressjs","handlebars","joi","jwt","mongodb","mongoose","nextjs","passportjs","reactmarkdown","reactplayer","redux-toolkit","reduxpersist","rtk-query","typescript"],"created_at":"2024-12-31T09:50:30.035Z","updated_at":"2025-07-06T18:13:15.919Z","avatar_url":"https://github.com/b-l-i-n-d.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eEdTech\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/repo-size/b-l-i-n-d/edtech?color=green\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/last-commit/b-l-i-n-d/edtech?color=green\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/languages/count/b-l-i-n-d/edtech?color=green\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/languages/top/b-l-i-n-d/edtech?color=green\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/b-l-i-n-d/edtech?color=green\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#about\"\u003eAbout\u003c/a\u003e •\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#technologies\"\u003eTechnologies\u003c/a\u003e •\n  \u003ca href=\"#env-setup\"\u003eEnvironment variables\u003c/a\u003e •\n  \u003ca href=\"#how-to-run\"\u003eHow to run\u003c/a\u003e •\n  \u003ca href=\"#api-endpoints\"\u003eAPI endpoints\u003c/a\u003e •\n  \u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\n\u003c/p\u003e\n\n## About\n\nEdTech is a web application that aims to connect students and teachers in a simple and intuitive way. It was inspired by the [LWS](www.learnwithsumit.com) platform.\n\n## Features\n\n-   [x] Students can register on the platform by sending:\n    -   [x] Name\n    -   [x] Email\n    -   [x] Password\n    -   [x] Avatar (optional)\n-   [x] Students can log in to the platform by sending:\n    -   [x] Email\n    -   [x] Password\n-   [x] Students can update their:\n    -   [x] Avatar\n-   [x] Students can recover their password by sending:\n    -   [x] Email\n-   [x] Student can change their password by sending:\n    -   [x] New password\n    -   [x] Password confirmation\n-   [x] Admin can log in to the platform by sending:\n    -   [x] Email\n    -   [x] Password\n-   [x] Admin can course videos by sending:\n    -   [x] Title\n    -   [x] Description\n    -   [x] Video URL\n    -   [x] Thumbnail URL\n-   [x] Admin can add quizzes to courses by sending:\n    -   [x] Title\n    -   [x] Questions with:\n        -   [x] Title\n        -   [x] Options\n            -   [x] Title\n            -   [x] Is correct\n-   [x] Admin can add assignments by sending:\n    -   [x] Title\n    -   [x] Description\n    -   [x] Due date\n    -   [x] Total marks\n-   [x] Admin can add update submitted assignments by sending:\n    -   [x] Marks\n    -   [x] Feedback\n\n## Technologies\n\nThe following tools were used in the construction of the project:\n\n### Client\n\n-   [NextJs](https://nextjs.org/)\n-   [TypeScript](https://www.typescriptlang.org/)\n-   [Ant Design](https://ant.design/)\n-   [Redux Toolkit](https://redux-toolkit.js.org/)\n-   [RTK Query](https://redux-toolkit.js.org/rtk-query/overview)\n-   [Redux Persist](https://www.github.com/rt2zz/redux-persist)\n-   [React Markdown](https://www.npmjs.com/package/react-markdown)\n-   [React Player](https://www.npmjs.com/package/react-player)\n\n### Server\n\n-   [NodeJs](https://nodejs.org/en/)\n-   [Express](https://expressjs.com/)\n-   [Cloudinary](https://cloudinary.com/)\n-   [JWT](https://jwt.io/)\n-   [Passport](http://www.passportjs.org/)\n-   [NodeMailer](https://nodemailer.com/about/)\n-   [Handlebars](https://handlebarsjs.com/)\n-   [MongoDB](https://www.mongodb.com/)\n-   [Mongoose](https://mongoosejs.com/)\n-   [Bcrypt](https://www.npmjs.com/package/bcrypt)\n-   [Joi](https://www.npmjs.com/package/joi)\n-   [Helmet](https://helmetjs.github.io/)\n-   [http-status](https://www.npmjs.com/package/http-status)\n\n## Env setup\n\n### Client\n\n1. Create a `.env.local` file in the root of the client folder\n2. Add the following environment variables\n\n```bash\n#API\nNEXT_PUBLIC_API_URL=\u003cAPI Url\u003e\nNEXT_PUBLIC_PAGE_SIZE=10\n```\n\n### Server\n\n1. Create a `.env` file in the root of the server folder\n2. Add the following environment variables\n\n```bash\n# Port number\nNODE_ENV=development\nPORT='\u003cPort number\u003e'\n\n# URL of the app\nAPP_URL=\u003cClient URL\u003e\n\n# URL of the Mongo DB\nMONGODB_URL='\u003cMongoDB URL\u003e'\n\n# JWT\n# JWT secret key\nJWT_SECRET='\u003cSecret key\u003e'\n# Number of minutes after which an access token expires\nJWT_ACCESS_EXPIRATION_MINUTES='\u003cNumber of minutes\u003e'\n# Number of days after which a refresh token expires\nJWT_REFRESH_EXPIRATION_DAYS='\u003cNumber of days\u003e'\n# Number of minutes after which a reset password token expires\nJWT_RESET_PASSWORD_EXPIRATION_MINUTES='\u003cNumber of minutes\u003e'\n# Number of minutes after which a verify email token expires\nJWT_VERIFY_EMAIL_EXPIRATION_MINUTES='\u003cNumber of minutes\u003e'\n\n# SMTP configuration options for the email service\n# For testing, you can use a fake SMTP service like Ethereal: https://ethereal.email/create\nSMTP_HOST='\u003cSMTP host\u003e'\nSMTP_PORT='\u003cSMTP port\u003e'\nSMTP_USERNAME='\u003cSMTP username\u003e'\nSMTP_PASSWORD='\u003cSMTP password\u003e'\nEMAIL_FROM='\u003cEmail from\u003e'\n\n# Cloudinary account credentials\nCLOUDINARY_CLOUD_NAME='\u003cCloudinary cloud name\u003e'\nCLOUDINARY_API_KEY='\u003cCloudinary API key\u003e'\nCLOUDINARY_API_SECRET='\u003cCloudinary API secret\u003e'\n\n```\n\n## How to run\n\n1. Clone this repository\n\n```bash\ngit clone https://github.com/b-l-i-n-d/edTech.git\n```\n\n2.  Install dependencies\n\n    Server\n\n    ```bash\n    cd server\n    yarn\n    ```\n\n    Client\n\n    ```bash\n    cd client\n    yarn\n    ```\n\n3.  Run the application\n\n    Server\n\n    ```bash\n    yarn dev\n    ```\n\n    Client\n\n    ```bash\n    yarn dev\n    ```\n\n4.  You can optionally build the application\n\n    Server\n\n    ```bash\n    yarn start\n    ```\n\n    Client\n\n    ```bash\n    yarn build\n    ```\n\n## API endpoints\n\n### Auth\n\n| Route                              | Method | Description                   |\n| :--------------------------------- | :----: | :---------------------------- |\n| `/v1/auth/register`                |  POST  | Register a new user           |\n| `/v1/auth/login`                   |  POST  | Login a user                  |\n| `/v1/auth/logout`                  |  POST  | Logout a user                 |\n| `/v1/auth/refresh-tokens`          |  POST  | Refresh access token          |\n| `/v1/auth/forgot-password`         |  POST  | Send password reset email     |\n| `/v1/auth/reset-password`          |  POST  | Reset password                |\n| `/v1/auth/reset-password`          |  POST  | Reset password                |\n| `/v1/auth/send-verification-email` |  POST  | Send email verification email |\n| `/v1/auth/verify-email`            |  POST  | Verify email                  |\n\n### Users\n\n| Route               | Method | Description     |\n| :------------------ | :----: | :-------------- |\n| `/v1/users`         |  GET   | Get all users   |\n| `/v1/users`         |  POST  | Create new user |\n| `/v1/users/:userId` |  GET   | Get a user      |\n| `/v1/users/:userId` | PATCH  | Update a user   |\n| `/v1/users/:userId` | DELETE | Delete a user   |\n\n### Videos\n\n| Route                 | Method | Description      |\n| :-------------------- | :----: | :--------------- |\n| `/v1/videos`          |  GET   | Get all videos   |\n| `/v1/videos`          |  POST  | Create new video |\n| `/v1/videos/:videoId` |  GET   | Get a video      |\n| `/v1/videos/:videoId` | PATCH  | Update a video   |\n| `/v1/videos/:videoId` | DELETE | Delete a video   |\n\n### Quizzes\n\n| Route                 | Method | Description     |\n| :-------------------- | :----: | :-------------- |\n| `/v1/quizzes`         |  GET   | Get all quizzes |\n| `/v1/quizzes`         |  POST  | Create new quiz |\n| `/v1/quizzes/:quizId` |  GET   | Get a quiz      |\n| `/v1/quizzes/:quizId` | PATCH  | Update a quiz   |\n| `/v1/quizzes/:quizId` | DELETE | Delete a quiz   |\n\n### Assignments\n\n| Route                           | Method | Description           |\n| :------------------------------ | :----: | :-------------------- |\n| `/v1/assignments`               |  GET   | Get all assignments   |\n| `/v1/assignments`               |  POST  | Create new assignment |\n| `/v1/assignments/:assignmentId` |  GET   | Get a assignment      |\n| `/v1/assignments/:assignmentId` | PATCH  | Update a assignment   |\n| `/v1/assignments/:assignmentId` | DELETE | Delete a assignment   |\n\n### Quizz Sets\n\n| Route              | Method | Description          |\n| :----------------- | :----: | :------------------- |\n| `/v1/quizzes-sets` |  GET   | Get all quizzes sets |\n\n### Quizz Marks\n\n| Route               | Method | Description           |\n| :------------------ | :----: | :-------------------- |\n| `/v1/quizzes-marks` |  GET   | Get all quizzes marks |\n| `/v1/quizzes-marks` |  POST  | Create new quiz mark  |\n\n### Assignment Marks\n\n| Route                                     | Method | Description                |\n| :---------------------------------------- | :----: | :------------------------- |\n| `/v1/assignments-marks`                   |  GET   | Get all assignments marks  |\n| `/v1/assignments-marks`                   |  POST  | Create new assignment mark |\n| `/v1/assignments-marks/:assignmentMarkId` |  GET   | Get a assignment mark      |\n| `/v1/assignments-marks/:assignmentMarkId` | PATCH  | Update a assignment mark   |\n| `/v1/assignments-marks/:assignmentMarkId` | DELETE | Delete a assignment mark   |\n\n### Dashboard\n\n| Route           | Method | Description                       |\n| :-------------- | :----: | :-------------------------------- |\n| `/v1/dashboard` |  GET   | Get all required data for a users |\n\n### Leaderboard\n\n| Route             | Method | Description                   |\n| :---------------- | :----: | :---------------------------- |\n| `/v1/leaderboard` |  GET   | Get all users with their rank |\n\n### Docs\n\n| Route   | Method | Description  |\n| :------ | :----: | :----------- |\n| `/docs` |  GET   | Get all docs |\n\n## Screenshots\n\n### Auth\n\n#### Login\n\n![Login](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113262/learing-platform/screenshots/login_f5o6ew.png)\n\n#### Register\n\n![Register](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113263/learing-platform/screenshots/register_lyk6k2.png)\n\n#### Forgot password\n\n![Forgot password](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113265/learing-platform/screenshots/forgot-password_z1uhrd.png)\n\n### Home\n\n![Home](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113266/learing-platform/screenshots/home_ntq2um.png)\n\n### User\n\n#### Course Access\n\n![Course Access](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113272/learing-platform/screenshots/course_vgsno1.png)\n\n#### Dashboard\n\n![Dashboard](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113265/learing-platform/screenshots/user-dashboard_adu4zh.png)\n\n#### Leaderboard\n\n![Leaderboard](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113262/learing-platform/screenshots/user-leaderboard_lxydyq.png)\n\n#### Profile\n\n![Profile](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113267/learing-platform/screenshots/user-profile_g6hkfz.png)\n\n#### Change password\n\n![Change password](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113268/learing-platform/screenshots/user-change-password_ayclsp.png)\n\n### Admin\n\n#### Dashboard\n\n![Dashboard](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113261/learing-platform/screenshots/admin-dashboard_pr7rsk.png)\n\n#### Videos\n\n##### All videos\n\n![Videos](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113270/learing-platform/screenshots/admin-videos_mttqoe.png)\n\n##### Add video\n\n![Add video](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113266/learing-platform/screenshots/admin-add-video_gegr2k.png)\n\n##### Edit video\n\n![Edit video](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113269/learing-platform/screenshots/admin-edit-video_auszlx.png)\n\n#### View video\n\n![View video](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113268/learing-platform/screenshots/admin-view-video_xujqzx.png)\n\n#### Quizzes\n\n##### All quizzes\n\n![Quizzes](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113267/learing-platform/screenshots/admin-quizzes_hmu9bk.png)\n\n##### Add quiz\n\n![Add quiz](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113267/learing-platform/screenshots/admin-add-quizz_nd3if7.png)\n\n##### Edit quiz\n\n![Edit quiz](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113261/learing-platform/screenshots/admin-edit-quizz_gulutm.png)\n\n#### View quiz\n\n![View quiz](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113263/learing-platform/screenshots/admin-view-quizz_p3vag6.png)\n\n#### Assignments\n\n##### All assignments\n\n![Assignments](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113262/learing-platform/screenshots/admin-assignments_hpdoqf.png)\n\n##### Add assignment\n\n![Add assignment](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113261/learing-platform/screenshots/admin-add-assignment_j13hhn.png)\n\n##### Edit assignment\n\n![Edit assignment](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113264/learing-platform/screenshots/admin-edit-assingment-mark_zku5rh.png)\n\n#### View assignment\n\n![View assignment](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113261/learing-platform/screenshots/admin-view-assignment_rpxf1x.png)\n\n#### Assignments marks\n\n##### All assignments marks\n\n![Assignments marks](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113261/learing-platform/screenshots/admin-assignment-marks_f8ydet.png)\n\n##### Edit assignment mark\n\n![Edit assignment mark](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113264/learing-platform/screenshots/admin-edit-assingment-mark_zku5rh.png)\n\n##### View assignment mark\n\n![View assignment mark](https://res.cloudinary.com/b-l-i-n-d/image/upload/v1692113267/learing-platform/screenshots/admin-view-assignment-mark_pgqoau.png)\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fb-l-i-n-d%2Fedtech","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fb-l-i-n-d%2Fedtech","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fb-l-i-n-d%2Fedtech/lists"}