Skip to content

profjordanov/students-manager

Repository files navigation

StudentsManager

A web application built on .NET, React, MSSQL, Azure, and OpenAI, designed to manage course-related data at the University of Economics – Varna. Students actively use the platform while also developing new functionalities for it.

Docker Compose Build Check Deploy Manager to Azure App Service CodeQL CodeFactor SonarQube Cloud


Table of Contents


Environments

Environment URL Notes
Production https://students-manager.site/ Public production deployment
Development https://students-manager-dev.azurewebsites.net/ Dev backend / API deployment
React (SPA) https://students-manager-spa.azurewebsites.net/ React version of the platform

API Endpoints

1. Forum

GET forum posts

curl --location 'https://students-manager-dev.azurewebsites.net/api/slido?limit=20&skip=0'

POST question

curl --location 'https://students-manager-dev.azurewebsites.net/api/slido/question' \
  --header 'Content-Type: application/json' \
  --data '{
    "question": "api post get"
  }'

POST comment

curl --location 'https://students-manager-dev.azurewebsites.net/api/slido/comment' \
  --header 'Content-Type: application/json' \
  --data '{
    "forumQuestionId": 4,
    "description": "api post comment"
  }'

GET questions

curl --location 'https://students-manager-dev.azurewebsites.net/api/slido/questions?limit=20&skip=0'

Example response:

["api post get", "lower api/slido/question", "because", "why?", "question", ".net 10"]

2. User Profile / Login

POST login

curl --request POST \
  --url https://students-manager-dev.azurewebsites.net/api/login \
  --header 'Content-Type: application/json' \
  --data '{
    "email": "jordan@abv.bg",
    "password": "password"
  }'

Responses:

// 200
{
  "userId": "1eac9820-5e6e-4d10-6e94-08de36f40f78"
}
// 401
{
  "message": "Invalid email or password."
}

GET profile

curl --location 'https://students-manager-dev.azurewebsites.net/api/students/profile/022a6007-f33c-47c3-b811-08de88b121f2'

Example response:

// 200
{
  "id": "022a6007-f33c-47c3-b811-08de88b121f2",
  "fullName": "Dr J",
  "base64EncodePicture": null,
  "facultyNumber": "987987",
  "testQuestions": [
    {
      "testQuestionDescription": "Какъв е правилният синтаксис за препратка към външен скрипт, наречен xxx.js?",
      "questionOptionDescription": "<script src=xxx.js>",
      "wasCorrect": true
    }
  ]
}
// 400
{
  "message": "Invalid user."
}

PUT picture

curl --location --request PUT 'https://students-manager-dev.azurewebsites.net/api/students/picture' \
  --header 'Content-Type: application/json' \
  --data '{
    "FacultyNumber": "123123123",
    "Password": "password",
    "Picture": "data:image/jpeg;base64,/9j/k="
  }'

3. Events

POST event

curl --location 'https://students-manager-dev.azurewebsites.net/api/events' \
  --header 'Content-Type: application/json' \
  --data '{
    "userId": "123123",
    "type": "test",
    "data": "temp"
  }'

GET events by user ID

curl --location 'https://students-manager-dev.azurewebsites.net/api/events/022a6007-f33c-47c3-b811-08de88b121f2'

Example response:

[
  {
    "id": "fddea52a-5702-46c8-86f6-00ed51641660",
    "userId": "022a6007-f33c-47c3-b811-08de88b121f2",
    "datetimeUtc": "2026-03-24T14:33:42.3137213",
    "type": "geolocation-position-drj",
    "data": "{\"latitude\":53.513211150189285,\"longitude\":-80.50332253634296}"
  }
]

4. Chatbot

POST save results

curl --location 'https://students-manager-dev.azurewebsites.net/api/chatbot/save_results' \
  --header 'Content-Type: application/json' \
  --data '{
    "res": "[{\"question\":\"Welcome! Shall we start with some basic JS questions?\",\"answer\":\"Yes\"}]",
    "name": "John Doe",
    "email": "john.doe@example.com"
  }'

