using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Meezi.API.Models.Discover; using Meezi.API.Services; using Meezi.Core.Authorization; using Meezi.Core.Enums; using Meezi.Core.Interfaces; using Meezi.Infrastructure.Data; using Meezi.Infrastructure.Discover; using Meezi.Infrastructure.Services.Platform; using Meezi.Shared; using Microsoft.EntityFrameworkCore; namespace Meezi.API.Controllers; [Authorize] [Route("api/cafes/{cafeId}/discover-profile")] public class CafeDiscoverProfileController : CafeApiControllerBase { private readonly AppDbContext _db; public CafeDiscoverProfileController(AppDbContext db) => _db = db; [HttpGet] public async Task Get(string cafeId, ITenantContext tenant, CancellationToken ct) { if (EnsureCafeAccess(cafeId, tenant) is { } denied) return denied; var cafe = await _db.Cafes.AsNoTracking() .FirstOrDefaultAsync(c => c.Id == cafeId, cancellationToken: ct); if (cafe is null) return NotFound(new ApiResponse(false, null, new ApiError("NOT_FOUND", "Cafe not found."))); var profile = CafeDiscoverProfileSerializer.Deserialize(cafe.DiscoverProfileJson); return Ok(new ApiResponse(true, CafeDiscoverProfileMapping.ToDto(profile))); } [HttpPut] public async Task Put( string cafeId, [FromBody] UpsertCafeDiscoverProfileRequest request, ITenantContext tenant, IPlatformCatalogService catalog, CancellationToken ct) { if (EnsureCafeAccess(cafeId, tenant) is { } denied) return denied; if (EnsurePermission(tenant, Permission.ManageDiscoverProfile) is { } permDenied) return permDenied; var planTier = tenant.PlanTier ?? PlanTier.Free; if (!await catalog.IsFeatureEnabledForCafeAsync(cafeId, planTier, "discover_profile", ct)) { return StatusCode( StatusCodes.Status403Forbidden, new ApiResponse( false, null, new ApiError("PLAN_FEATURE_DISABLED", "Discover profile is not included in your plan. Upgrade to enable it."))); } var cafe = await _db.Cafes.FirstOrDefaultAsync(c => c.Id == cafeId, cancellationToken: ct); if (cafe is null) return NotFound(new ApiResponse(false, null, new ApiError("NOT_FOUND", "Cafe not found."))); var profile = CafeDiscoverProfileMapping.FromRequest(request); cafe.DiscoverProfileJson = CafeDiscoverProfileSerializer.Serialize(profile); await _db.SaveChangesAsync(ct); return Ok(new ApiResponse(true, CafeDiscoverProfileMapping.ToDto(profile))); } }