Added- AnalyticsController ResponsesController SurveyController UserController
130 lines
4.0 KiB
C#
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
|
|
};
|
|
}
|
|
}
|