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.
- Environments
- API Endpoints
- MVC Frontend
- Technologies
- Project Structure
- Getting Started
- Running Tests
- Docker Commands
- License
- Security
| 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 |
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"]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="
}'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}"
}
]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'main.js is a single bundled and minified file that mixes third-party libraries with a custom global App namespace (site logic).
| 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 |
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 |
The key module is App.Test. It binds click handlers on the active question only:
#testclick on.question.active .answer input→animateAfterClick#testclick on.question.active .answer input→countStats
countStats() behavior:
- Reads the value of the clicked radio (
action/process/people/idea) - Reads
data-answer(1or2) anddata-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
| 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 |
- 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)
├── 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
cd StudentsManager.Mvc
dotnet run./run-app.shOr using Docker Compose directly:
docker-compose up./run-down-app.sh./run-tests.shOr manually:
dotnet test StudentsManager.Tests/| 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 |
See LICENSE for details.
See SECURITY.md for security policies.