diff --git a/src/InternshipSystem.Api/Controllers/AccessController.cs b/src/InternshipSystem.Api/Controllers/AccessController.cs index 69164e3..0109e48 100644 --- a/src/InternshipSystem.Api/Controllers/AccessController.cs +++ b/src/InternshipSystem.Api/Controllers/AccessController.cs @@ -4,7 +4,9 @@ using System.Linq; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; +using FluentValidation; using InternshipSystem.Api.Options; +using InternshipSystem.Api.Queries; using InternshipSystem.Api.Security; using InternshipSystem.Core; using InternshipSystem.Repository; @@ -50,7 +52,7 @@ namespace InternshipSystem.Api.Controllers return BadRequest(); } - var student = await _context.Students.FirstOrDefaultAsync(s => s.Id == id); + var student = await _context.Students.FirstOrDefaultAsync(s => s.Id == id, cancellationToken: cancellationToken); if (student == null) { @@ -104,7 +106,7 @@ namespace InternshipSystem.Api.Controllers return Ok(_tokenService.generateToken(newIdentity)); } - + private Student CreateStudentWithCasData(CasUserData casData) { var id = long.Parse(casData.PersonNumber); diff --git a/src/InternshipSystem.Api/Controllers/StudentController.cs b/src/InternshipSystem.Api/Controllers/StudentController.cs new file mode 100644 index 0000000..165dc6f --- /dev/null +++ b/src/InternshipSystem.Api/Controllers/StudentController.cs @@ -0,0 +1,56 @@ +using System.Threading; +using System.Threading.Tasks; +using InternshipSystem.Api.Queries; +using InternshipSystem.Api.Security; +using InternshipSystem.Core; +using InternshipSystem.Repository; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace InternshipSystem.Api.Controllers +{ + [Route("student")] + [ApiController] + public class StudentController : ControllerBase + { + private readonly InternshipDbContext _context; + + public StudentController(InternshipDbContext context) + { + _context = context; + } + + [HttpGet("current")] + [Authorize] + public async Task GetCurrentStudentData([FromServices] User user, CancellationToken cancellationToken) + { + return await _context.Students.FindAsync(user.PersonNumber); + } + + [HttpPut("updateCurrent")] + [Authorize] + public async Task UpdateStudentData([FromBody] StudentForm studentNewData, [FromServices] User user, CancellationToken cancellationToken) + { + var validator = new StudentForm.Validator(); + var validationResult = await validator.ValidateAsync(studentNewData, cancellationToken); + + if (!validationResult.IsValid || !user.PersonNumber.Equals(studentNewData.Id)) + { + return BadRequest(); + } + + var currentStudent = await _context.Students.FindAsync(user.PersonNumber); + + currentStudent.AlbumNumber = studentNewData.AlbumNumber ?? currentStudent.AlbumNumber; + currentStudent.FirstName = string.IsNullOrEmpty(studentNewData.FirstName) ? currentStudent.FirstName : studentNewData.FirstName; + currentStudent.LastName = string.IsNullOrEmpty(studentNewData.LastName) ? currentStudent.LastName : studentNewData.LastName; + currentStudent.Email = string.IsNullOrEmpty(studentNewData.Email) ? currentStudent.Email : studentNewData.Email; + currentStudent.Course = string.IsNullOrEmpty(studentNewData.Course) ? currentStudent.Course : studentNewData.Course; + currentStudent.Semester = studentNewData.Semester ?? currentStudent.Semester; + + await _context.SaveChangesAsync(cancellationToken); + + return Ok(); + } + } +} \ No newline at end of file diff --git a/src/InternshipSystem.Api/Queries/StudentForm.cs b/src/InternshipSystem.Api/Queries/StudentForm.cs new file mode 100644 index 0000000..d9ab467 --- /dev/null +++ b/src/InternshipSystem.Api/Queries/StudentForm.cs @@ -0,0 +1,24 @@ +using FluentValidation; +using InternshipSystem.Core; + +namespace InternshipSystem.Api.Queries +{ + public class StudentForm + { + public long? Id { get; set; } + public int? AlbumNumber { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string Email { get; set; } + public string Course { get; set; } + public int? Semester { get; set; } + + public class Validator : AbstractValidator + { + public Validator() + { + RuleFor(c => c.Id).NotNull(); + } + } + } +} \ No newline at end of file diff --git a/src/InternshipSystem.Core/Entity/Student.cs b/src/InternshipSystem.Core/Entity/Student.cs index 04b7f1b..2ff5a39 100644 --- a/src/InternshipSystem.Core/Entity/Student.cs +++ b/src/InternshipSystem.Core/Entity/Student.cs @@ -9,6 +9,8 @@ namespace InternshipSystem.Core public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } + public string Course { get; set; } + public int? Semester { get; set; } public static Student CreateStudent(long id, string firstName, string lastName, string email, in int albumNumber) {