using Microsoft.AspNetCore.Mvc; using Meezi.API.Models.Taxes; using Meezi.API.Services; using Meezi.Core.Authorization; using Meezi.Core.Interfaces; using Meezi.Shared; namespace Meezi.API.Controllers; [Route("api/cafes/{cafeId}/taxes")] public class TaxesController : CafeApiControllerBase { private readonly ITaxService _taxService; public TaxesController(ITaxService taxService) => _taxService = taxService; [HttpGet] public async Task GetAll(string cafeId, ITenantContext tenant, CancellationToken cancellationToken) { if (EnsureCafeAccess(cafeId, tenant) is { } denied) return denied; var data = await _taxService.GetAllAsync(cafeId, cancellationToken); return Ok(new ApiResponse>(true, data)); } [HttpPost] public async Task Create( string cafeId, [FromBody] CreateTaxRequest request, ITenantContext tenant, CancellationToken cancellationToken) { if (EnsureCafeAccess(cafeId, tenant) is { } denied) return denied; if (EnsurePermission(tenant, Permission.CreateTax) is { } permDenied) return permDenied; var data = await _taxService.CreateAsync(cafeId, request, cancellationToken); return Ok(new ApiResponse(true, data)); } [HttpPatch("{id}")] public async Task Update( string cafeId, string id, [FromBody] UpdateTaxRequest request, ITenantContext tenant, CancellationToken cancellationToken) { if (EnsureCafeAccess(cafeId, tenant) is { } denied) return denied; if (EnsurePermission(tenant, Permission.EditTax) is { } permDenied) return permDenied; var data = await _taxService.UpdateAsync(cafeId, id, request, cancellationToken); if (data is null) return NotFoundError(); return Ok(new ApiResponse(true, data)); } [HttpDelete("{id}")] public async Task Delete( string cafeId, string id, ITenantContext tenant, CancellationToken cancellationToken) { if (EnsureCafeAccess(cafeId, tenant) is { } denied) return denied; if (EnsurePermission(tenant, Permission.DeleteTax) is { } permDenied) return permDenied; var deleted = await _taxService.DeleteAsync(cafeId, id, cancellationToken); if (!deleted) return NotFoundError(); return Ok(new ApiResponse(true, new { id })); } }