Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions Controllers/DataMigrationController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
using Microsoft.AspNetCore.Mvc;
using ValuationBackend.Data;

namespace ValuationBackend.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class DataMigrationController : ControllerBase
{
private readonly AppDbContext _context;

public DataMigrationController(AppDbContext context)
{
_context = context;
}

/// <summary>
/// Populates foreign keys for LM Rental Evidence records based on existing string references
/// </summary>
[HttpPost("populate-lm-rental-evidence-foreign-keys")]
public async Task<IActionResult> PopulateLMRentalEvidenceForeignKeys()
{
try
{
await PopulateForeignKeysMigration.PopulateLMRentalEvidenceForeignKeys(_context);
return Ok(new { message = "Foreign keys populated successfully for LM Rental Evidence." });
}
catch (Exception ex)
{
return StatusCode(500, new { error = "Failed to populate foreign keys", details = ex.Message });
}
}

/// <summary>
/// Validates foreign key relationships for LM Rental Evidence
/// </summary>
[HttpGet("validate-lm-rental-evidence-foreign-keys")]
public async Task<IActionResult> ValidateLMRentalEvidenceForeignKeys()
{
try
{
await PopulateForeignKeysMigration.ValidateForeignKeyRelationships(_context);
return Ok(new { message = "Foreign key validation completed. Check console output for details." });
}
catch (Exception ex)
{
return StatusCode(500, new { error = "Failed to validate foreign keys", details = ex.Message });
}
}

/// <summary>
/// Runs both population and validation in sequence
/// </summary>
[HttpPost("migrate-lm-rental-evidence")]
public async Task<IActionResult> MigrateLMRentalEvidence()
{
try
{
await PopulateForeignKeysMigration.PopulateLMRentalEvidenceForeignKeys(_context);
await PopulateForeignKeysMigration.ValidateForeignKeyRelationships(_context);
return Ok(new { message = "LM Rental Evidence migration completed successfully." });
}
catch (Exception ex)
{
return StatusCode(500, new { error = "Failed to migrate LM Rental Evidence", details = ex.Message });
}
}
}
}
8 changes: 8 additions & 0 deletions Controllers/LMBuildingRatesController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,13 @@ public async Task<ActionResult<LMBuildingRatesResponseDto>> GetLMBuildingRateByR

return lmBuildingRate;
}

// GET: api/LMBuildingRates/ByMasterFile/5
[HttpGet("ByMasterFile/{masterFileId}")]
public async Task<ActionResult<IEnumerable<LMBuildingRatesResponseDto>>> GetLMBuildingRatesByMasterFileId(int masterFileId)
{
var buildingRates = await _lmBuildingRatesService.GetByMasterFileIdAsync(masterFileId);
return Ok(buildingRates);
}
}
}
8 changes: 8 additions & 0 deletions Controllers/LMPastValuationController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,5 +93,13 @@ public async Task<ActionResult<LMPastValuationResponseDto>> GetLMPastValuationBy

return lmPastValuation;
}

// GET: api/LMPastValuation/ByMasterFile/5
[HttpGet("ByMasterFile/{masterFileId}")]
public async Task<ActionResult<IEnumerable<LMPastValuationResponseDto>>> GetLMPastValuationsByMasterFileId(int masterFileId)
{
var pastValuations = await _lmPastValuationService.GetByMasterFileIdAsync(masterFileId);
return Ok(pastValuations);
}
}
}
24 changes: 24 additions & 0 deletions Controllers/LMRentalEvidenceController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,5 +93,29 @@ public async Task<ActionResult<LMRentalEvidenceResponseDto>> GetLMRentalEvidence

return lmRentalEvidence;
}

// NEW: GET: api/LMRentalEvidence/ByMasterFile/123
[HttpGet("ByMasterFile/{masterFileId}")]
public async Task<ActionResult<IEnumerable<LMRentalEvidenceResponseDto>>> GetByMasterFileId(int masterFileId)
{
var evidences = await _lmRentalEvidenceService.GetByMasterFileIdAsync(masterFileId);
return Ok(evidences);
}

