Files
survey-beta/survey-beta/Services/AnalyticsServices.cs
majed adel d2a32d35f4 Feat/Controllers
Added- AnalyticsController ResponsesController SurveyController UserController
2025-02-01 14:06:32 -08:00

130 lines
4.0 KiB
C#

using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using survey_beta.DataBaseContext;
using survey_beta.DTOs.Update;
using survey_beta.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
public class AnalyticsServices
{
private readonly AppDbContext _context;
public AnalyticsServices(AppDbContext context)
{
_context = context;
}
public void UpdateAnalytics(string surveyId)
{
var responses = _context.Responses
.Where(r => r.SurveyId == surveyId)
.Include(r => r.Answers)
.ThenInclude(a => a.Choice)
.ToList();
var analyticsData = CalculateAnalytics(responses);
SaveAnalytics(surveyId, analyticsData);
}
private SurveyStats CalculateAnalytics(List<Response> responses)
{
var answerFrequency = new Dictionary<string, int>();
var questionFrequency = new Dictionary<string, int>();
foreach (var response in responses)
{
foreach (var answer in response.Answers)
{
var choiceText = answer.Choice?.Letter;
if (choiceText != null)
{
if (answerFrequency.ContainsKey(choiceText))
{
answerFrequency[choiceText]++;
}
else
{
answerFrequency[choiceText] = 1;
}
}
if (questionFrequency.ContainsKey(answer.Question?.Text))
{
questionFrequency[answer.Question.Text]++;
}
else
{
questionFrequency[answer.Question.Text] = 1;
}
}
}
return new SurveyStats
{
SurveyId = responses.FirstOrDefault()?.SurveyId,
TotalResponses = responses.Count,
AnswerFrequency = answerFrequency,
QuestionFrequency = questionFrequency
};
}
private void SaveAnalytics(string surveyId, SurveyStats analyticsData)
{
var analytics = new SurveyAnalytics
{
SurveyId = surveyId,
TotalResponses = analyticsData.TotalResponses,
CreatedAt = DateTime.UtcNow,
};
_context.Add(analytics);
_context.SaveChanges();
}
public SurveyStats GetAggregatedSurveyResponses(string surveyId)
{
var responses = _context.Responses
.Where(r => r.SurveyId == surveyId)
.Include(r => r.Answers)
.ThenInclude(a => a.Choice)
.ToList();
return CalculateAnalytics(responses);
}
public IActionResult ExportSurveyDataToCsv(string surveyId)
{
var responses = _context.Responses
.Where(r => r.SurveyId == surveyId)
.Include(r => r.Answers)
.ThenInclude(a => a.Choice)
.ToList();
if (responses == null || responses.Count == 0)
{
return new ObjectResult("No responses found for this survey.")
{
StatusCode = 404
};
}
var csvData = new StringWriter();
var csvHeader = "ResponseId,Question,ChoiceText";
csvData.WriteLine(csvHeader);
foreach (var response in responses)
{
foreach (var answer in response.Answers)
{
var choiceText = answer.Choice?.Letter ?? "No Choice";
var csvLine = $"{response.Id},{answer.Question?.Text},{choiceText}";
csvData.WriteLine(csvLine);
}
}
var fileName = $"{surveyId}_responses.csv";
var fileBytes = System.Text.Encoding.UTF8.GetBytes(csvData.ToString());
return new FileContentResult(fileBytes, "text/csv")
{
FileDownloadName = fileName
};
}
}