{"id":18472990,"url":"https://github.com/xmlynek/elearn-web-app","last_synced_at":"2026-04-12T00:02:11.695Z","repository":{"id":121613258,"uuid":"521602236","full_name":"xmlynek/Elearn-web-app","owner":"xmlynek","description":"Elearn application about UWB technology ","archived":false,"fork":false,"pushed_at":"2022-08-09T16:00:56.000Z","size":4294,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-12T23:24:34.555Z","etag":null,"topics":["axios","bootstrap","docker","docker-compose","express","formik-yup","jwt-tokens","mysql","nodejs","nodemailer","passport","prisma","react","react-pdf","rest-api","tsnode","typescript"],"latest_commit_sha":null,"homepage":"https://elearn-uwb-app.azurewebsites.net/welcome","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/xmlynek.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}},"created_at":"2022-08-05T10:50:50.000Z","updated_at":"2024-07-23T20:52:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"6d840d3f-5bbe-45ea-abbd-92d3e565d680","html_url":"https://github.com/xmlynek/Elearn-web-app","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/xmlynek/Elearn-web-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xmlynek%2FElearn-web-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xmlynek%2FElearn-web-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xmlynek%2FElearn-web-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xmlynek%2FElearn-web-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xmlynek","download_url":"https://codeload.github.com/xmlynek/Elearn-web-app/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xmlynek%2FElearn-web-app/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265703611,"owners_count":23814040,"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":["axios","bootstrap","docker","docker-compose","express","formik-yup","jwt-tokens","mysql","nodejs","nodemailer","passport","prisma","react","react-pdf","rest-api","tsnode","typescript"],"created_at":"2024-11-06T10:23:16.893Z","updated_at":"2026-04-12T00:02:11.509Z","avatar_url":"https://github.com/xmlynek.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# React Node Express TypeScript Elearn App about UWB\n\n![Logo](https://user-images.githubusercontent.com/70724986/178121509-1e2da0b5-7383-457e-974b-9036bb5256ed.png)\n\n---\n\n[![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge\u0026logo=typescript\u0026logoColor=white)](https://www.typescriptlang.org/)\n[![React](https://img.shields.io/badge/React-20232A?style=for-the-badge\u0026logo=react\u0026logoColor=61DAFB)](https://reactjs.org/)\n[![nodejs](https://img.shields.io/badge/Node.js-43853D?style=for-the-badge\u0026logo=node.js\u0026logoColor=white)](https://nodejs.dev/)\n[![ts-node](https://img.shields.io/badge/tsnode-3178C6.svg?style=for-the-badge\u0026logo=ts-node\u0026logoColor=white)](https://www.npmjs.com/package/ts-node)\n[![Expressjs](https://img.shields.io/badge/Express.js-404D59?style=for-the-badge)](https://expressjs.com/)\n[![Prisma](https://img.shields.io/badge/Prisma-3982CE?style=for-the-badge\u0026logo=Prisma\u0026logoColor=white)](https://www.prisma.io/)\n[![MySQL](https://img.shields.io/badge/MySQL-00000F?style=for-the-badge\u0026logo=mysql\u0026logoColor=white)](https://www.mysql.com/)\n[![Docker](https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white)](https://hub.docker.com/repository/docker/xmlynek/node-backend)\n[![Microsoft-azure](https://img.shields.io/badge/Microsoft_Azure-0089D6?style=for-the-badge\u0026logo=microsoft-azure\u0026logoColor=white)](https://elearn-uwb-bp.azurewebsites.net/welcome)\n[![Bootstrap](https://img.shields.io/badge/Bootstrap-563D7C?style=for-the-badge\u0026logo=bootstrap\u0026logoColor=white)](https://getbootstrap.com/)\n\n\u003cbr\u003e\n\n# Table of Contents\n\n- [Quick start](#quick-start)\n  - [npm](#npm)\n  - [docker-compose](#docker-compose)\n- [Overview](#overview)\n  - [Features](#features)\n- [Use Case Diagram](#use-case-diagram)\n- [User Roles and Functionality](#user-roles-and-functionality)\n  - [Unauthenticated](#li-unauthenticated-li)\n  - [Student](#li-student-li)\n  - [Teacher](#li-teacher-li)\n  - [Admin](#li-admin-li)\n- [Database Model](#database-model)\n- [Docker](#docker)\n  - [Docker run](#docker-run)\n  - [Docker compose](#docker-compose-1)\n  - [Env variables](#env-variables)\n- [App design \u0026 components](#app-design--components)\n- [License](#license)\n\n\u003cbr\u003e\n\n# Quick start\n\n## npm\n\n1. Run `npm install`\n2. Rename `config.env.example` to `config.env`\n3. Set valid `DATABASE_URL` in `config.env` file\n4. Run `npm start`\n5. App is running at http://localhost:8080/\n\n## Docker compose\n\n- Run `docker compose up`\n\n\u003cbr\u003e\n\n# Overview\n\nThis application is a Web Elearning application about the UWB technology, which is the result of my bachelor thesis rework. It's a full stack application, which consists of React, Nodejs and Typescript technology. App uses REST API for communication between FE \u0026 BE using Express framework. I used Prisma for ORM and MySQL database.\n\n- Example application is running on Microsoft Azure: https://elearn-uwb-app.azurewebsites.net\n- Admin credentials: `admin@random.sk` `password1`\n\n\u003cbr\u003e\n\n![homepage](https://user-images.githubusercontent.com/70724986/183497407-b165374b-e53a-42d0-b212-7666dda75e7f.png)\n\n## Features\n\n- Authentication/Authorization\n- JWT tokens\n- Client/server input validation\n- REST API (Express)\n- Swagger OpeAPI\n- Password reset\n- Roles\n- Dynamic forms using formik\n- Multiple question types\n- React PDF\n- Responsive design\n- Nodemailer\n- 2 languages\n- Passport jwt\n- Bootstrap\n- Axios\n- Docker \u0026 docker compose\n- \u0026 many others..\n  \u003cbr\u003e\n\n\u003cbr\u003e\n\n# Use Case Diagram\n\n### Use Case diagram contains the role-based functionality of the application mentioned at \u003ca href=\"#user-roles-and-functionality\"\u003eUser Roles And Functionality\u003c/a\u003e, that the user can perform.\n\n\u003cbr\u003e\n\n![UseCasediagram](https://user-images.githubusercontent.com/70724986/178120602-21c748a5-8401-43ab-945d-1b669e184bf5.png)\n\n\u003cbr\u003e\n\n# User Roles and Functionality\n\n## \u003cli\u003e Unauthenticated \u003c/li\u003e\n\nUser without authentication has the folowing functionality:\n\n\u003cli\u003e Register \u003c/li\u003e\n\u003cli\u003e Login \u003c/li\u003e\n\u003cli\u003e Password reset \u003c/li\u003e\n\u003cli\u003e Visit pages with list of topics, videos, tests, without taking the test or seeing specific topic. \u003c/li\u003e\n\n---\n\n## \u003cli\u003e User/Student \u003c/li\u003e\n\nUser with role Student has the following functionality:\n\n\u003cli\u003e Explore/view specific topic from the topic list \u003c/li\u003e\n\u003cli\u003e Take and submit a test from test list.  \u003c/li\u003e \n\u003cli\u003e Display user profile \u003c/li\u003e\n\u003cli\u003e Change user information \u003c/li\u003e\n\u003cli\u003e Change user password \u003c/li\u003e\n\u003cli\u003e Get the list of all taken tests \u003c/li\u003e\n\u003cli\u003e See the test details after submiting or after clicking on a particular test from taken tests list  \u003c/li\u003e\n\u003cli\u003e Logout \u003c/li\u003e\n\n---\n\n## \u003cli\u003e Teacher \u003c/li\u003e\n\nIn addition to the same functionality as the above Student role, a user with the Teacher role also has the following functionality:\n\n\u003cli\u003e Display a list of all registered users \u003c/li\u003e\n\u003cli\u003e Visit a profile of the specific user \u003c/li\u003e\n\u003cli\u003e Get the list of all taken tests of particular user  \u003c/li\u003e\n\u003cli\u003e View the result and details of the particular test of the particular user \u003c/li\u003e\n\u003cli\u003e Manage video, topic and test resources. (Create, Update, Delete) \u003c/li\u003e\n\n---\n\n## \u003cli\u003e Admin \u003c/li\u003e\n\nIn addition to the same functionality as the above Teacher role, a user with the Admin role also has the following functionality:\n\n\u003cli\u003e Create new user \u003c/li\u003e\n\u003cli\u003e Update information of the specific user \u003c/li\u003e\n\u003cli\u003e Delete existing user \u003c/li\u003e\n\u003cli\u003e Manage user roles \u003c/li\u003e\n\n\u003cbr\u003e\n\n# Database Model\n\n![database-model](https://user-images.githubusercontent.com/70724986/178121577-7d4f73de-1b34-4289-8dac-06eff477adfb.png)\n\n\u003cbr\u003e\n\n# Docker\n\nDocker hub: \u003ca href=\"https://hub.docker.com/repository/docker/xmlynek/react-node-elearn-app\"\u003exmlynek/react-node-elearn-app\u003c/a\u003e\n\n## Docker run\n\n`docker run -p 8080:8080 -e DATABASE_URL=mysql://Filip:password@localhost:3306/uwbdb -e NODE_ENV=production xmlynek/react-node-elearn-app`\n\n## Docker compose\n\nrun `docker compose up`\n\n```\nversion: '3.8'\nservices:\n  mysql_db:\n    image: mysql:8.0\n    restart: always\n    volumes:\n      - ./mysql/volume:/var/lib/mysql\n      - ./mysql/dump.sql:/docker-entrypoint-initdb.d/dump.sql\n    ports:\n      - 9906:3306\n    environment:\n      MYSQL_HOST: localhost\n      MYSQL_ROOT_PASSWORD: password\n      MYSQL_USER: Filip\n      MYSQL_PASSWORD: password\n      MYSQL_DATABASE: uwbdb\n    healthcheck:\n      test: \"exit 0\"\n\n  server:\n    image: xmlynek/react-node-elearn-app\n    ports:\n      - 8080:8080\n    environment:\n      - DATABASE_URL=mysql://Filip:password@mysql_db/uwbdb\n      - NODE_ENV=production\n    depends_on:\n      mysql_db:\n        condition: service_healthy\n    restart: always\n```\n\n## Env variables\n\n- PORT\n- NODE_ENV - development/production\n- DATABASE_URL - mysql://USERNAME:PASSWORD@HOST:PORT/DB_NAME\n- JWT_ACCESS_TOKEN_SECRET\n- JWT_ACCESS_TOKEN_EXPIRATION\n- JWT_REFRESH_TOKEN_SECRET\n- JWT_REFRESH_TOKEN_EXPIRATION\n- JWT_PASSWORD_RESET_TOKEN_SECRET\n- JWT_PASSWORD_RESET_TOKEN_EXPIRATION\n- EMAIL_HOST\n- EMAIL_PORT\n- EMAIL_USERNAME\n- EMAIL_PASSWORD\n- EMAIL_SERVICE\n\n# App design \u0026 components\n\nDesign of pages and components can be found in \u003ca href=\"https://github.com/xmlynek/Elearn-web-app/tree/master/client\"\u003eclient README\u003c/a\u003e\n\n# License\n\n\u003ca href=\"https://github.com/xmlynek/Elearn-web-app/blob/master/LICENSE\"\u003eMIT\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxmlynek%2Felearn-web-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxmlynek%2Felearn-web-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxmlynek%2Felearn-web-app/lists"}