ยกเลิกกลุ่ม Endpoint /api/app* (เช่น /api/appdata, /api/appfile)
AtlasX 8 จะยกเลิกกลุ่มทางเข้า /api/app*** ทั้งหมด เพื่อแก้ปัญหาสิทธิ์การเข้าถึงที่หละหลวม โดยเปลี่ยนไปใช้ระบบ เช็คสิทธิ์แบบรวมศูนย์ที่หน้าบ้าน (API Gateway) แทน การปรับนี้เป็นการยกระดับความปลอดภัยตามมาตรฐาน OWASP 2025 เพื่อป้องกันการลักลอบเข้าถึงข้อมูล (A01) และวางรากฐานการออกแบบที่ปลอดภัยตั้งแต่เริ่ม (A06) ช่วยให้ระบบในอนาคตปลอดภัยและตรวจสอบได้แม่นยำขึ้น
จากเดิมที่เราาเขียน /appdata endpoint เดียวรองรับการเรียกจากหน้าบ้าน จะถูกเปลี่ยนเป็นการเขียน endpoint แยกตาม business ของข้อมูลหรือฟังก์ชันนั้นแทน เช่น
public static RouteGroupBuilder MapUserEndpoints(this RouteGroupBuilder group)
{
RouteGroupBuilder builder = group.MapGroup("/users");
builder.MapGet("/{userId}", GetUser);
builder.MapGet("/exists", UserExists);
builder.MapGet("/search", SearchUser);
builder.MapPost("/", CreateUser);
builder.MapPut("/{userId}", UpdateUser);
builder.MapPut("/password", UpdatePassword);
builder.MapPut("/{userId}/password", UpdateUserPassword);
builder.MapDelete("/", DeleteUser);
return group;
}
private static async Task<IResult> CreateUser(
CreateUserDto createUserDto,
[FromServices] AppDataAccess appDataAccess,
[FromServices] ILogger logger,
CancellationToken cancellationToken = default)
{
// TO DO: Implement create user endpoint.
// ...
return Results.Ok(new
{
Success = true
});
}ยกเลิกการรับค่าผ่าน QueryParameter → บังคับใช้ DTO ใน Endpoint
ยกเลิกการใช้ Class กลางตัวเดียวที่รับทุกอย่าง (Query/Form/Body) แบบเหมาเข่ง บังคับสร้าง DTO (Data Transfer Object) แยกตาม Request ของแต่ละ Action โดยเฉพาะ เพื่อป้องกัน Client แอบส่ง Field ที่ไม่ได้ขอ (เช่น IsAdmin, Role) เข้ามา Inject ในระบบ และช่วยให้ Swagger แสดง Schema ที่แม่นยำ 100% ไม่ต้องเดาว่าตัวไหน Required/Optional และยังสามารถใช้ Data Annotations ([Required], [StringLength]) บน DTO ได้โดยตรง ลด Logic การเช็คค่าใน Controller
ตัวอย่าง DTO
public record CreateUserManualDto
{
[Required]
public required IFormFile File { get; set; }
[JsonPropertyName("fileName")]
public string FileName { get; init; } = string.Empty;
#region สิทธิ์การเข้าถึงไฟล์
[JsonPropertyName("adminPermission")]
public bool AdminPermission { get; init; } = false;
[JsonPropertyName("memberPermission")]
public bool MemberPermission { get; init; } = false;
[JsonPropertyName("publicPermission")]
public bool PublicPermission { get; init; } = false;
#endregion
}ตัวอย่างตอนใช้งาน
private static async Task<IResult> AddUserManualAsync(
[FromForm] CreateUserManualDto userManualDto,
UserManualService userManualService,
HistoryService historyService,
HttpContext httpContext,
CancellationToken cancellationToken
)
{
// ...
}ยกเลิกการอัปโหลดไฟล์ผ่าน QueryParameter → ใช้ IFormFile
ยกเลิกการใช้ QueryParameter class ในการรับไฟล์ (File Upload) และข้อมูลผสม (Mixed Content) ทุกกรณี โดยบังคับให้ประกาศ DTO Class ที่ระบุ Properties ชัดเจน และใช้ IFormFile สำหรับการจัดการไฟล์โดยเฉพาะ
❌ แบบเดิม (Deprecated):
[HttpPost("check-shapefile")]
public IActionResult CheckShapeFile()
{
var queryParameter = new QueryParameter(Request);
byte[] uploadedFileContent = queryParameter.FileParameters[0].FileContent;
...
}✅ แบบใหม่ (v8 Standard):
public class UserProfileUploadDto
{
[Required]
public IFormFile Avatar { get; set; } // ระบุชัดเจนว่าเป็นไฟล์
[StringLength(100)]
public string DisplayName { get; set; }
}
[HttpPost("profile-picture")]
public IActionResult UpdateProfile([FromForm] UserProfileUploadDto dto)
{
// ใช้งาน dto.Avatar ได้ทันที พร้อมระบบ Validation อัตโนมัติ
// ...
}แนวทางการอัปเกรด AtlasX 7 สู่ .NET 10 และการรักษาความเข้ากันได้
สำหรับโครงการที่พัฒนาด้วย AtlasX 7 (.NET 8) และต้องการอัปเกรด Runtime เป็น .NET 10 โดยที่ยังจำเป็นต้องใช้งาน QueryParameter และโครงสร้างเดิมอยู่ เพื่อหลีกเลี่ยงการ Refactor โค้ดจำนวนมาก (Breaking Changes) สามารถดำเนินการตามขั้นตอน Maintenance Track ดังนี้
1. Update Target Framework: ปรับแก้ไฟล์โปรเจกต์ (.csproj) หรือ Directory.Build.props โดยเปลี่ยน Target Framework เป็น
<TargetFramework>net10.0</TargetFramework>2. Update AtlasX Engine: อัปเดต Library หลักผ่าน NuGet Package Manager เป็นเวอร์ชันรองรับ Runtime ใหม่
<PackageReference Include="AtlasX.Engine" Version="3.1.0" />