GET examination answers

curl --location 'https://students-manager-dev.azurewebsites.net/api/chatbot/examination-answers/522a6007-fkkc-47c3-b811-08de88b121f2'

MVC Frontend (main.js + chatbot)

main.js

main.js is a single bundled and minified file that mixes third-party libraries with a custom global App namespace (site logic).

Third-party libraries embedded in the bundle

Library Version Purpose
jQuery 3.1.1 DOM manipulation
GSAP TweenMax 1.19.x Animations (ScrollToPlugin, CSSPlugin, etc.)
ScrollMagic 2.0.5 Scroll-triggered animations (plus GSAP plugin)
Blazy Lazy-loading images
fullPage.js One-page scrolling sections
Swiper Carousel / slider
Plyr Video / audio player
jQBrowser User-agent detection helper

Custom application logic

The bundle defines a global App object and initializes multiple modules via App.init().

On window load it calls:

Module Description
App.resize() Sets App.viewport_height / App.viewport_width and App.mobile based on UA / width
App.bind() Attaches UI handlers (menu, category tabs, video popup, job popup, chatbot start, etc.)
App.UI.init() Lazy-loading + fullPage initialization
App.Test.init() Course tests behavior
App.Scroll.init() Parallax + header scroll states + scroll-to
App.sliderSwipper.init() Initializes Swiper sliders
App.Animations, App.Login, App.Profile Additional UI modules

Course Tests Page

The key module is App.Test. It binds click handlers on the active question only:

  • #test click on .question.active .answer inputanimateAfterClick
  • #test click on .question.active .answer inputcountStats

countStats() behavior:

  • Reads the value of the clicked radio (action / process / people / idea)
  • Reads data-answer (1 or 2) and data-question (1..40)
  • Resets / recomputes category totals
  • Records the chosen answer for that question

animateAfterClick() behavior:

  • Hides answers for non-active questions initially (setOpacityToAllUnactiveQuestions)
  • After selecting an answer, animates the transition to the next .question (via TweenMax)
  • Uses a guard (#test.animating) to prevent double-clicks during transitions

Chatbot

External dependencies

Library Bundled? Purpose
Lodash (_) Yes Utility functions (_.trim, _.map, _.filter, etc.)
Typed.js Yes Typing animation effect (new Typed(...))
jQuery ($) No Expected to be available globally

🚀 Technologies

  • Backend: ASP.NET Core MVC
  • Frontend: React (SPA), Razor Views
  • Database: Microsoft SQL Server
  • Cloud: Azure App Service
  • AI: OpenAI
  • Containerization: Docker & Docker Compose
  • Testing: xUnit (StudentsManager.Tests)

📁 Project Structure

├── StudentsManager.Mvc/          # Main MVC application
│   ├── Controllers/              # MVC Controllers
│   ├── Domain/                   # Domain models
│   ├── Mappings/                 # Object mappings
│   ├── Migrations/               # Database migrations
│   ├── Persistence/              # Data access layer
│   ├── Services/                 # Business logic services
│   ├── Settings/                 # Configuration settings
│   ├── Views/                    # Razor views
│   └── wwwroot/                  # Static files
├── StudentsManager.Tests/        # Unit tests
└── docker-compose.yml            # Docker orchestration

🛠️ Getting Started

Prerequisites

Running Locally

cd StudentsManager.Mvc
dotnet run

Running with Docker

./run-app.sh

Or using Docker Compose directly:

docker-compose up

Stopping the Application

./run-down-app.sh

🧪 Running Tests

./run-tests.sh

Or manually:

dotnet test StudentsManager.Tests/

🐳 Docker Commands

Script Description
run-app.sh Start the application
run-down-app.sh Stop the application
push-app.sh Push Docker images
run-tests.sh Run test suite

📄 License

See LICENSE for details.

🔒 Security

See SECURITY.md for security policies.

About

A web application built on .NET, React and Azure, designed to manage course-related data at the university. Students actively use the platform while also developing new functionalities for it.

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Contributors