* Extended functionalities

* Added different UIs
This commit is contained in:
2026-06-24 21:43:40 +02:00
parent 282f4864c4
commit f15bb7a916
348 changed files with 59057 additions and 498 deletions

View File

@@ -0,0 +1,76 @@
using MealPlan.Api.DTOs.IngredientCatalog;
using MealPlan.Api.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace MealPlan.Api.Controllers;
[ApiController]
[Route("api/ingredient-catalog")]
[Authorize]
public class IngredientCatalogController : ControllerBase
{
private readonly IIngredientCatalogService _catalogService;
public IngredientCatalogController(IIngredientCatalogService catalogService) =>
_catalogService = catalogService;
[HttpGet("categories")]
[ProducesResponseType(typeof(IReadOnlyList<IngredientCategoryDto>), StatusCodes.Status200OK)]
public async Task<IActionResult> GetCategories(CancellationToken ct)
{
var categories = await _catalogService.GetCategoriesAsync(ct);
return Ok(categories);
}
[HttpGet]
[ProducesResponseType(typeof(IReadOnlyList<IngredientNutritionItemDto>), StatusCodes.Status200OK)]
public async Task<IActionResult> GetItems(
[FromQuery] string? category,
[FromQuery] string? search,
CancellationToken ct)
{
var items = await _catalogService.GetItemsAsync(category, search, ct);
return Ok(items);
}
[HttpGet("{id:int}")]
[ProducesResponseType(typeof(IngredientNutritionItemDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> GetItem(int id, CancellationToken ct)
{
var item = await _catalogService.GetItemByIdAsync(id, ct);
return item is null ? NotFound(new { error = $"Ingredient catalog item {id} was not found." }) : Ok(item);
}
[HttpPost]
[ProducesResponseType(typeof(IngredientNutritionItemDto), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> CreateItem([FromBody] UpsertIngredientNutritionItemDto dto, CancellationToken ct)
{
var item = await _catalogService.CreateItemAsync(dto, ct);
return item is null
? BadRequest(new { error = "Invalid category or payload." })
: CreatedAtAction(nameof(GetItem), new { id = item.Id }, item);
}
[HttpPut("{id:int}")]
[ProducesResponseType(typeof(IngredientNutritionItemDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> UpdateItem(int id, [FromBody] UpsertIngredientNutritionItemDto dto, CancellationToken ct)
{
var item = await _catalogService.UpdateItemAsync(id, dto, ct);
return item is null
? NotFound(new { error = $"Ingredient catalog item {id} was not found." })
: Ok(item);
}
[HttpDelete("{id:int}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> DeleteItem(int id, CancellationToken ct)
{
var deleted = await _catalogService.DeleteItemAsync(id, ct);
return deleted ? NoContent() : NotFound(new { error = $"Ingredient catalog item {id} was not found." });
}
}