first commit
This commit is contained in:
105
backend/Controllers/KhatmController.cs
Normal file
105
backend/Controllers/KhatmController.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user