using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using SkyArtShop.Models; using SkyArtShop.Services; namespace SkyArtShop.Controllers { [Route("admin/portfolio")] [Authorize(Roles="Admin")] public class AdminPortfolioController : Controller { private readonly MongoDBService _mongoService; private readonly SlugService _slugService; private readonly string _categoriesCollection = "PortfolioCategories"; private readonly string _projectsCollection = "PortfolioProjects"; public AdminPortfolioController(MongoDBService mongoService, SlugService slugService) { _mongoService = mongoService; _slugService = slugService; } [HttpGet("categories")] public async Task Categories() { var categories = await _mongoService.GetAllAsync(_categoriesCollection); return View(categories.OrderBy(c => c.DisplayOrder).ToList()); } [HttpGet("category/create")] public IActionResult CreateCategory() => View(new PortfolioCategory()); [HttpPost("category/create")] public async Task CreateCategory(PortfolioCategory category) { if (!ModelState.IsValid) { return View(category); } category.CreatedAt = DateTime.UtcNow; category.UpdatedAt = DateTime.UtcNow; category.Slug = _slugService.GenerateSlug(category.Name); await _mongoService.InsertAsync(_categoriesCollection, category); TempData["SuccessMessage"] = "Category created successfully!"; return RedirectToAction("Categories"); } [HttpGet("category/edit/{id}")] public async Task EditCategory(string id) { var category = await _mongoService.GetByIdAsync(_categoriesCollection, id); if (category == null) return NotFound(); return View(category); } [HttpPost("category/edit/{id}")] public async Task EditCategory(string id, PortfolioCategory category) { if (!ModelState.IsValid) { return View(category); } category.Id = id; category.UpdatedAt = DateTime.UtcNow; category.Slug = _slugService.GenerateSlug(category.Name); await _mongoService.UpdateAsync(_categoriesCollection, id, category); TempData["SuccessMessage"] = "Category updated successfully!"; return RedirectToAction("Categories"); } [HttpPost("category/delete/{id}")] public async Task DeleteCategory(string id) { await _mongoService.DeleteAsync(_categoriesCollection, id); TempData["SuccessMessage"] = "Category deleted successfully!"; return RedirectToAction("Categories"); } [HttpGet("projects")] public async Task Projects(string? categoryId) { var projects = await _mongoService.GetAllAsync(_projectsCollection); var categories = await _mongoService.GetAllAsync(_categoriesCollection); if (!string.IsNullOrEmpty(categoryId)) { projects = projects.Where(p => p.CategoryId == categoryId).ToList(); } ViewBag.Categories = categories.Where(c => c.IsActive).ToList(); ViewBag.SelectedCategory = categoryId; return View(projects.OrderBy(p => p.DisplayOrder).ToList()); } [HttpGet("project/create")] public async Task CreateProject() { var categories = await _mongoService.GetAllAsync(_categoriesCollection); ViewBag.Categories = categories.Where(c => c.IsActive).ToList(); return View(new PortfolioProject()); } [HttpPost("project/create")] public async Task CreateProject(PortfolioProject project) { if (!ModelState.IsValid) { var categories = await _mongoService.GetAllAsync(_categoriesCollection); ViewBag.Categories = categories.Where(c => c.IsActive).ToList(); return View(project); } project.CreatedAt = DateTime.UtcNow; project.UpdatedAt = DateTime.UtcNow; await _mongoService.InsertAsync(_projectsCollection, project); TempData["SuccessMessage"] = "Project created successfully!"; return RedirectToAction("Projects"); } [HttpGet("project/edit/{id}")] public async Task EditProject(string id) { var project = await _mongoService.GetByIdAsync(_projectsCollection, id); if (project == null) return NotFound(); var categories = await _mongoService.GetAllAsync(_categoriesCollection); ViewBag.Categories = categories.Where(c => c.IsActive).ToList(); return View(project); } [HttpPost("project/edit/{id}")] public async Task EditProject(string id, PortfolioProject project) { if (!ModelState.IsValid) { var categories = await _mongoService.GetAllAsync(_categoriesCollection); ViewBag.Categories = categories.Where(c => c.IsActive).ToList(); return View(project); } project.Id = id; project.UpdatedAt = DateTime.UtcNow; await _mongoService.UpdateAsync(_projectsCollection, id, project); TempData["SuccessMessage"] = "Project updated successfully!"; return RedirectToAction("Projects"); } [HttpPost("project/delete/{id}")] public async Task DeleteProject(string id) { await _mongoService.DeleteAsync(_projectsCollection, id); TempData["SuccessMessage"] = "Project deleted successfully!"; return RedirectToAction("Projects"); } } }