From 0e43e1d7c5b0f82be1f59ffca8acd1d0df1ba877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Qu=E1=BB=91c=20B=E1=BA=A3o=20An?= Date: Mon, 27 Jul 2026 00:55:45 -0400 Subject: [PATCH] feat: Completed approving institution request API --- DataAccess/InstitutionRequestDAO.cs | 11 +++++- .../InstitutionRequestController.cs | 39 +++++++------------ LostFound_API/Controllers/PostController.cs | 4 +- ObjectBusiness/StatusRequestInstitution.cs | 2 +- 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/DataAccess/InstitutionRequestDAO.cs b/DataAccess/InstitutionRequestDAO.cs index 64279cc..b735f5b 100644 --- a/DataAccess/InstitutionRequestDAO.cs +++ b/DataAccess/InstitutionRequestDAO.cs @@ -48,8 +48,15 @@ public IQueryable AllInstitutionRequests() #region Get Institution Request By ID public async Task GetInstitutionRequestByID(int requestId) { - var institutionRequest = await db.InstitutionRequests.FirstOrDefaultAsync(r => r.InstitutionRequestId == requestId); - return institutionRequest; + try + { + var institutionRequest = await db.InstitutionRequests.FirstOrDefaultAsync(r => r.InstitutionRequestId == requestId); + return institutionRequest; + } + catch (Exception ex) + { + throw; + } } #endregion diff --git a/LostFound_API/Controllers/InstitutionRequestController.cs b/LostFound_API/Controllers/InstitutionRequestController.cs index f4c05fd..3fda9fe 100644 --- a/LostFound_API/Controllers/InstitutionRequestController.cs +++ b/LostFound_API/Controllers/InstitutionRequestController.cs @@ -4,11 +4,13 @@ using LostFound_API.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json.Linq; using ObjectBusiness; using Repository; using Services; +using SignalRLayer; using System.Security.Claims; using System.Text.Json; using System.Threading.Tasks; @@ -28,6 +30,7 @@ public class InstitutionRequestController : ControllerBase private readonly StateService stateService; private readonly IMemoryCache memoryCache; private readonly IConfiguration configuration; + private readonly IHubContext hubContext; private readonly EmailSender emailSender; private readonly IHttpClientFactory httpClientFactory; #endregion @@ -40,7 +43,8 @@ public InstitutionRequestController(IInstitutionRequestRepository institutionReq IUsersRepository usersRepository, EmailSender emailSender, IMemoryCache memoryCache, - IInstitutionRepository institutionRepository) + IInstitutionRepository institutionRepository, + IHubContext hubContext) { this.institutionRequestRepository = institutionRequestRepository; this.stateService = stateService; @@ -50,6 +54,7 @@ public InstitutionRequestController(IInstitutionRequestRepository institutionReq this.emailSender = emailSender; this.memoryCache = memoryCache; this.institutionRepository = institutionRepository; + this.hubContext = hubContext; } #endregion @@ -208,7 +213,7 @@ Thank you! Your work email has been successfully verified.

Your institution registration request for - {institutionRequest.InstitutionName} + {institutionRequest.InstitutionName}'s {institutionRequest.InstitutionAddress} campus has now been submitted for review.

@@ -272,6 +277,8 @@ public async Task VerifyWebsite(int id) { institutionRequest.IsVerifiedWebsite = true; institutionRequest.WebsiteVerifiedAt = DateTime.Now; + institutionRequest.ReviewedDate = DateTime.Now; + institutionRequest.ReviewedBy = "System Admin"; // Can replace this with the actual admin's name if available later var isUpdated = await institutionRequestRepository.UpdateInstitutionRequest(); if (isUpdated) { @@ -608,7 +615,7 @@ No further action is required at this time. #region Approve Request // PUT api//5 [Authorize(Roles = "SystemAdmin")] - [HttpPut("approve/{id}")] + [HttpPost("approve/{id}")] public async Task ApproveRequest(int id) { // Get the authenticated user's email from the claims @@ -635,6 +642,7 @@ public async Task ApproveRequest(int id) // Update information var institutionRequest = await institutionRequestRepository.GetInstitutionRequestByID(id); institutionRequest.Status = StatusRequestInstitution.Approved; + institutionRequest.IsVerifiedInstitution = true; institutionRequest.UpdatedDate = DateTime.Now; var isUpdated = await institutionRequestRepository.UpdateInstitutionRequest(); @@ -646,23 +654,6 @@ public async Task ApproveRequest(int id) }); } - var institution = new Institution - { - InstitutionName = institutionRequest.InstitutionName, - InstitutionAddress = institutionRequest.InstitutionAddress, - CreatedDate = DateTime.Now, - UpdatedDate = DateTime.Now - }; - - var isAdded = await institutionRepository.CreateInstitution(institution); - if (!isAdded) - { - return BadRequest(new - { - message = "Create institution failed" - }); - } - // Send email notification to the user who made the request var token = Guid.NewGuid().ToString(); memoryCache.Set($"EMAIL_VERIFY_{token}", institutionRequest.WorkEmail, TimeSpan.FromMinutes(15)); @@ -751,7 +742,7 @@ public async Task ApproveRequest(int id)

Congratulations! Your institution - {institutionRequest.InstitutionName} + {institutionRequest.InstitutionName}'s {institutionRequest.InstitutionAddress} campus has been successfully approved by the Back2Me Team.

@@ -801,7 +792,7 @@ Set Your Password return Ok(new { - message = "Update request successfully" + message = "Approve request successfully" }); } #endregion @@ -834,7 +825,7 @@ public async Task RejectRequest(int id, [FromBody] string rejectRe // Update information var institutionRequest = await institutionRequestRepository.GetInstitutionRequestByID(id); - institutionRequest.Status = StatusRequestInstitution.Rejected; + institutionRequest.Status = StatusRequestInstitution.Declined; institutionRequest.RejectReason = rejectReason; institutionRequest.ReviewedBy = userExisted.FirstName + " " + userExisted.LastName; institutionRequest.ReviewedDate = DateTime.Now; @@ -954,7 +945,7 @@ public async Task RejectRequest(int id, [FromBody] string rejectRe

Thank you for your interest in registering - {institution.InstitutionName} + {institution.InstitutionName}'s {institution.InstitutionAddress} campus with Back2Me.

diff --git a/LostFound_API/Controllers/PostController.cs b/LostFound_API/Controllers/PostController.cs index c11e783..e2c62db 100644 --- a/LostFound_API/Controllers/PostController.cs +++ b/LostFound_API/Controllers/PostController.cs @@ -184,7 +184,7 @@ public async Task>> AllLostPostCodes() #region My Posts [Authorize] [HttpGet("my-posts")] - public async Task>> GetAllPostsByUserId() + public async Task>> MyPosts() { var userEmail = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; @@ -214,7 +214,7 @@ public async Task>> GetAllPostsByUserId() } #endregion - #region My Posts + #region User Posts [Authorize(Roles = "SystemAdmin")] [HttpGet("user-posts/{userId}")] public async Task>> GetAllPostsByUserId(int userId) diff --git a/ObjectBusiness/StatusRequestInstitution.cs b/ObjectBusiness/StatusRequestInstitution.cs index 5801415..8c20325 100644 --- a/ObjectBusiness/StatusRequestInstitution.cs +++ b/ObjectBusiness/StatusRequestInstitution.cs @@ -10,6 +10,6 @@ public enum StatusRequestInstitution { Pending, Approved, - Rejected, + Declined, } }