aboutsummaryrefslogtreecommitdiffstats
path: root/src/Controllers/ProductsController.cs
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2022-06-01 21:13:43 +0200
committerivarlovlie <git@ivarlovlie.no>2022-06-01 21:13:43 +0200
commit9383a2fb09ffb60cfe63683106945bd688affa59 (patch)
tree65b3f4b48841583e355887db5de5a16e7005fc87 /src/Controllers/ProductsController.cs
downloadvinjesvingenhandel.no-9383a2fb09ffb60cfe63683106945bd688affa59.tar.xz
vinjesvingenhandel.no-9383a2fb09ffb60cfe63683106945bd688affa59.zip
feat: Initial commit after clean slate
Diffstat (limited to 'src/Controllers/ProductsController.cs')
-rw-r--r--src/Controllers/ProductsController.cs121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/Controllers/ProductsController.cs b/src/Controllers/ProductsController.cs
new file mode 100644
index 0000000..9bd7e93
--- /dev/null
+++ b/src/Controllers/ProductsController.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using IOL.Helpers;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Localization;
+using VSH.Data;
+using VSH.Data.Database;
+using VSH.Data.Enums;
+using VSH.Data.Results;
+using VSH.Data.Static;
+using VSH.Utilities;
+
+namespace VSH.Controllers;
+
+[Authorize]
+public class ProductsController : MainControllerBase
+{
+ private readonly MainDbContext _context;
+ private readonly IStringLocalizer<SharedControllerResources> _localizer;
+
+ public ProductsController(
+ MainDbContext context,
+ IStringLocalizer<SharedControllerResources> localizer
+ ) {
+ _context = context;
+ _localizer = localizer;
+ }
+
+ [HttpGet]
+ [AllowAnonymous]
+ public ActionResult GetAllProducts() {
+ return Ok(_context.Products.Include(c => c.Category));
+ }
+
+ [HttpGet("{id}")]
+ [AllowAnonymous]
+ public Product GetProduct(Guid id) {
+ return _context.Products
+ .Include(c => c.Category)
+ .SingleOrDefault(c => c.Id == id);
+ }
+
+ [HttpPost("upload-images")]
+ public ActionResult UploadImages() {
+ if (Request.Form.Files.Count == 0)
+ return BadRequest();
+ var filePaths = new List<FileInfo>();
+ var fileNames = new List<string>();
+ foreach (var file in Request.Form.Files) {
+ var fileName = RandomString.Generate(8, true) + file.FileName.ExtractExtension();
+ var filePath = Path.Combine(AppPaths.ProductImages.HostPath, fileName);
+ using var writeStream = new FileStream(filePath, FileMode.CreateNew);
+ file.CopyTo(writeStream);
+ filePaths.Add(new FileInfo(filePath));
+ fileNames.Add(fileName);
+ }
+
+ foreach (var filePath in filePaths) {
+ ImageFunctions.CreateProductImageCollection(filePath);
+ }
+
+ return Ok(fileNames);
+ }
+
+ [HttpPost("create")]
+ public ActionResult CreateProductAsync(Product payload) {
+ payload.SetBaseValues();
+ var category = _context.Categories.SingleOrDefault(p => p.Id == payload.Category.Id);
+ if (category == default)
+ return BadRequest(new ErrorResult(_localizer["Kunne ikke finne kategorien"]));
+ payload.Category = category;
+ payload.Slug = payload.Name.Slugified();
+ _context.Products.Add(payload);
+ _context.SaveChanges();
+ return Ok();
+ }
+
+
+ [HttpPost("{id}/update")]
+ public ActionResult UpdateProductAsync([FromRoute] Guid id, [FromBody] Product payload) {
+ var product = _context.Products.SingleOrDefault(p => p.Id == id);
+ if (product == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne produktet"]));
+ var category = _context.Categories.AsNoTracking().SingleOrDefault(c => c.Id == payload.Category.Id);
+ if (category == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"]));
+
+ var newImages = payload.Images.Select(c => new ProductImage(c.FileName, c.Order)).ToList();
+
+ product.Images = newImages;
+ product.Category = category;
+ product.Name = payload.Name;
+ product.Slug = product.Name.Slugified();
+ product.Description = payload.Description;
+ product.Price = payload.Price;
+ product.Count = payload.Count;
+ product.PriceSuffix = payload.PriceSuffix;
+ product.ShowOnFrontpage = payload.ShowOnFrontpage;
+ product.Updated = DateTime.UtcNow;
+ _context.SaveChanges();
+
+ return Ok();
+ }
+
+ [HttpDelete("{id}/delete")]
+ public ActionResult DeleteProductAsync(Guid id) {
+ var product = _context.Products.SingleOrDefault(p => p.Id == id);
+ if (product == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne produktet"]));
+
+ product.VisibilityState = ProductVisibility.DELETED;
+ product.Updated = DateTime.UtcNow;
+
+ _context.SaveChanges();
+ return Ok();
+ }
+} \ No newline at end of file