using Microsoft.EntityFrameworkCore; using RMuseum.DbContext; using RMuseum.Models.FAQ; using RSecurityBackend.Models.Generic; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace RMuseum.Services.Implementation { /// /// faq service implementation /// public class FAQService : IFAQService { /// /// get categories /// /// /// public async Task> GetCategoriesAsync(bool onlyPublished) { return new RServiceResult ( await _context.FAQCategories.Where(c => c.Published == true || onlyPublished == false).OrderBy(c => c.CatOrder).ToArrayAsync() ); } /// /// get category by id /// /// /// public async Task> GetCategoryByIdAsync(int id) { return new RServiceResult ( await _context.FAQCategories.Where(c => c.Id == id).SingleOrDefaultAsync() ); } /// /// add a new faq category /// /// /// public async Task> AddCategoryAsync(FAQCategory cat) { try { _context.FAQCategories.Add(cat); await _context.SaveChangesAsync(); return new RServiceResult(cat); } catch (Exception exp) { return new RServiceResult(null, exp.ToString()); } } /// /// update an existing faq category /// /// /// public async Task> UpdateCategoryAsync(FAQCategory cat) { try { var dbModel = await _context.FAQCategories.Where(c => c.Id == cat.Id).SingleAsync(); dbModel.Title = cat.Title; dbModel.CatOrder = cat.CatOrder; dbModel.Description = cat.Description; dbModel.Published = cat.Published; _context.Update(dbModel); await _context.SaveChangesAsync(); return new RServiceResult(true); } catch (Exception exp) { return new RServiceResult(false, exp.ToString()); } } /// /// delete a faq category /// /// /// public async Task> DeleteCategoryAsync(int id) { try { var dbModel = await _context.FAQCategories.Where(c => c.Id == id).SingleAsync(); _context.Remove(dbModel); await _context.SaveChangesAsync(); return new RServiceResult(true); } catch (Exception exp) { return new RServiceResult(false, exp.ToString()); } } /// /// get pinned items /// /// public async Task> GetPinnedItemsAsync() { var items = await _context.FAQItems.Include(i => i.Category).Where(c => c.Pinned && c.Published == true).OrderBy(c => c.Category.CatOrder).ThenBy(c => c.PinnedItemOrder).ThenBy(c => c.ItemOrderInCategory).ToArrayAsync(); List result = new List(); FAQCategory cat = null; int catId = -1; foreach (var item in items) { if(item.CategoryId != catId) { if(cat != null) { result.Add(cat); } cat = item.Category; catId = item.CategoryId; cat.Items = new List(); } cat.Items.Add(item); } if (cat != null) { result.Add(cat); } foreach (var resultCat in result) { foreach (var item in resultCat.Items) { item.Category = null; } } return new RServiceResult(result.ToArray()); } /// /// get category items /// /// /// /// public async Task> GetCategoryItemsAsync(int categoryId, bool onlyPublished) { var items = await _context.FAQItems.Where(c => c.CategoryId == categoryId && (c.Published == onlyPublished || c.Published == true)).OrderBy(c => c.ItemOrderInCategory).ToArrayAsync(); return new RServiceResult ( items ); } /// /// get item by id /// /// /// public async Task> GetItemByIdAsync(int id) { return new RServiceResult ( await _context.FAQItems.Where(c => c.Id == id).SingleOrDefaultAsync() ); } /// /// add a new faq item /// /// /// public async Task> AddItemAsync(FAQItem item) { try { _context.FAQItems.Add(item); await _context.SaveChangesAsync(); return new RServiceResult(item); } catch (Exception exp) { return new RServiceResult(null, exp.ToString()); } } /// /// update an existing faq item /// /// /// public async Task> UpdateItemAsync(FAQItem item) { try { var dbModel = await _context.FAQItems.Where(i => i.Id == item.Id).SingleAsync(); dbModel.Question = item.Question; dbModel.AnswerExcerpt = item.AnswerExcerpt; dbModel.FullAnswer = item.FullAnswer; dbModel.Pinned = item.Pinned; dbModel.PinnedItemOrder = item.PinnedItemOrder; dbModel.CategoryId = item.CategoryId; dbModel.ItemOrderInCategory = item.ItemOrderInCategory; dbModel.ContentForSearch = item.ContentForSearch; dbModel.HashTag1 = item.HashTag1; dbModel.HashTag2 = item.HashTag2; dbModel.HashTag3 = item.HashTag3; dbModel.HashTag4 = item.HashTag4; dbModel.Published = item.Published; _context.Update(dbModel); await _context.SaveChangesAsync(); return new RServiceResult(true); } catch (Exception exp) { return new RServiceResult(false, exp.ToString()); } } /// /// delete a faq item /// /// /// public async Task> DeleteItemAsync(int id) { try { var dbModel = await _context.FAQItems.Where(i => i.Id == id).SingleAsync(); _context.Remove(dbModel); await _context.SaveChangesAsync(); return new RServiceResult(true); } catch (Exception exp) { return new RServiceResult(false, exp.ToString()); } } /// /// Database Context /// protected readonly RMuseumDbContext _context; /// /// constructor /// /// public FAQService(RMuseumDbContext context) { _context = context; } } }