littleshop/LittleShop/Services/CategoryService.cs
SysAdmin ec955e49d9 Fix: Categories Edit IsActive checkbox now works both ways
Fixed two issues preventing IsActive toggle:
1. Removed hidden field that was sending "false" even when checkbox checked
2. Updated CategoryService to always update IsActive, treating null as false

Checkbox behavior:
- Checked → sends "true" → IsActive = true
- Unchecked → sends nothing (null) → IsActive = false (via ?? operator)

This allows both setting inactive→active and active→inactive.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-03 13:48:56 +01:00

108 lines
3.0 KiB
C#

using Microsoft.EntityFrameworkCore;
using LittleShop.Data;
using LittleShop.Models;
using LittleShop.DTOs;
namespace LittleShop.Services;
public class CategoryService : ICategoryService
{
private readonly LittleShopContext _context;
public CategoryService(LittleShopContext context)
{
_context = context;
}
public async Task<IEnumerable<CategoryDto>> GetAllCategoriesAsync()
{
return await _context.Categories
.Include(c => c.Products)
.Select(c => new CategoryDto
{
Id = c.Id,
Name = c.Name,
Description = c.Description,
CreatedAt = c.CreatedAt,
IsActive = c.IsActive,
ProductCount = c.Products.Count(p => p.IsActive)
})
.ToListAsync();
}
public async Task<CategoryDto?> GetCategoryByIdAsync(Guid id)
{
var category = await _context.Categories
.Include(c => c.Products)
.FirstOrDefaultAsync(c => c.Id == id);
if (category == null) return null;
return new CategoryDto
{
Id = category.Id,
Name = category.Name,
Description = category.Description,
CreatedAt = category.CreatedAt,
IsActive = category.IsActive,
ProductCount = category.Products.Count(p => p.IsActive)
};
}
public async Task<CategoryDto> CreateCategoryAsync(CreateCategoryDto createCategoryDto)
{
var category = new Category
{
Id = Guid.NewGuid(),
Name = createCategoryDto.Name,
Description = createCategoryDto.Description,
CreatedAt = DateTime.UtcNow,
IsActive = true
};
_context.Categories.Add(category);
await _context.SaveChangesAsync();
return new CategoryDto
{
Id = category.Id,
Name = category.Name,
Description = category.Description,
CreatedAt = category.CreatedAt,
IsActive = category.IsActive,
ProductCount = 0
};
}
public async Task<bool> UpdateCategoryAsync(Guid id, UpdateCategoryDto updateCategoryDto)
{
var category = await _context.Categories.FindAsync(id);
if (category == null) return false;
if (!string.IsNullOrEmpty(updateCategoryDto.Name))
{
category.Name = updateCategoryDto.Name;
}
if (updateCategoryDto.Description != null)
{
category.Description = updateCategoryDto.Description;
}
// Always update IsActive - treat null (unchecked) as false
category.IsActive = updateCategoryDto.IsActive ?? false;
await _context.SaveChangesAsync();
return true;
}
public async Task<bool> DeleteCategoryAsync(Guid id)
{
var category = await _context.Categories.FindAsync(id);
if (category == null) return false;
category.IsActive = false;
await _context.SaveChangesAsync();
return true;
}
}