Files
Ghadir/backend/Controllers/KhatmController.cs
2026-06-03 18:31:41 +03:30

106 lines
2.9 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using backend.Data;
using backend.DTOs;
using backend.Models;
namespace backend.Controllers;
[ApiController]
[Route("api/[controller]")]
public class KhatmController : ControllerBase
{
private readonly AppDbContext _db;
public KhatmController(AppDbContext db)
{
_db = db;
}
[HttpGet("items")]
public async Task<IActionResult> GetItems()
{
var items = await _db.KhatmItems
.OrderBy(k => k.Id)
.Select(k => new KhatmItemDto
{
Id = k.Id,
Title = k.Title,
Url = k.Url,
Points = k.Points
})
.ToListAsync();
return Ok(items);
}
[HttpPost("save")]
public async Task<IActionResult> SaveSelections([FromBody] KhatmSaveRequest request)
{
var user = await _db.Users.FindAsync(request.UserId);
if (user == null)
{
return NotFound(new { message = "کاربر یافت نشد." });
}
foreach (var selection in request.Selections)
{
var existing = await _db.UserKhatmSelections
.FirstOrDefaultAsync(ks => ks.UserId == request.UserId && ks.KhatmItemId == selection.KhatmItemId);
if (existing != null)
{
existing.IsSelected = selection.IsSelected;
existing.LastModified = DateTime.UtcNow;
}
else
{
_db.UserKhatmSelections.Add(new UserKhatmSelection
{
UserId = request.UserId,
KhatmItemId = selection.KhatmItemId,
IsSelected = selection.IsSelected,
LastModified = DateTime.UtcNow
});
}
}
// Recalculate total score
await RecalculateTotalScore(request.UserId);
await _db.SaveChangesAsync();
var totalScore = await _db.UserTotalScores
.Where(ts => ts.UserId == request.UserId)
.Select(ts => ts.TotalPoints)
.FirstOrDefaultAsync();
return Ok(new KhatmSaveResponse
{
Success = true,
TotalScore = totalScore
});
}
private async Task RecalculateTotalScore(int userId)
{
var quizPoints = await _db.UserQuizAttempts
.Where(qa => qa.UserId == userId)
.Select(qa => (int?)qa.TotalQuizPoints)
.FirstOrDefaultAsync() ?? 0;
var khatmPoints = await _db.UserKhatmSelections
.Where(ks => ks.UserId == userId && ks.IsSelected)
.SumAsync(ks => ks.KhatmItem.Points);
int total = quizPoints + khatmPoints;
var totalScore = await _db.UserTotalScores
.FirstOrDefaultAsync(ts => ts.UserId == userId);
if (totalScore != null)
{
totalScore.TotalPoints = total;
}
}
}