using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using SkyArtShop.Models; using SkyArtShop.Services; namespace SkyArtShop.Controllers; [Route("admin/homepage")] [Authorize(Roles = "Admin,MasterAdmin")] public class AdminHomepageController : Controller { private readonly PostgreSQLService _pgService; private readonly IWebHostEnvironment _environment; private readonly string _sectionsCollection = "HomepageSections"; private readonly string _settingsCollection = "SiteSettings"; public AdminHomepageController(PostgreSQLService pgService, IWebHostEnvironment environment) { _pgService = pgService; _environment = environment; } [HttpGet("")] public async Task Index() { List sections = (await _pgService.GetAllAsync(_sectionsCollection)).OrderBy((HomepageSection s) => s.DisplayOrder).ToList(); SiteSettings siteSettings = (await _pgService.GetAllAsync(_settingsCollection)).FirstOrDefault() ?? new SiteSettings(); base.ViewBag.Settings = siteSettings; return View(sections); } [HttpGet("section/{id}")] public async Task EditSection(string id) { HomepageSection homepageSection = await _pgService.GetByIdAsync(_sectionsCollection, id); if (homepageSection == null) { base.TempData["ErrorMessage"] = "Section not found."; return RedirectToAction("Index"); } return View(homepageSection); } [HttpPost("section/update")] public async Task UpdateSection(HomepageSection section, IFormFile? imageFile, string? SelectedImageUrl) { base.ModelState.Remove("Content"); base.ModelState.Remove("AdditionalData"); base.ModelState.Remove("SelectedImageUrl"); if (!base.ModelState.IsValid) { foreach (ModelError item in base.ModelState.Values.SelectMany((ModelStateEntry v) => v.Errors)) { Console.WriteLine("ModelState Error: " + item.ErrorMessage); } return View("EditSection", section); } Console.WriteLine("Updating section with ID: " + section.Id); Console.WriteLine("Title: " + section.Title); Console.WriteLine("Subtitle: " + section.Subtitle); Console.WriteLine($"Content length: {section.Content?.Length ?? 0}"); Console.WriteLine($"IsActive: {section.IsActive}"); HomepageSection existingSection = await _pgService.GetByIdAsync(_sectionsCollection, section.Id); if (existingSection == null) { Console.WriteLine("ERROR: Section with ID " + section.Id + " not found!"); base.TempData["ErrorMessage"] = "Section not found."; return RedirectToAction("Index"); } Console.WriteLine("Found existing section: " + existingSection.Title); existingSection.SectionType = section.SectionType; existingSection.Title = section.Title ?? string.Empty; existingSection.Subtitle = section.Subtitle ?? string.Empty; existingSection.Content = section.Content ?? string.Empty; existingSection.ButtonText = section.ButtonText ?? string.Empty; existingSection.ButtonUrl = section.ButtonUrl ?? string.Empty; existingSection.IsActive = section.IsActive; existingSection.UpdatedAt = DateTime.UtcNow; if (existingSection.AdditionalData == null) { existingSection.AdditionalData = new Dictionary(); } if (!string.IsNullOrEmpty(SelectedImageUrl)) { existingSection.ImageUrl = SelectedImageUrl; Console.WriteLine("Image selected from library: " + existingSection.ImageUrl); } else if (imageFile != null && imageFile.Length > 0) { string text = Path.Combine(_environment.WebRootPath, "uploads", "images"); Directory.CreateDirectory(text); string uniqueFileName = $"{Guid.NewGuid()}_{imageFile.FileName}"; string path = Path.Combine(text, uniqueFileName); using (FileStream fileStream = new FileStream(path, FileMode.Create)) { await imageFile.CopyToAsync(fileStream); } existingSection.ImageUrl = "/uploads/images/" + uniqueFileName; Console.WriteLine("New image uploaded: " + existingSection.ImageUrl); } await _pgService.UpdateAsync(_sectionsCollection, existingSection.Id, existingSection); Console.WriteLine("Section updated successfully in database"); base.TempData["SuccessMessage"] = "Section updated successfully!"; return RedirectToAction("Index"); } [HttpGet("section/create")] public IActionResult CreateSection() { return View(); } [HttpPost("section/create")] public async Task CreateSection(HomepageSection section, IFormFile? imageFile, string? SelectedImageUrl) { base.ModelState.Remove("Content"); base.ModelState.Remove("AdditionalData"); if (!base.ModelState.IsValid) { return View(section); } if (!string.IsNullOrEmpty(SelectedImageUrl)) { section.ImageUrl = SelectedImageUrl; Console.WriteLine("Image selected from library: " + section.ImageUrl); } else if (imageFile != null && imageFile.Length > 0) { string text = Path.Combine(_environment.WebRootPath, "uploads", "images"); Directory.CreateDirectory(text); string uniqueFileName = $"{Guid.NewGuid()}_{imageFile.FileName}"; string path = Path.Combine(text, uniqueFileName); using (FileStream fileStream = new FileStream(path, FileMode.Create)) { await imageFile.CopyToAsync(fileStream); } section.ImageUrl = "/uploads/images/" + uniqueFileName; } if (section.AdditionalData == null) { section.AdditionalData = new Dictionary(); } List source = await _pgService.GetAllAsync(_sectionsCollection); section.DisplayOrder = (source.Any() ? (source.Max((HomepageSection s) => s.DisplayOrder) + 1) : 0); section.CreatedAt = DateTime.UtcNow; section.UpdatedAt = DateTime.UtcNow; await _pgService.InsertAsync(_sectionsCollection, section); base.TempData["SuccessMessage"] = "Section created successfully!"; return RedirectToAction("Index"); } [HttpPost("section/delete/{id}")] public async Task DeleteSection(string id) { await _pgService.DeleteAsync(_sectionsCollection, id); base.TempData["SuccessMessage"] = "Section deleted successfully!"; return RedirectToAction("Index"); } [HttpPost("section/reorder")] public async Task ReorderSections([FromBody] List sectionIds) { for (int i = 0; i < sectionIds.Count; i++) { HomepageSection homepageSection = await _pgService.GetByIdAsync(_sectionsCollection, sectionIds[i]); if (homepageSection != null) { homepageSection.DisplayOrder = i; homepageSection.UpdatedAt = DateTime.UtcNow; await _pgService.UpdateAsync(_sectionsCollection, homepageSection.Id, homepageSection); } } return Json(new { success = true }); } [HttpPost("section/toggle/{id}")] public async Task ToggleSection(string id) { HomepageSection section = await _pgService.GetByIdAsync(_sectionsCollection, id); if (section != null) { section.IsActive = !section.IsActive; section.UpdatedAt = DateTime.UtcNow; await _pgService.UpdateAsync(_sectionsCollection, section.Id, section); base.TempData["SuccessMessage"] = "Section " + (section.IsActive ? "activated" : "deactivated") + " successfully!"; } return RedirectToAction("Index"); } [HttpPost("footer/update")] public async Task UpdateFooter(string footerText) { SiteSettings siteSettings = (await _pgService.GetAllAsync(_settingsCollection)).FirstOrDefault(); if (siteSettings == null) { siteSettings = new SiteSettings { FooterText = footerText }; await _pgService.InsertAsync(_settingsCollection, siteSettings); } else { siteSettings.FooterText = footerText; siteSettings.UpdatedAt = DateTime.UtcNow; await _pgService.UpdateAsync(_settingsCollection, siteSettings.Id, siteSettings); } base.TempData["SuccessMessage"] = "Footer updated successfully!"; return RedirectToAction("Index"); } }