Graduation Project | ASP.NET Core 10 Β· Entity Framework Core Β· SQL Server
InsightHub bridges the gap between computer science graduates and the real job market by combining psychometric assessment with empirical data from employed professionals β replacing abstract career advice with measurable, data-driven recommendations.
- Overview
- Features
- System Architecture
- How It Works
- Algorithm Details
- API Reference
- Data Models
- Career Tracks
- Tech Stack
- Getting Started
- Testing
InsightHub targets unemployed CS graduates and students who struggle to choose a career path. Instead of generic personality tests, the platform:
- Assesses aptitude across 10 tech tracks using 40 Yes/No questions
- Compares the graduate's preferences against real data from employed professionals
- Returns a similarity score showing how well the graduate fits each track's real-world environment
| Feature | Description |
|---|---|
| π§ Career Quiz | 40 Yes/No questions across 10 tech tracks |
| π Market Similarity | Cosine-style slot similarity vs. employed professionals |
| π₯ Professional Persona | Behavioral benchmarks from real employees (teamwork, resilience, etc.) |
| π·οΈ Category Labels | Tracks grouped by industry category (IT, Creative, Engineering, Scientific) |
| π JWT Auth | Secure endpoints with role-aware question delivery |
| β»οΈ Upsert Logic | Re-submissions update existing answers, no duplicates |
βββββββββββββββββββ
β Client App β
β (React/Mobile) β
ββββββββββ¬βββββββββ
β HTTP/JSON
βΌ
βββββββββββββββββββββββββββββββββββββββ
β ASP.NET Core Web API β
β ββββββββββββββββββββββββββββββββ β
β β CareerQuizController β β
β β - GET /questions β β
β β - POST /full-match β β
β ββββββββββββ¬ββββββββββββββββββββ β
β βΌ β
β ββββββββββββββββββββββββββββββββ β
β β CareerQuizService β β
β β - CalculateTopTracks() β β
β β - TrackSimilarity() β β
β β - GetMarketInsights() β β
β ββββββββββββ¬ββββββββββββββββββββ β
β βΌ β
β ββββββββββββββββββββββββββββββββ β
β β Entity Framework Core β β
β ββββββββββββ¬ββββββββββββββββββββ β
βββββββββββββββΌββββββββββββββββββββββββ
βΌ
ββββββββββββββββββββ
β SQL Server β
ββββββββββββββββββββ
Graduate Registers
β
Answers 50 Questions
βββ Q111-120 β Shared Insights (Scale: work preferences & expectations)
βββ Q121-160 β Career Quiz (Yes/No: aptitude per track)
β
Algorithm Processing
βββ Score 10 tracks β Pick Top 3
βββ Calculate Similarity vs. employed professionals (per track)
βββ Aggregate Market Insights (salary, environment, behavioral traits)
β
Results Returned
βββ Top 3 Career Tracks (ranked by aptitude %)
βββ Similarity Score per Track (0-100%)
βββ Market Insights (real averages from employed users)
| ID Range | Type | Audience | Purpose |
|---|---|---|---|
| 101β110 | Scale (1β5) | Employed only | Behavioral assessment |
| 111β120 | Scale / MultiChoice | Both | Shared work preferences |
| 121β160 | Yes/No | Unemployed | Career aptitude per track |
Questions 113, 114, 115 use MultiChoice with explicit options:
| Q# | Question | Options |
|---|---|---|
| 113 | Preferred work environment | Remote Β· Office Β· Hybrid |
| 114 | Preferred company size | Startup Β· Mid-size Β· Corporate |
| 115 | Preferred role style | Technical Β· Managerial Β· Balanced |
For each track (IDs 121β160, 4 questions per track):
Score = count of "Yes" answers (answerValue = 1)
Percentage = (Score / 4) Γ 100
Top 3 = OrderByDescending(Percentage).ThenByDescending(Score).Take(3)
For each of the Top 3 tracks, compares the graduate's answers (Q111β120) against the average answers of employed professionals in that track:
For each question Q in [111-120]:
TrackMean[Q] = avg(employed users in track, answer to Q)
MaxRange[Q] = Q.MaxValue - 1
SlotSimilarity = 1 - min(|Graduate[Q] - TrackMean[Q]| / MaxRange[Q], 1)
FinalSimilarity = mean(SlotSimilarity[Q]) Γ 100
Example:
| Question | Graduate | Track Avg | Slot Similarity |
|---|---|---|---|
| Q116 β Technical Level | 4 | 4.5 | 87.5% |
| Q117 β Soft Skills | 3 | 4.0 | 75.0% |
| Q118 β Salary Satisfaction | 4 | 3.2 | 80.0% |
Returns the question set based on user type.
| Parameter | Type | Description |
|---|---|---|
isEmployed |
bool (query) |
true β Q101β120 Β· false β Q111β160 |
Response:
[
{
"id": 113,
"text": "Preferred work environment.",
"type": "Choice",
"options": [
{ "id": 1, "text": "Remote", "numericValue": 1 },
{ "id": 2, "text": "Office", "numericValue": 2 },
{ "id": 3, "text": "Hybrid", "numericValue": 3 }
]
}
]Submits answers and triggers the full matching pipeline.
Request Body:
{
"answers": [
{ "questionId": 111, "answerValue": 4 },
{ "questionId": 121, "answerValue": 1 },
...
]
}Response:
{
"topTracks": [
{
"track": {
"trackId": 2,
"trackName": "Backend",
"score": 4,
"maxScore": 5,
"percentage": 80.0
},
"trackSimilarityScore": 83.5,
"similarityMessage": "",
"marketInsights": {
"totalEmployeesInTrack": 24,
"avgTechnicalLevel": 4.2,
"avgSoftSkills": 3.8,
"avgSalarySatisfaction": 3.5,
"avgWorkLifeBalance": 3.9,
"mostCommonEnvironment": "Hybrid",
"mostCommonCompanySize": "Mid-size",
"avgYearsExperience": 2.7,
"avgConsistency": 4.1,
"avgAdaptability": 3.9,
"avgTeamwork": 4.3,
"avgProblemSolving": 4.5,
"avgCommunication": 3.8,
"avgResilience": 4.0
}
}
],
"message": "Top track: Backend."
}ApplicationUser // ASP.NET Identity + IsEmployed + TrackId
Question // Id, Text, Type, AppliesTo, MaxValue, TrackId, IsCareerQuiz
SurveyResponse // UserId, QuestionId, AnswerValue
Track // Id, Name, Description, RequiredSkills
CategoryLabel // Id, Name β many-to-many with Track
QuestionOption // QuestionId, Text, NumericValue (for MultiChoice questions)| Enum Value | Usage |
|---|---|
Scale |
Slider 1βN (configurable MaxValue) |
YesNo |
Binary 0 or 1 |
MultiChoice |
Predefined options with NumericValue |
| ID | Track | Category |
|---|---|---|
| 2 | Backend | IT Jobs |
| 3 | Frontend | IT Jobs Β· Creative & Design |
| 4 | Mobile | IT Jobs |
| 5 | Game Dev | IT Jobs Β· Creative & Design |
| 6 | Cybersecurity | IT Jobs |
| 7 | Embedded | IT Jobs Β· Engineering |
| 8 | AI/ML | IT Jobs Β· Scientific & QA |
| 9 | QA/Testing | IT Jobs Β· Scientific & QA |
| 10 | Data Analysis | IT Jobs Β· Scientific & QA |
| Layer | Technology |
|---|---|
| Language | C# (.NET 10) |
| Framework | ASP.NET Core Web API |
| ORM | Entity Framework Core (Code-First) |
| Database | SQL Server |
| Auth | ASP.NET Identity + JWT Bearer |
| Architecture | Controller β Service β Repository pattern |
- .NET 10 SDK
- SQL Server (local or Docker)
# Clone the repo
git clone https://github.com/your-username/InsightHub.git
cd InsightHub
# Configure connection string in appsettings.json
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=InsightHubDb;Trusted_Connection=True;"
}
# Apply migrations
dotnet ef database update
# Run the project (SeedData runs automatically on startup)
dotnet runThe app seeds all tracks, category labels, questions (101β160), and question options automatically on first run.
| Scenario | Input | Expected |
|---|---|---|
| Happy Path | 50 valid answers | 3 tracks with similarity scores |
| Incomplete submission | Missing Q111β120 | 400 Bad Request |
| No market data | No employed users in top track | similarityScore = 0, message = "No market data yet" |
| Duplicate submission | Same user submits twice | Latest values overwrite, no duplicates |
| All "No" answers | answerValue = 0 for all quiz Qs | Track score = 0%, excluded from top 3 |
| Endpoint | Target |
|---|---|
GET /questions |
< 200ms |
POST /full-match |
< 2000ms |
| DB queries per match | β€ 5 |
| Version | Highlights |
|---|---|
| 1.0 | Boolean-flag filtering, lenient validation, static score mapping |
| 2.0 | ID-range filtering (deterministic), strict 50-question contract, payload-driven scoring, 93% error reduction |
Graduation Project β InsightHub Development Team Β· 2025