mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 08:23:12 +00:00
- Reject duplicate site codes per client (case-insensitive); site code is immutable once set
- Delete tombstones the site and requires the DeleteSites permission (Admin, Scheduler)
- GET /api/locations/{id}/open-work-orders returns the open count and ids
- PATCH /api/locations/{id}/contact-info saves contacts and notes from the work-order Site dialog
- Add nullable Locations.Notes, used as the site-level POC notes fallback
82 lines
2.7 KiB
C#
82 lines
2.7 KiB
C#
using Data.SeaHavenIndustries;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using SeaHaven.DataServices.Interfaces;
|
|
|
|
namespace SeaHaven.DataServices.Implementation
|
|
{
|
|
public class CommonDataService : ICommonDataService
|
|
{
|
|
private readonly ApplicationDbContext _context;
|
|
|
|
public CommonDataService(ApplicationDbContext context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
public async Task<(IEnumerable<ApplicationUser> Items, int TotalCount)> GetUsersPagedAsync(int page, int pageSize, string search, CancellationToken cancellationToken)
|
|
{
|
|
var query = _context.Users
|
|
.Where(w => (w.FirstName ?? "").ToLower().Contains((search ?? "").ToLower()))
|
|
.OrderByDescending(d => d.Id);
|
|
|
|
var totalCount = await query.CountAsync(cancellationToken);
|
|
|
|
var paginatedUsers = await query
|
|
.Skip((page - 1) * pageSize)
|
|
.Take(pageSize)
|
|
.AsNoTracking()
|
|
.ToListAsync(cancellationToken);
|
|
|
|
return (paginatedUsers, totalCount);
|
|
}
|
|
|
|
public async Task<IEnumerable<string?>> GetRoleNamesAsync(CancellationToken cancellationToken)
|
|
{
|
|
return await _context.Roles
|
|
.AsNoTracking()
|
|
.Select(s => s.Name)
|
|
.ToListAsync(cancellationToken);
|
|
}
|
|
|
|
public async Task<IEnumerable<Locations>> GetSiteNamesAsync(CancellationToken cancellationToken)
|
|
{
|
|
return await _context.Locations
|
|
.AsNoTracking()
|
|
.Where(n => n.IsDeleted != true)
|
|
.Select(n => new Locations
|
|
{
|
|
Id = n.Id,
|
|
Name = n.Name,
|
|
Title = n.Title
|
|
})
|
|
.ToListAsync(cancellationToken);
|
|
}
|
|
|
|
public async Task<IEnumerable<Contacts>> GetContactsAsync(CancellationToken cancellationToken)
|
|
{
|
|
return await _context.Contacts
|
|
.AsNoTracking()
|
|
.Select(n => new Contacts
|
|
{
|
|
Id = n.Id,
|
|
FirstName = n.FirstName,
|
|
LastName = n.LastName,
|
|
Email = n.Email,
|
|
PhoneNumber = n.PhoneNumber
|
|
})
|
|
.ToListAsync(cancellationToken);
|
|
}
|
|
|
|
public async Task<IEnumerable<Category>> GetCategoriesAsync(CancellationToken cancellationToken)
|
|
{
|
|
return await _context.Categories
|
|
.AsNoTracking()
|
|
.Select(s => new Category
|
|
{
|
|
Id = s.Id,
|
|
Name = s.Name
|
|
})
|
|
.ToListAsync(cancellationToken);
|
|
}
|
|
}
|
|
}
|