FirmTracker-Server/Controllers/TransactionController.cs

172 lines
6.5 KiB
C#

using Microsoft.AspNetCore.Mvc;
using FirmTracker_Server.nHibernate.Transactions;
using System;
using System.Text.Json.Serialization;
using System.Text.Json;
using System.Transactions;
using FirmTracker_Server.nHibernate.Products;
using FirmTracker_Server.nHibernate;
namespace FirmTracker_Server.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class TransactionController : ControllerBase
{
private readonly TransactionCRUD _transactionCRUD;
private readonly ProductCRUD _productCRUD;
public TransactionController()
{
_transactionCRUD = new TransactionCRUD();
_productCRUD = new ProductCRUD();
}
// POST: api/Transaction
/// <summary>
/// Creates a new transaction.
/// </summary>
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public IActionResult CreateTransaction([FromBody] nHibernate.Transactions.Transaction transaction)
{
try
{
// Before adding the transaction, ensure each product is linked properly
foreach (var product in transaction.TransactionProducts)
{
product.TransactionId = transaction.Id; // This might be 0 at this point if transaction isn't saved yet
decimal price = _productCRUD.GetProductPrice(product.ProductID);
int type = _productCRUD.GetProductType(product.ProductID);
if (type == 1)
{
int availability = _productCRUD.GetProductAvailability(product.ProductID);
if (product.Quantity > availability)
{
return BadRequest($"Can't add product {product.ProductID} to transaction. Available: {availability}, Desired: {product.Quantity}");
}
else
{
transaction.TotalPrice += ((product.Quantity * price) * ((1 - (transaction.Discount / 100))));
}
}
else
{
transaction.TotalPrice += (price * ((1 - (transaction.Discount / 100))));
}
}
_transactionCRUD.AddTransaction(transaction);
// Now that the transaction is saved, update each product with the correct TransactionId
foreach (var product in transaction.TransactionProducts)
{
product.TransactionId = transaction.Id; // Now transaction.Id is a valid ID after saving
_transactionCRUD.UpdateTransactionProduct(product);
}
// session.Flush(); // Ensure changes are committed if managing session manually
return CreatedAtAction(nameof(GetTransaction), new { id = transaction.Id }, transaction);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
// GET: api/Transaction/5
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult GetTransaction(int id)
{
var transaction = _transactionCRUD.GetTransaction(id);
if (transaction == null)
return NotFound();
return Ok(transaction);
}
// PUT: api/Transaction/5
[HttpPut("{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public IActionResult UpdateTransaction(int id, [FromBody] nHibernate.Transactions.Transaction transaction)
{
if (id != transaction.Id)
return BadRequest("Transaction ID mismatch");
try
{
// Before adding the transaction, ensure each product is linked properly
foreach (var product in transaction.TransactionProducts)
{
product.TransactionId = transaction.Id; // This might be 0 at this point if transaction isn't saved yet
decimal price = _productCRUD.GetProductPrice(product.ProductID);
transaction.TotalPrice += ((product.Quantity * price) * ((1 - (transaction.Discount / 100))));
}
_transactionCRUD.UpdateTransaction(transaction);
// Now that the transaction is saved, update each product with the correct TransactionId
foreach (var product in transaction.TransactionProducts)
{
product.TransactionId = transaction.Id; // Now transaction.Id is a valid ID after saving
_transactionCRUD.UpdateTransactionProduct(product);
}
return NoContent();
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
// DELETE: api/Transaction/5
[HttpDelete("{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult DeleteTransaction(int id)
{
try
{
_transactionCRUD.DeleteTransaction(id);
return NoContent();
}
catch (Exception ex)
{
return NotFound(ex.Message);
}
}
// GET: api/Transaction
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult GetAllTransactions()
{
var transactions = _transactionCRUD.GetAllTransactions();
if (transactions == null)
return NotFound();
// Ustawienie opcji serializatora JSON
var options = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.Preserve // Obsługa cykli obiektów
};
// var json = JsonSerializer.Serialize(transactions, options);
// Zwrócenie odpowiedzi z JSON
return Ok(transactions);
}
}
}