Skip to content

Commit

Permalink
Add application cycle controller (#18)
Browse files Browse the repository at this point in the history
  • Loading branch information
joeseggie committed May 20, 2023
1 parent 83408fa commit 2812e9f
Show file tree
Hide file tree
Showing 5 changed files with 188 additions and 2 deletions.
108 changes: 108 additions & 0 deletions src/dev/HESIMS/HESIMS.Web/Controllers/ApplicationCyclesController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
namespace HESIMS.Web.Controllers;

/// <summary>
/// Application cycles controller.
/// </summary>
[Route("api/application-cycles")]
[ApiController]
public class ApplicationCyclesController : BaseController
{
private readonly IApplicationCycleService applicationCycleService;

/// <summary>
/// Initializes a new instance of the <see cref="ApplicationCyclesController"/> class.
/// </summary>
/// <param name="applicationCycleService">Application cycle service.</param>
public ApplicationCyclesController(IApplicationCycleService applicationCycleService)
{
this.applicationCycleService = applicationCycleService;
}

[HttpGet]
public async Task<IActionResult> GetApplicationCyclesAsync()
{
var applicationCycles = await applicationCycleService.GetApplicationCyclesAsync();
if (applicationCycles != null && applicationCycles.Count() > 0)
{
return Ok(applicationCycles.Select(applicationCycle => new ApplicationCycleViewModel
{
ApplicationCycleId = applicationCycle.Id,
ScholarshipId = applicationCycle.ScholarshipId,
AcademicYear = applicationCycle.AcademicYear
}));
}

return Ok(applicationCycles);
}

[HttpGet("{id}")]
public async Task<IActionResult> GetApplicationCycleByIdAsync(Guid id)
{
var applicationCycle = await applicationCycleService.GetApplicationCycleByIdAsync(id);
if (applicationCycle == null)
{
return NotFound();
}

return Ok(new ApplicationCycleViewModel
{
ApplicationCycleId = applicationCycle.Id,
ScholarshipId = applicationCycle.ScholarshipId,
AcademicYear = applicationCycle.AcademicYear
});
}

[HttpPost]
public async Task<IActionResult> AddApplicationCycleAsync([FromBody] ApplicationCycleViewModel applicationCycle)
{
var validationResult = applicationCycle.Validate();
if (!validationResult.IsValid)
{
return BadRequest(validationResult.ErrorMessage);
}

var scholarshipId = GetValueFromNullableGuid(applicationCycle.ScholarshipId);
var newApplicationCycle = new ApplicationCycle
{
Id = Guid.NewGuid(),
ScholarshipId = scholarshipId,
AcademicYear = applicationCycle.AcademicYear
};

await applicationCycleService.AddApplicationCycleAsync(newApplicationCycle);

return Ok(new ApplicationCycleViewModel
{
ApplicationCycleId = newApplicationCycle.Id,
ScholarshipId = newApplicationCycle.ScholarshipId,
AcademicYear = newApplicationCycle.AcademicYear
});
}

[HttpPut("{id}")]
public async Task<IActionResult> UpdateApplicationCycleAsync(Guid id, [FromBody] ApplicationCycleViewModel applicationCycle)
{
var validationResult = applicationCycle.Validate();
if (!validationResult.IsValid)
{
return BadRequest(validationResult.ErrorMessage);
}

var scholarshipId = GetValueFromNullableGuid(applicationCycle.ScholarshipId);
var updatedApplicationCycle = new ApplicationCycle
{
Id = id,
ScholarshipId = scholarshipId,
AcademicYear = applicationCycle.AcademicYear
};

await applicationCycleService.UpdateApplicationCycleAsync(updatedApplicationCycle);

return Ok(new ApplicationCycleViewModel
{
ApplicationCycleId = updatedApplicationCycle.Id,
ScholarshipId = updatedApplicationCycle.ScholarshipId,
AcademicYear = updatedApplicationCycle.AcademicYear
});
}
}
15 changes: 15 additions & 0 deletions src/dev/HESIMS/HESIMS.Web/Controllers/BaseController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace HESIMS.Web.Controllers;

public class BaseController : Controller
{
protected Guid GetValueFromNullableGuid(Guid? nullableGuid)
{
var guidValue = nullableGuid ?? Guid.Empty;
if (guidValue == Guid.Empty)
{
throw new ArgumentException("Guid value is empty");
}

return guidValue;
}
}
2 changes: 1 addition & 1 deletion src/dev/HESIMS/HESIMS.Web/Controllers/CoursesController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace HESIMS.Web.Controllers;
/// </summary>
[Route("api/courses")]
[ApiController]
public class CoursesController : Controller
public class CoursesController : BaseController
{
private readonly ICourseService courseService;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace HESIMS.Web.Controllers;
/// </summary>
[Route("api/scholarships")]
[ApiController]
public class ScholarshipController : Controller
public class ScholarshipController : BaseController
{
private readonly IScholarshipService scholarshipService;

Expand Down
63 changes: 63 additions & 0 deletions src/dev/HESIMS/HESIMS.Web/ViewModels/ApplicationCycleViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
namespace HESIMS.Web.ViewModels;

/// <summary>
/// Represents the view model for the application cycle.
/// </summary>
public record ApplicationCycleViewModel
{
/// <summary>
/// Application cycle Id.
/// </summary>
public Guid? ApplicationCycleId { get; set; }

/// <summary>
/// Application cycle scholarship Id.
/// </summary>
public Guid? ScholarshipId { get; set; }

/// <summary>
/// Application cycle academic year.
/// </summary>
public string? AcademicYear { get; set; }

/// <summary>
/// Validates the application cycle view model.
/// </summary>
/// <param name="applicationCycleId">Application cycle Id.</param>
/// <param name="scholarshipId">Scholarship Id.</param>
public ValidationResult Validate(Guid? routeId = null, bool validateId = false)
{
var validationResult = new ValidationResult
{
IsValid = true
};

if (string.IsNullOrWhiteSpace(AcademicYear))
{
validationResult.IsValid = false;
validationResult.ErrorMessage = "Academic year is required.";
}

var isEmptyOrDefaultGuidScholarshipId = !ScholarshipId.HasValue && ScholarshipId == Guid.Empty;
if (isEmptyOrDefaultGuidScholarshipId)
{
validationResult.IsValid = false;
validationResult.ErrorMessage = "Scholarship ID is required.";
}

var isEmptyOrDefaultGuidApplicationCycleId = !ApplicationCycleId.HasValue && ApplicationCycleId == Guid.Empty;
if (validateId && isEmptyOrDefaultGuidApplicationCycleId)
{
validationResult.IsValid = false;
validationResult.ErrorMessage = "Application cycle ID is required.";
}

if (validateId && ApplicationCycleId != routeId)
{
validationResult.IsValid = false;
validationResult.ErrorMessage = "Application cycle ID mismatch.";
}

return validationResult;
}
}

0 comments on commit 2812e9f

Please sign in to comment.