Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions backend/CookifyAPI/CookifyAPI/Controllers/RecipesController.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
using CookifyAPI.Models.DTOs.Recipes;
using System.Security.Claims;
using CookifyAPI.Models.DTOs.Recipes;
using CookifyAPI.Models.DTOs.Requests;
using CookifyAPI.Models.Entities;
using CookifyAPI.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace CookifyAPI.Controllers;

[ApiController]
[Route("api/[controller]")]
public class RecipesController(IRecipeService service) : ControllerBase
public class RecipesController(IRecipeService service) : AuthBaseController
{
// GET: api/recipes
/// <summary>
Expand All @@ -31,6 +35,21 @@ public async Task<ActionResult<RecipeDetailDto>> GetRecipe(int id)

return Ok(recipe);
}

[HttpPost]
[Authorize]
public async Task<IActionResult> CreateRecipe([FromBody] RecipePublishRequest request)
{
try
{
var id = await service.CreateRecipeAsync(CurrentUserId, request);
return Ok(new { id });
}
catch (Exception ex)
{
return BadRequest(new { error = ex.Message });
}
}


// [HttpPost]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
public class RecipeStepDto
{
public int Id { get; set; }
public string Title {get; set;}
public string Title { get; set; } = null!;
public int StepNumber { get; set; }
public string Description { get; set; } = null!;
public string? ImageUrl { get; set; }

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
namespace CookifyAPI.Models.DTOs.Requests;

public record RecipePublishRequest(
string Title,
int CookingTimeMinutes,
int Servings,
float Calories100g,
float Protein100g,
float Fat100g,
float Carb100g,
string Description,
int Difficulty,

string? MainImageBase64,
List<RecipePublishStepRequest> Steps,
List<int> Tags,
List<RecipePublishIngredientRequest> Ingredients
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System.ComponentModel.DataAnnotations;

namespace CookifyAPI.Models.DTOs.Requests;

public record RecipePublishIngredientRequest
(
int Id,
float Amount,
string Unit
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace CookifyAPI.Models.DTOs.Requests;

public record RecipePublishStepRequest
(
string Title,
int StepNumber,
string Description,
string? ImageBase64
);
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,26 @@ public async Task<string> UploadAsync(IFormFile file, string folder, int maxFile

return result.SecureUrl.ToString();
}

public async Task<string?> UploadImageBase64Async(string base64String, string folder)
{
if (string.IsNullOrWhiteSpace(base64String)) return null;

// Cloudinary умеет принимать Data URI (data:image/png;base64,...)
// Если клиент присылает чистый Base64, добавим префикс
var prefix = "data:image/png;base64,";
var imageData = base64String.StartsWith("data:image") ? base64String : prefix + base64String;

var uploadParams = new ImageUploadParams
{
File = new FileDescription(imageData),
Folder = folder,
Transformation = new Transformation().Quality("auto").FetchFormat("auto") // Оптимизация
};

var uploadResult = await _cloudinary.UploadAsync(uploadParams);
return uploadResult.SecureUrl?.ToString();
}
}

public class PayloadTooLargeException : Exception
Expand Down
Loading
Loading