Skip to content
Open
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.dll
42 changes: 42 additions & 0 deletions Vpassbackend/Controllers/ClosureScheduleController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using Microsoft.AspNetCore.Mvc;
using System.Linq;
using System.Threading.Tasks;
using Vpassbackend.Data;
using Vpassbackend.Models;

namespace Vpassbackend.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class ClosureScheduleController : ControllerBase
{
private readonly ApplicationDbContext _context;
public ClosureScheduleController(ApplicationDbContext context) => _context = context;

[HttpPost]
public async Task<IActionResult> AddClosure([FromBody] ClosureSchedule closure)
{
bool exists = _context.ClosureSchedules.Any(c =>
c.ServiceCenterId == closure.ServiceCenterId &&
c.WeekNumber == closure.WeekNumber &&
c.Day == closure.Day);
if (exists) return BadRequest("Duplicate closure entry.");

// Reset the ID to 0 to let Entity Framework generate it
closure.Id = 0;

_context.ClosureSchedules.Add(closure);
await _context.SaveChangesAsync();
return Ok(closure);
}

[HttpGet("{serviceCenterId}")]
public IActionResult GetClosures(int serviceCenterId, [FromQuery] int weekNumber)
{
var closures = _context.ClosureSchedules
.Where(c => c.ServiceCenterId == serviceCenterId && c.WeekNumber == weekNumber)
.ToList();
return Ok(closures);
}
}
}
81 changes: 81 additions & 0 deletions Vpassbackend/Controllers/ServiceController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
using Microsoft.AspNetCore.Mvc;
using System.Linq;
using System.Threading.Tasks;
using Vpassbackend.Data;
using Vpassbackend.Models;

namespace Vpassbackend.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class ServiceController : ControllerBase
{
private readonly ApplicationDbContext _context;
public ServiceController(ApplicationDbContext context) => _context = context;

[HttpGet("{serviceCenterId}")]
public IActionResult GetServices(int serviceCenterId, [FromQuery] int weekNumber)
{
var services = _context.ServiceCenterServices
.Where(s => s.Station_id == serviceCenterId)
.Select(s => new {
s.ServiceId,
s.Service.ServiceName,
IsAvailable = !_context.ServiceAvailabilities.Any(a =>
a.ServiceCenterId == serviceCenterId &&
a.ServiceId == s.ServiceId &&
a.WeekNumber == weekNumber &&
!a.IsAvailable)
Comment on lines +19 to +28

Copilot AI Jul 13, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The LINQ .Any(...) subquery inside .Select may generate one correlated subquery per row. Consider loading availability data in a single query or using a join to reduce database round trips.

Suggested change
var services = _context.ServiceCenterServices
.Where(s => s.Station_id == serviceCenterId)
.Select(s => new {
s.ServiceId,
s.Service.ServiceName,
IsAvailable = !_context.ServiceAvailabilities.Any(a =>
a.ServiceCenterId == serviceCenterId &&
a.ServiceId == s.ServiceId &&
a.WeekNumber == weekNumber &&
!a.IsAvailable)
var unavailableServices = _context.ServiceAvailabilities
.Where(a => a.ServiceCenterId == serviceCenterId &&
a.WeekNumber == weekNumber &&
!a.IsAvailable)
.ToList();
var unavailableServiceIds = new HashSet<int>(unavailableServices.Select(a => a.ServiceId));
var services = _context.ServiceCenterServices
.Where(s => s.Station_id == serviceCenterId)
.Select(s => new {
s.ServiceId,
s.Service.ServiceName,
IsAvailable = !unavailableServiceIds.Contains(s.ServiceId)

Copilot uses AI. Check for mistakes.
}).ToList();
return Ok(services);
}

[HttpPost("SetAvailability")]
Comment thread
kin-lgtm marked this conversation as resolved.
public async Task<IActionResult> SetAvailability([FromBody] ServiceAvailability availability)
{
// Reset the ID to 0 to let Entity Framework generate it
availability.Id = 0;

var existing = _context.ServiceAvailabilities.FirstOrDefault(a =>
a.ServiceCenterId == availability.ServiceCenterId &&
a.ServiceId == availability.ServiceId &&
a.WeekNumber == availability.WeekNumber &&
a.Day == availability.Day);

if (existing != null)
{
existing.IsAvailable = availability.IsAvailable;
}
else
{
_context.ServiceAvailabilities.Add(availability);
}
await _context.SaveChangesAsync();
return Ok();
}

[HttpGet("{serviceCenterId}/available")]
public IActionResult GetAvailableServices(int serviceCenterId, [FromQuery] int weekNumber, [FromQuery] string day)
{
// Check if the service center is closed on this week and day
bool isClosed = _context.ClosureSchedules
.Any(cs => cs.ServiceCenterId == serviceCenterId && cs.WeekNumber == weekNumber && cs.Day == day);

if (isClosed)
return Ok(new List<object>()); // Service center is closed

var availableServices = (from sa in _context.ServiceAvailabilities
join s in _context.Services on sa.ServiceId equals s.ServiceId
where sa.ServiceCenterId == serviceCenterId
&& sa.WeekNumber == weekNumber
&& sa.Day == day
&& sa.IsAvailable
select new {
sa.ServiceId,
ServiceName = s.ServiceName
}).ToList();

return Ok(availableServices);
}
}
}
2 changes: 2 additions & 0 deletions Vpassbackend/Data/ApplicationDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
public DbSet<Vehicle> Vehicles { get; set; }
public DbSet<VehicleServiceHistory> VehicleServiceHistories { get; set; }
public DbSet<EmergencyCallCenter> EmergencyCallCenters { get; set; }
public DbSet<ClosureSchedule> ClosureSchedules { get; set; }
public DbSet<ServiceAvailability> ServiceAvailabilities { get; set; }


protected override void OnModelCreating(ModelBuilder modelBuilder)
Expand Down
Loading