// NEW: GET: api/LMRentalEvidence/ByMasterFileRefNo/MF-2024-001
[HttpGet("ByMasterFileRefNo/{masterFileRefNo}")]
public async Task<ActionResult<IEnumerable<LMRentalEvidenceResponseDto>>> GetByMasterFileRefNo(string masterFileRefNo)
{
var evidences = await _lmRentalEvidenceService.GetByMasterFileRefNoAsync(masterFileRefNo);
return Ok(evidences);
}

// NEW: GET: api/LMRentalEvidence/WithMasterFileData
[HttpGet("WithMasterFileData")]
public async Task<ActionResult<IEnumerable<LMRentalEvidenceResponseDto>>> GetAllWithMasterFileData()
{
var evidences = await _lmRentalEvidenceService.GetAllWithMasterFileDataAsync();
return Ok(evidences);
}
}
}
8 changes: 8 additions & 0 deletions Controllers/LMSalesEvidenceController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,5 +93,13 @@ public async Task<ActionResult<LMSalesEvidenceResponseDto>> GetLMSalesEvidenceBy

return lmSalesEvidence;
}

// GET: api/LMSalesEvidence/ByMasterFile/5
[HttpGet("ByMasterFile/{masterFileId}")]
public async Task<ActionResult<IEnumerable<LMSalesEvidenceResponseDto>>> GetLMSalesEvidencesByMasterFileId(int masterFileId)
{
var salesEvidences = await _lmSalesEvidenceService.GetByMasterFileIdAsync(masterFileId);
return Ok(salesEvidences);
}
}
}
45 changes: 45 additions & 0 deletions Data/AppDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,51 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
.HasOne(r => r.Asset)
.WithMany()
.HasForeignKey(r => r.AssetId);

// NEW: Configure LMRentalEvidence relationships
modelBuilder.Entity<LMRentalEvidence>()
.HasOne(lm => lm.LandMiscellaneousMasterFile)
.WithMany()
.HasForeignKey(lm => lm.LandMiscellaneousMasterFileId)
.OnDelete(DeleteBehavior.SetNull);

// NEW: Add index for performance
modelBuilder.Entity<LMRentalEvidence>()
.HasIndex(lm => lm.LandMiscellaneousMasterFileId)
.HasDatabaseName("IX_LMRentalEvidence_LandMiscellaneousMasterFileId");

// Configure LMBuildingRates relationships
modelBuilder.Entity<LMBuildingRates>()
.HasOne(lm => lm.LandMiscellaneousMasterFile)
.WithMany() // No navigation property on master file side
.HasForeignKey(lm => lm.LandMiscellaneousMasterFileId)
.OnDelete(DeleteBehavior.SetNull);

modelBuilder.Entity<LMBuildingRates>()
.HasIndex(lm => lm.LandMiscellaneousMasterFileId)
.HasDatabaseName("IX_LMBuildingRates_LandMiscellaneousMasterFileId");

// Configure LMPastValuation relationships
modelBuilder.Entity<LMPastValuation>()
.HasOne(lm => lm.LandMiscellaneousMasterFile)
.WithMany() // No navigation property on master file side
.HasForeignKey(lm => lm.LandMiscellaneousMasterFileId)
.OnDelete(DeleteBehavior.SetNull);

modelBuilder.Entity<LMPastValuation>()
.HasIndex(lm => lm.LandMiscellaneousMasterFileId)
.HasDatabaseName("IX_LMPastValuation_LandMiscellaneousMasterFileId");

// Configure LMSalesEvidence relationships
modelBuilder.Entity<LMSalesEvidence>()
.HasOne(lm => lm.LandMiscellaneousMasterFile)
.WithMany() // No navigation property on master file side
.HasForeignKey(lm => lm.LandMiscellaneousMasterFileId)
.OnDelete(DeleteBehavior.SetNull);

modelBuilder.Entity<LMSalesEvidence>()
.HasIndex(lm => lm.LandMiscellaneousMasterFileId)
.HasDatabaseName("IX_LMSalesEvidence_LandMiscellaneousMasterFileId");
}
}
}
Loading