using FrameworkDAL.DTO.MenuSet; using FrameworkDAL.Query.MenuSet; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FrameworkDAL.CustomCode.MenuSet { public class MenuSetDAL : IMenuSetDAL { private readonly IQueryExecutor _queryExecutor; public MenuSetDAL(IQueryExecutor queryExecutor) { _queryExecutor = queryExecutor; } public async Task GetMenuSet(int MenuSetId, LoginDTO LoginDTO) { try { var sql = MenuSetQB.GET_MENUSET; var parameters = new { menusetid = MenuSetId, languageid = LoginDTO.LanguageId, partnerproductid = LoginDTO.PartnerProductId }; var menuSetDict = new Dictionary(); var result = await _queryExecutor.QueryMultiMapAsync( LoginDTO, sql, (parent, child) => { if (!menuSetDict.TryGetValue(parent.MenuSetId, out var existingParent)) { existingParent = parent; existingParent.MenuSetDetailArray = new List(); menuSetDict[parent.MenuSetId] = existingParent; } if (child != null && child.MenuSetDetailId != 0) { existingParent.MenuSetDetailArray.Add(child); } return existingParent; }, parameters, splitOn: "MenuSetDetailId" ); var finalResult = menuSetDict.Values.FirstOrDefault(); return JsonConvert.SerializeObject(finalResult); } catch (Exception ex) { throw new Exception($"Failed to retrieve MenuSet data: {ex.Message}", ex); } } public async Task SaveMenuSetDetail(int menuSetId, IEnumerable details, LoginDTO loginDTO) { // Unlike SkillProcessStageMapDAL.Save, an empty incoming list is NOT a no-op — // it means "this set now has zero overrides" (every menu reverts to bundle // defaults), a legitimate admin action — mirrors MenuGroupDAL.SaveMenuGroupDetail. var detailList = details.ToList(); var statements = new List<(string sql, object param)>(); var survivingIds = detailList.Where(d => d.MenuSetDetailId > 0).Select(d => d.MenuSetDetailId).ToList(); statements.Add(survivingIds.Count > 0 ? (MenuSetQB.DELETE_MENUSETDETAIL_NOT_IN, (object)new { MenuSetId = menuSetId, SurvivingIds = survivingIds }) : (MenuSetQB.DELETE_MENUSETDETAIL_BY_SET, (object)new { MenuSetId = menuSetId })); foreach (var detail in detailList) { detail.MenuSetId = menuSetId; statements.Add(detail.MenuSetDetailId > 0 ? (MenuSetQB.UPDATE_MENUSETDETAIL, (object)detail) : (MenuSetQB.INSERT_MENUSETDETAIL, (object)detail)); } await _queryExecutor.ExecuteInTransactionAsync(loginDTO, statements).ConfigureAwait(false); } public async Task SaveMenuSet(MenuSetDTO dto, LoginDTO loginDTO) => await _queryExecutor.ExecuteAsync(loginDTO, MenuSetQB.INSERT_MENUSET, dto).ConfigureAwait(false); public async Task UpdateMenuSet(MenuSetDTO dto, LoginDTO loginDTO) => await _queryExecutor.ExecuteAsync(loginDTO, MenuSetQB.UPDATE_MENUSET, dto).ConfigureAwait(false); public async Task DeleteMenuSet(int menuSetId, LoginDTO loginDTO) => await _queryExecutor.ExecuteAsync(loginDTO, MenuSetQB.DELETE_MENUSET, new { MenuSetId = menuSetId }).ConfigureAwait(false); public async Task GetSelectListMenuSet(CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { try { string sql = MenuSetQB.GetSelectList_MenuSet; var result = await _queryExecutor.QueryAsync(LoginDTO, sql, null!); string json = JsonConvert.SerializeObject(result); return json; } catch (Exception) { throw; } } } }