/*
* This file is part of FirmTracker - Server.
*
* FirmTracker - Server is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FirmTracker - Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FirmTracker - Server. If not, see .
*/
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;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Authorization;
namespace FirmTracker_Server.Controllers
{
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class TransactionController : ControllerBase
{
private readonly TransactionCRUD _transactionCRUD;
private readonly ProductCRUD _productCRUD;
public TransactionController()
{
_transactionCRUD = new TransactionCRUD();
_productCRUD = new ProductCRUD();
}
// POST: api/Transaction
///
/// Creates a new transaction.
///
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
public IActionResult CreateTransaction([FromBody] nHibernate.Transactions.Transaction transaction)
{
try
{
foreach (var product in transaction.TransactionProducts)
{
// Validate if the product quantity is positive
if (product.Quantity <= 0)
{
return BadRequest($"Ilość na produktu {product.ProductName} musi być dodatnia.");
}
var productByName = _productCRUD.GetProductByName(product.ProductName);
if (productByName == null)
{
throw new InvalidOperationException($"Produkt o nazwie {product.ProductName} nie istnieje.");
}
product.ProductID = productByName.Id;
product.TransactionId = transaction.Id;
decimal price = productByName.Price;// _productCRUD.GetProductPrice(product.ProductID);
int type = productByName.Type;//_productCRUD.GetProductType(product.ProductID);
if (type == 1)
{
var prod = _productCRUD.GetProduct(product.ProductID);
if (product.Quantity > prod.Availability)
{
throw new InvalidOperationException($"Nie można dodać {prod.Name} do transakcji. Dostępność: {prod.Availability}, Zażądano: {product.Quantity}");
//return BadRequest($"Can't add product {product.ProductID} to transaction. Available: {availability}, Desired: {product.Quantity}");
}
}
}
_transactionCRUD.AddTransaction(transaction);
foreach (var product in transaction.TransactionProducts)
{
product.TransactionId = transaction.Id;
_transactionCRUD.UpdateTransactionProduct(product);
}
// session.Flush();
return CreatedAtAction(nameof(GetTransaction), new { id = transaction.Id }, transaction);
}
catch (InvalidOperationException ioe)
{
return BadRequest(ioe.Message);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
// GET: api/Transaction/5
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
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)]
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
public IActionResult UpdateTransaction(int id, [FromBody] nHibernate.Transactions.Transaction transaction)
{
if (id != transaction.Id)
return BadRequest("ID transakcji nie zgadza się.");
try
{
foreach (var product in transaction.TransactionProducts)
{
// Validate if the product quantity is positive
if (product.Quantity <= 0)
{
return BadRequest($"Sprzedawana ilość produktu {product.ProductName} musi być ilością dodatnią.");
}
var productByName = _productCRUD.GetProductByName(product.ProductName);
if (productByName == null)
{
throw new InvalidOperationException($"Produkt o nazwie {product.ProductName} nie istnieje.");
}
product.ProductID = productByName.Id;
product.TransactionId = transaction.Id;
decimal price = productByName.Price;// _productCRUD.GetProductPrice(product.ProductID);
int type = productByName.Type;//_productCRUD.GetProductType(product.ProductID);
}
_transactionCRUD.UpdateTransaction(transaction);
foreach (var product in transaction.TransactionProducts)
{
product.TransactionId = transaction.Id;
_transactionCRUD.UpdateTransactionProduct(product);
}
return NoContent();
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
// DELETE: api/Transaction/5
[HttpDelete("{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
public IActionResult DeleteTransaction(int id)
{
try
{
_transactionCRUD.DeleteTransaction(id);
return NoContent();
}
catch (InvalidOperationException ioe)
{
return BadRequest($"{ioe.Message}");
}
catch (Exception ex)
{
return NotFound(ex.Message);
}
}
// GET: api/Transaction
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
public IActionResult GetAllTransactions()
{
var transactions = _transactionCRUD.GetAllTransactions();
if (transactions == null)
return NotFound();
var options = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.Preserve
};
// var json = JsonSerializer.Serialize(transactions, options);
return Ok(transactions);
}
// DELETE: api/Transaction/5/product/10
[HttpDelete("{transactionId}/product/{productId}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
public IActionResult DeleteTransactionProduct(int transactionId, int productId)
{
try
{
_transactionCRUD.DeleteTransactionProduct(transactionId, productId);
return NoContent(); // Successfully removed the product
}
catch (InvalidOperationException ioe)
{
return BadRequest(ioe.Message); // If the transaction or product isn't found
}
catch (Exception ex)
{
return NotFound(ex.Message); // Other general errors
}
}
}
}