aboutsummaryrefslogtreecommitdiffstats
path: root/src/Controllers/ProductsController.cs
blob: 9bd7e934f1baf90376b729262fd988f9d8f5c529 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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();
	}
}