using AdminDAL.DTO.OrganizationGroup; using AdminDAL.Query.OrganizationGroup; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using GB5Shared.Validation; using Newtonsoft.Json; namespace AdminDAL.CustomCode.OrganizationGroup { public class OrganizationGroupDAL : IOrganizationGroupDAL { private readonly IQueryExecutor _QueryExecutor; private readonly IValidation _Validation; public OrganizationGroupDAL(IQueryExecutor queryExecutor, IValidation validation) { _QueryExecutor = queryExecutor; _Validation = validation; } public async Task GetSelectListOrganizationGroup(CriteriaDTO criteriaDTO, LoginDTO loginDTO) { try { string sql = OrganizationGroupQB.GetSelectList_OrganizationGroup; var result = await _QueryExecutor.QueryAsync(loginDTO, sql, null!); return JsonConvert.SerializeObject(result); } catch (Exception) { throw; } } public async Task GetOrganizationGroup(int OrganizationGroupId, LoginDTO LoginDTO) { try { var sql = OrganizationGroupQB.GET_ORGANIZATIONGROUP; var parameters = new { organizationgroupid = OrganizationGroupId }; var OrganizationGroupDict = new Dictionary(); var result = await _QueryExecutor.QueryMultiMapAsync( LoginDTO, sql, (parent, child) => { if (!OrganizationGroupDict.TryGetValue(parent.OrganizationGroupId, out var existingParent)) { existingParent = parent; existingParent.OrganizationGroupDetailArray = new List(); OrganizationGroupDict[parent.OrganizationGroupId] = existingParent; } if (child != null && child.OrganizationGroupDetailId != 0) existingParent.OrganizationGroupDetailArray.Add(child); return existingParent; }, parameters, splitOn: "OrganizationGroupDetailId" ); var finalResult = OrganizationGroupDict.Values.FirstOrDefault(); return JsonConvert.SerializeObject(finalResult); } catch (Exception ex) { throw new Exception($"Failed to retrieve OrganizationGroup data: {ex.Message}", ex); } } public async Task DeleteOrganizationGroup(int OrganizationGroupId, LoginDTO LoginDTO) { try { string Sql = OrganizationGroupQB.DELETE_ORGANIZATIONGROUP; var Parameters = new { OrganizationGroupId = OrganizationGroupId }; int result = await _QueryExecutor.ExecuteAsync(LoginDTO, Sql, Parameters); return result > 0 ? SuccessResponse.DeleteSuccessMessage : ErrorResponse.DeleteNotFoundMessage; } catch (Exception ex) { string error = await _Validation.HandleException(ex, ErrorResponse.DeleteErrorMessage); throw new Exception(error); } } public async Task SaveOrganizationGroup(OrganizationGroupDTO OrganizationGroupDTO, LoginDTO LoginDTO) { try { return await _QueryExecutor.ExecuteAsync(LoginDTO, OrganizationGroupQB.SAVE_ORGANIZATIONGROUP, OrganizationGroupDTO); } catch (Exception ex) { string error = await _Validation.HandleException(ex, ErrorResponse.SaveErrorMessage); throw new Exception(error); } } public async Task UpdateOrganizationGroup(OrganizationGroupDTO OrganizationGroupDTO, LoginDTO LoginDTO) { try { return await _QueryExecutor.ExecuteAsync(LoginDTO, OrganizationGroupQB.UPDATE_ORGANIZATIONGROUP, OrganizationGroupDTO); } catch (Exception ex) { string error = await _Validation.HandleException(ex, ErrorResponse.UpdateErrorMessage); throw new Exception(error); } } public async Task SaveOrganizationGroupDetail(OrganizationGroupDetailDTO detail, LoginDTO LoginDTO) { try { await _QueryExecutor.ExecuteAsync(LoginDTO, OrganizationGroupQB.SAVE_ORGANIZATIONGROUP_DETAIL, detail); } catch (Exception ex) { string error = await _Validation.HandleException(ex, ErrorResponse.SaveErrorMessage); throw new Exception(error); } } public async Task DeleteOrganizationGroupDetails(int OrganizationGroupId, LoginDTO LoginDTO) { try { var parameters = new { OrganizationGroupId = OrganizationGroupId }; await _QueryExecutor.ExecuteAsync(LoginDTO, OrganizationGroupQB.DELETE_ORGANIZATIONGROUP_DETAILS, parameters); } catch (Exception ex) { string error = await _Validation.HandleException(ex, ErrorResponse.DeleteErrorMessage); throw new Exception(error); } } public async Task GetOUDetailsFromOuGroup(int OrganizationGroupId, int FirstNumber, int MaxResult, LoginDTO LoginDTO) { try { var parameters = new { OrganizationGroupId = OrganizationGroupId, FirstNumber = FirstNumber, MaxResult = MaxResult }; var result = await _QueryExecutor.QueryAsync(LoginDTO, OrganizationGroupQB.GET_OU_DETAILS_FROM_OUGROUP, parameters); return JsonConvert.SerializeObject(result); } catch (Exception) { throw; } } } }