feat(giving): giving-category service with CRUD + soft-disable

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Chris Chen
2026-05-28 16:29:31 -07:00
parent 8b52572fad
commit 798dfa3fe0
7 changed files with 192 additions and 0 deletions
@@ -0,0 +1,60 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using ROLAC.API.Data;
using ROLAC.API.DTOs.Giving;
using ROLAC.API.Entities;
namespace ROLAC.API.Services;
public class GivingCategoryService : IGivingCategoryService
{
private readonly AppDbContext _db;
public GivingCategoryService(AppDbContext db, IHttpContextAccessor http) => _db = db;
public async Task<List<GivingCategoryDto>> GetAllAsync(bool includeInactive)
{
var query = _db.GivingCategories.AsNoTracking().AsQueryable();
if (!includeInactive) query = query.Where(c => c.IsActive);
return await query
.OrderBy(c => c.SortOrder).ThenBy(c => c.Name_en)
.Select(c => new GivingCategoryDto
{
Id = c.Id, Name_en = c.Name_en, Name_zh = c.Name_zh,
Description_en = c.Description_en, Description_zh = c.Description_zh,
IsActive = c.IsActive, SortOrder = c.SortOrder,
})
.ToListAsync();
}
public async Task<int> CreateAsync(CreateGivingCategoryRequest r)
{
var entity = new GivingCategory
{
Name_en = r.Name_en, Name_zh = r.Name_zh,
Description_en = r.Description_en, Description_zh = r.Description_zh,
SortOrder = r.SortOrder, IsActive = true,
};
_db.GivingCategories.Add(entity);
await _db.SaveChangesAsync();
return entity.Id;
}
public async Task UpdateAsync(int id, UpdateGivingCategoryRequest r)
{
var c = await _db.GivingCategories.FindAsync(id)
?? throw new KeyNotFoundException($"GivingCategory {id} not found.");
c.Name_en = r.Name_en; c.Name_zh = r.Name_zh;
c.Description_en = r.Description_en; c.Description_zh = r.Description_zh;
c.IsActive = r.IsActive; c.SortOrder = r.SortOrder;
await _db.SaveChangesAsync();
}
public async Task DeactivateAsync(int id)
{
var c = await _db.GivingCategories.FindAsync(id)
?? throw new KeyNotFoundException($"GivingCategory {id} not found.");
c.IsActive = false;
await _db.SaveChangesAsync();
}
}