using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using UniVerse.Application.DTOs.Common; using UniVerse.Application.DTOs.Lectures; using UniVerse.Application.Interfaces; using System.Security.Claims; namespace UniVerse.Api.Controllers; [ApiController] [Route("api/v1/lectures")] [Authorize] public class LecturesController : ControllerBase { private readonly ILectureService _lectures; private readonly IReviewService _reviews; public LecturesController(ILectureService lectures, IReviewService reviews) { _lectures = lectures; _reviews = reviews; } private int CurrentUserId => int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier) ?? User.FindFirstValue("sub") ?? "0"); [HttpGet] public async Task GetAll([FromQuery] LectureFilterRequest filter) => Ok(await _lectures.GetAllAsync(filter)); [HttpGet("{id:int}")] public async Task Get(int id) => Ok(await _lectures.GetByIdAsync(id, CurrentUserId)); [Authorize(Roles = "Admin")] [HttpPost] public async Task> Create([FromBody] CreateLectureRequest req) => CreatedAtAction(nameof(Get), new { id = 0 }, await _lectures.CreateAsync(req)); [Authorize(Roles = "Admin,Teacher")] [HttpPut("{id:int}")] public async Task> Update(int id, [FromBody] UpdateLectureRequest req) => Ok(await _lectures.UpdateAsync(id, req)); [Authorize(Roles = "Admin")] [HttpDelete("{id:int}")] public async Task Delete(int id) { await _lectures.DeleteAsync(id); return NoContent(); } [Authorize(Roles = "Student")] [HttpPost("{id:int}/enroll")] public async Task Enroll(int id) { await _lectures.EnrollAsync(id, CurrentUserId); return NoContent(); } [Authorize(Roles = "Student")] [HttpDelete("{id:int}/enroll")] public async Task Unenroll(int id) { await _lectures.UnenrollAsync(id, CurrentUserId); return NoContent(); } [Authorize(Roles = "Admin,Teacher")] [HttpPatch("{id:int}/attendance/{userId:int}")] public async Task Attendance(int id, int userId, [FromBody] bool attended) { await _lectures.MarkAttendanceAsync(id, userId, attended); return NoContent(); } [Authorize(Roles = "Admin,Teacher")] [HttpGet("{id:int}/enrollments")] public async Task Enrollments(int id, [FromQuery] PaginationRequest pagination) => Ok(await _lectures.GetEnrollmentsAsync(id, pagination)); [HttpGet("{id:int}/reviews")] public async Task Reviews(int id, [FromQuery] PaginationRequest pagination) => Ok(await _reviews.GetByLectureAsync(id, pagination)); }