Files
meezi/src/Meezi.API/Controllers/CafeDiscoverProfileController.cs
T

71 lines
2.6 KiB
C#
Raw Normal View History

2026-05-27 21:33:48 +03:30
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Meezi.API.Models.Discover;
using Meezi.API.Services;
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<IActionResult> 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<object>(false, null, new ApiError("NOT_FOUND", "Cafe not found.")));
var profile = CafeDiscoverProfileSerializer.Deserialize(cafe.DiscoverProfileJson);
return Ok(new ApiResponse<CafeDiscoverProfileDto>(true, CafeDiscoverProfileMapping.ToDto(profile)));
}
[HttpPut]
public async Task<IActionResult> Put(
string cafeId,
[FromBody] UpsertCafeDiscoverProfileRequest request,
ITenantContext tenant,
IPlatformCatalogService catalog,
CancellationToken ct)
{
if (EnsureCafeAccess(cafeId, tenant) is { } denied)
return denied;
var planTier = tenant.PlanTier ?? PlanTier.Free;
if (!await catalog.IsFeatureEnabledForCafeAsync(cafeId, planTier, "discover_profile", ct))
{
return StatusCode(
StatusCodes.Status403Forbidden,
new ApiResponse<object>(
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<object>(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<CafeDiscoverProfileDto>(true, CafeDiscoverProfileMapping.ToDto(profile)));
}
}