shoc-backend/Api.SeaHavenIndustries/DTOs/Location_DTO.cs
Alexandre Brandizzi c3865e56ac Sites API: site code uniqueness, soft delete with role check, open work orders, site notes
- 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
2026-09-25 11:19:29 -03:00

149 lines
4.8 KiB
C#

using Data.SeaHavenIndustries;
using SeaHaven.Services.DTOs;
namespace Api.SeaHavenIndustries.DTOs
{
// SH-138: additive site-contact write row (id optional on writes)
public class SiteContactInput_DTO
{
public int? Id { get; set; }
public string? Name { get; set; }
public string? Phone { get; set; }
}
/// <summary>Contacts and notes edited from the work-order Site dialog.</summary>
public class SiteContactInfoInput_DTO
{
public List<SiteContactInput_DTO>? Contacts { get; set; }
public string? Notes { get; set; }
}
public class Location_DTO
{
public string? Title { get; set; }
public string? Name { get; set; }
public string? Address { get; set; }
public string? City { get; set; }
public string? State { get; set; }
public string? ZipCode { get; set; }
public string? Phone { get; set; }
public string? Contact { get; set; }
public string? ContactEmail { get; set; }
public string? Status { get; set; }
public string? AccountId { get; set; }
public string? Notes { get; set; }
public List<SiteContactInput_DTO>? Contacts { get; set; }
public int? GetAccountId() => LocationAccountIdMapping.ParseOptional(AccountId);
// ✅ Map API DTO to Service DTO
public CreateLocationDTO ToServiceCreateDTO()
{
return new CreateLocationDTO
{
LocationName = this.Name ?? "",
Address = this.Address,
City = this.City,
State = this.State,
Zipcode = this.ZipCode
};
}
// Map from Entity to DTO
public static Location_DTO MapToModel(Locations entity)
{
return new Location_DTO
{
Title = entity.Title,
Name = entity.Name,
Address = entity.Address1,
City = entity.City,
State = entity.State,
ZipCode = entity.Zip,
Phone = entity.PhoneNumber,
Contact = null, // Not in database schema
ContactEmail = entity.Email,
Status = entity.Status,
AccountId = entity.AccountId?.ToString()
};
}
// Map from DTO to Entity
public static Locations MapToEntity(Location_DTO dto, Locations? existingEntity = null)
{
var entity = existingEntity ?? new Locations();
entity.Title = dto.Title;
entity.Name = dto.Name;
entity.Address1 = dto.Address;
entity.City = dto.City;
entity.State = dto.State;
entity.Zip = dto.ZipCode;
entity.PhoneNumber = dto.Phone;
// Contact field doesn't exist in database schema - ignored
entity.Email = dto.ContactEmail;
entity.Status = dto.Status;
return entity;
}
}
// DTO for list views
public class LocationListItem_DTO
{
public int Id { get; set; }
public string? Name { get; set; }
public string? Title { get; set; }
// Map from Entity
public static LocationListItem_DTO MapToModel(Locations entity)
{
return new LocationListItem_DTO
{
Id = entity.Id,
Name = entity.Name,
Title = entity.Title
};
}
// ✅ Map from Service DTO (no logic in controller)
public static LocationListItem_DTO FromServiceDTO(LocationDTO serviceDto)
{
return new LocationListItem_DTO
{
Id = serviceDto.Id,
Name = serviceDto.Name ?? serviceDto.Title,
Title = serviceDto.Title ?? serviceDto.Name
};
}
// ✅ Map collection from Service DTOs
public static IEnumerable<LocationListItem_DTO> FromServiceDTOs(IEnumerable<LocationDTO> serviceDtos)
{
return serviceDtos.Select(FromServiceDTO);
}
}
// DTO for location dropdown/simple view
public class LocationViewModel_DTO
{
public int? Id { get; set; }
public string? Name { get; set; }
// ✅ Map from Service DTO
public static LocationViewModel_DTO FromServiceDTO(LocationDTO serviceDto)
{
return new LocationViewModel_DTO
{
Id = serviceDto.Id,
Name = serviceDto.Name ?? serviceDto.Title
};
}
// ✅ Map collection from Service DTOs
public static IEnumerable<LocationViewModel_DTO> FromServiceDTOs(IEnumerable<LocationDTO> serviceDtos)
{
return serviceDtos.Select(FromServiceDTO);
}
}
}