diff --git a/Data/Access/SearchDAO.cs b/Data/Access/SearchDAO.cs index aee86c970..7f8d076ea 100644 --- a/Data/Access/SearchDAO.cs +++ b/Data/Access/SearchDAO.cs @@ -2810,7 +2810,17 @@ WHERE sc.Billable = 1 and sr.StartDate >= '{0:yyyy-MM-dd}' and sr.StartDate < '{ return criteria.List(); } - public IEnumerable GetOwnActiveRootAiPromptbausteineFolders(AiActionType? aiActionType = null) + public void GetOwnActiveRootTree(AiActionType aiActionType, + out IEnumerable folders, + out IEnumerable prompts, + out IEnumerable routines) + { + folders = GetOwnActiveRootAiPromptbausteineFolders(aiActionType); + prompts = GetOwnActiveRootAiPromptbausteinePrompts(aiActionType); + routines = GetOwnActiveRootAiPromptbausteineRoutines(aiActionType); + } + + private IEnumerable GetOwnActiveRootAiPromptbausteineFolders(AiActionType? aiActionType = null) { var emp = UserRightHelper.GetLoggedInEmployee(); var emp_oid = emp.Oid; @@ -2822,7 +2832,7 @@ WHERE sc.Billable = 1 and sr.StartDate >= '{0:yyyy-MM-dd}' and sr.StartDate < '{ return criteria.List(); } - public IEnumerable GetOwnActiveRootAiPromptbausteinePrompts(AiActionType? aiActionType = null) + private IEnumerable GetOwnActiveRootAiPromptbausteinePrompts(AiActionType? aiActionType = null) { var emp = UserRightHelper.GetLoggedInEmployee(); var emp_oid = emp.Oid; @@ -2841,7 +2851,7 @@ WHERE sc.Billable = 1 and sr.StartDate >= '{0:yyyy-MM-dd}' and sr.StartDate < '{ return criteria.List(); } - public IEnumerable GetOwnActiveRootAiPromptbausteineRoutines(AiActionType? aiActionType = null) + private IEnumerable GetOwnActiveRootAiPromptbausteineRoutines(AiActionType? aiActionType = null) { var emp = UserRightHelper.GetLoggedInEmployee(); var emp_oid = emp.Oid; @@ -2860,40 +2870,65 @@ WHERE sc.Billable = 1 and sr.StartDate >= '{0:yyyy-MM-dd}' and sr.StartDate < '{ return criteria.List(); } - public IEnumerable GetPublicActiveRootAiPromptbausteineFolders(AiActionType? aiActionType = null) + public void GetPublicActiveRootTree(AiActionType aiActionType, + out IEnumerable folders, + out IEnumerable prompts, + out IEnumerable routines) + { + folders = GetPublicActiveRootAiPromptbausteineFolders(aiActionType); + prompts = GetPublicActiveRootAiPromptbausteinePrompts(aiActionType); + routines = GetPublicActiveRootAiPromptbausteineRoutines(aiActionType); + } + + private IEnumerable GetPublicActiveRootAiPromptbausteineFolders(AiActionType? aiActionType = null) { var emp = UserRightHelper.GetLoggedInEmployee(); var emp_oid = emp.Oid; var criteria = GetAiPromptbausteineFolderRoot(aiActionType); - //criteria.Add(Restrictions.Eq(nameof(AiPromptbausteinFolder.IsPublic), true)); criteria.Add(Restrictions.Not(Restrictions.Eq(nameof(AiPromptbausteinFolder.CreatorOid), emp_oid))); - var list = criteria.List(); - - var rtn_list = new List(); - - foreach (var candidate in list) - { - findPublicFolderDFS(candidate, rtn_list); - } - - return rtn_list; + return criteria.List(); } - private void findPublicFolderDFS(AiPromptbausteinFolder current, List folders) + private IEnumerable GetPublicActiveRootAiPromptbausteinePrompts(AiActionType? aiActionType = null) { - if (current.IsPublic) + var emp = UserRightHelper.GetLoggedInEmployee(); + var emp_oid = emp.Oid; + + var criteria = CreateCriteriaIsActive(); + + criteria.Add(Restrictions.IsNull(nameof(AiPromptbausteinPrompt.ParentFolderOid))); + + if (aiActionType is AiActionType actionType) { - folders.Add(current); - return; + criteria.Add(Restrictions.Eq(nameof(AiPromptbausteinPrompt.ActionType), actionType)); } - foreach (var subFolder in current.SubFolders) + criteria.Add(Restrictions.Not(Restrictions.Eq(nameof(AiPromptbausteinPrompt.CreatorOid), emp_oid))); + criteria.Add(Restrictions.Eq(nameof(AiPromptbausteinPrompt.IsOwnsoftPrompt), false)); + + return criteria.List(); + } + + private IEnumerable GetPublicActiveRootAiPromptbausteineRoutines(AiActionType? aiActionType = null) + { + var emp = UserRightHelper.GetLoggedInEmployee(); + var emp_oid = emp.Oid; + + var criteria = CreateCriteriaIsActive(); + + criteria.Add(Restrictions.IsNull(nameof(AiPromptbausteinRoutine.ParentFolderOid))); + + if (aiActionType is AiActionType actionType) { - findPublicFolderDFS(subFolder, folders); + criteria.Add(Restrictions.Eq(nameof(AiPromptbausteinRoutine.ActionType), actionType)); } + + criteria.Add(Restrictions.Not(Restrictions.Eq(nameof(AiPromptbausteinRoutine.CreatorOid), emp_oid))); + + return criteria.List(); } private ICriteria GetAiPromptbausteineFolderRoot(AiActionType? aiActionType = null) diff --git a/Service/Plugins/AiPromptbausteineService.cs b/Service/Plugins/AiPromptbausteineService.cs index ce5d944a6..d448ee06e 100644 --- a/Service/Plugins/AiPromptbausteineService.cs +++ b/Service/Plugins/AiPromptbausteineService.cs @@ -11,6 +11,7 @@ using BS.Shared.Core; using BS.Shared.DataContracts.Feature.AI; using BS.Shared.Extensions; using DevExpress.CodeParser.Diagnostics; +using DevExpress.Office.Utils; using System; using System.Collections.Generic; using System.IO; @@ -46,39 +47,21 @@ namespace BeWo.Service.Plugins { var own_bib = PredefinedAiPromptbausteinFolders.CreateOwnBibNode(aiActionType); - var own = DAOFactory.SearchDAO.GetOwnActiveRootAiPromptbausteineFolders(aiActionType); - var own_dcs = MapperFactory.AiPromptbausteinFolder.MapToNewDCs(own); + DAOFactory.SearchDAO.GetOwnActiveRootTree(aiActionType, + out var own_folders, + out var own_prompts, + out var own_routines); - foreach (var dc in own_dcs) - { - initOwnFolder(dc); - dc.ParentFolderOid = own_bib.Oid; - } - - own_bib.SubFolders.AddRange(own_dcs); - - var own_prompts = DAOFactory.SearchDAO.GetOwnActiveRootAiPromptbausteinePrompts(aiActionType); + var own_folders_dcs = MapperFactory.AiPromptbausteinFolder.MapToNewDCs(own_folders); var own_prompts_dcs = MapperFactory.AiPromptbausteinPrompt.MapToNewDCs(own_prompts); - - foreach (var dc in own_prompts_dcs) - { - dc.CanEdit = true; - dc.ParentFolderOid = own_bib.Oid; - } - - own_bib.SubPrompts.AddRange(own_prompts_dcs); - - var own_routines = DAOFactory.SearchDAO.GetOwnActiveRootAiPromptbausteineRoutines(aiActionType); var own_routines_dcs = MapperFactory.AiPromptbausteinRoutine.MapToNewDCs(own_routines); - foreach (var dc in own_routines_dcs) - { - dc.CanEdit = true; - dc.ParentFolderOid = own_bib.Oid; - } - + own_bib.SubFolders.AddRange(own_folders_dcs); + own_bib.SubPrompts.AddRange(own_prompts_dcs); own_bib.SubRoutines.AddRange(own_routines_dcs); + initOwnFolder(own_bib); + return own_bib; } @@ -91,16 +74,19 @@ namespace BeWo.Service.Plugins foreach (var prompt in folder.SubPrompts) { + prompt.ParentFolderOid = folder.Oid; prompt.CanEdit = true; } foreach (var routine in folder.SubRoutines) { + routine.ParentFolderOid = folder.Oid; routine.CanEdit = true; } foreach (var next_folder in folder.SubFolders) { + next_folder.ParentFolderOid = folder.Oid; initOwnFolder(next_folder); } } @@ -111,10 +97,33 @@ namespace BeWo.Service.Plugins var public_bib = PredefinedAiPromptbausteinFolders.CreatePublicBibNode(aiActionType); - var pub = DAOFactory.SearchDAO.GetPublicActiveRootAiPromptbausteineFolders(aiActionType); - var pub_dcs = MapperFactory.AiPromptbausteinFolder.MapToNewDCs(pub); + // Hol alles + DAOFactory.SearchDAO.GetPublicActiveRootTree(aiActionType, + out var public_folders, + out var public_prompts, + out var public_routines); - foreach (var dc in pub_dcs) + var dummy_node = new AiPromptbausteinFolder() + { + SubFolders = public_folders.ToList(), + SubPrompts = public_prompts.ToList(), + SubRoutines = public_routines.ToList(), + ActionType = aiActionType + }; + + var public_folders2 = new List(); + var public_prompts2 = new List(); + var public_routines2 = new List(); + + // Finde public Knoten + findPublicItemsDFS(new List { dummy_node }, ref public_folders2, ref public_prompts2, ref public_routines2); + + var public_folders_dcs = MapperFactory.AiPromptbausteinFolder.MapToNewDCs(public_folders); + var public_prompts_dcs = MapperFactory.AiPromptbausteinPrompt.MapToNewDCs(public_prompts); + var public_routines_dcs = MapperFactory.AiPromptbausteinRoutine.MapToNewDCs(public_routines); + + // Erstelle Baum + foreach (var dc in public_folders_dcs) { var creator = dc.Creator; var creator_oid = creator.EmployeeOid; @@ -128,18 +137,117 @@ namespace BeWo.Service.Plugins { folder = PredefinedAiPromptbausteinFolders.CreatePublicSharedBibNode(aiActionType, creator.GetLastNameFirstName()); public_bib.SubFolders.Add(folder); - folder.ParentFolderOid = public_bib.Oid; temp.Add(creator_oid, folder); } folder.SubFolders.Add(dc); - dc.ParentFolderOid = folder.Oid; } - //public_bib.SubFolders.AddRange(pub_dcs); + foreach (var dc in public_prompts_dcs) + { + var creator = dc.Creator; + var creator_oid = creator.EmployeeOid; + + AiPromptbausteinFolderDC folder; + if (temp.ContainsKey(creator_oid)) + { + folder = temp[creator_oid]; + } + else + { + folder = PredefinedAiPromptbausteinFolders.CreatePublicSharedBibNode(aiActionType, creator.GetLastNameFirstName()); + public_bib.SubFolders.Add(folder); + temp.Add(creator_oid, folder); + } + + folder.SubPrompts.Add(dc); + } + + foreach (var dc in public_routines_dcs) + { + var creator = dc.Creator; + var creator_oid = creator.EmployeeOid; + + AiPromptbausteinFolderDC folder; + if (temp.ContainsKey(creator_oid)) + { + folder = temp[creator_oid]; + } + else + { + folder = PredefinedAiPromptbausteinFolders.CreatePublicSharedBibNode(aiActionType, creator.GetLastNameFirstName()); + public_bib.SubFolders.Add(folder); + temp.Add(creator_oid, folder); + } + + folder.SubRoutines.Add(dc); + } + + initPublicFolder(public_bib); return public_bib; } + + private void initPublicFolder(AiPromptbausteinFolderDC folder) + { + foreach (var prompt in folder.SubPrompts) + { + prompt.ParentFolderOid = folder.Oid; + } + + foreach (var routine in folder.SubRoutines) + { + routine.ParentFolderOid = folder.Oid; + } + + foreach (var next_folder in folder.SubFolders) + { + next_folder.ParentFolderOid = folder.Oid; + initPublicFolder(next_folder); + } + } + private void findPublicItemsDFS(IEnumerable folders, + ref List public_folders, + ref List public_prompts, + ref List public_routines) + { + if (public_folders is null) + public_folders = new List(); + + if (public_prompts is null) + public_prompts = new List(); + + if (public_routines is null) + public_routines = new List(); + + foreach (var i_folder in folders) + { + if (i_folder.IsPublic) + { + public_folders.Add(i_folder); + } + else + { + foreach (var i_prompt in i_folder.SubPrompts) + { + if (i_prompt.IsPublic) + public_prompts.Add(i_prompt); + } + + foreach (var i_routine in i_folder.SubRoutines) + { + if (i_routine.IsPublic) + public_routines.Add(i_routine); + } + + findPublicItemsDFS(i_folder.SubFolders, + ref public_folders, + ref public_prompts, + ref public_routines); + } + } + } + private AiPromptbausteinFolderDC getOwnsoftFolder(AiActionType aiActionType) { var prompts = syncOwnSoftPrompts(aiActionType); diff --git a/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderDC.cs b/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderDC.cs index 20be038b9..9fd31b498 100644 --- a/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderDC.cs +++ b/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderDC.cs @@ -97,6 +97,7 @@ namespace BS.Shared.DataContracts.Feature.AI ParentFolderOid = null, SubFolders = new List(), SubPrompts = new List(), + SubRoutines = new List(), Title = AiPromptbausteineTexts.PublicBibNodeTitle, Version = 1, IsExpanded = true @@ -113,6 +114,7 @@ namespace BS.Shared.DataContracts.Feature.AI ParentFolderOid = null, SubFolders = new List(), SubPrompts = new List(), + SubRoutines = new List(), Title = string.Format(AiPromptbausteineTexts.PublicSharedBibNodeTitle, display), Version = 1, IsExpanded = false @@ -129,6 +131,7 @@ namespace BS.Shared.DataContracts.Feature.AI ParentFolderOid = null, SubFolders = new List(), SubPrompts = new List(), + SubRoutines = new List(), Title = AiPromptbausteineTexts.OwnsoftBibNodeTitle, Version = 1, IsExpanded = true, @@ -146,6 +149,7 @@ namespace BS.Shared.DataContracts.Feature.AI ParentFolderOid = null, SubFolders = new List(), SubPrompts = new List(), + SubRoutines = new List(), Title = "Beispiel Ordner", Version = 1, CanAddFolder = true, diff --git a/Shared/Extensions/ICollectionExtensions.cs b/Shared/Extensions/ICollectionExtensions.cs index 1ce68bd96..e3164a5b6 100644 --- a/Shared/Extensions/ICollectionExtensions.cs +++ b/Shared/Extensions/ICollectionExtensions.cs @@ -37,7 +37,7 @@ namespace BS.Shared.Extensions public static void RemoveRange(this ICollection pList, Predicate pMatch) { - var lToDelete = pList.Where(t => pMatch(t)).ToHashSet(); + var lToDelete = pList.Where(t => pMatch(t)).ToHashSetEx(); pList.RemoveRange(lToDelete); } diff --git a/Shared/Extensions/IEnumerableTExtensions.cs b/Shared/Extensions/IEnumerableTExtensions.cs index abd9965c9..57c8e1ce2 100644 --- a/Shared/Extensions/IEnumerableTExtensions.cs +++ b/Shared/Extensions/IEnumerableTExtensions.cs @@ -152,7 +152,7 @@ namespace BS.Shared.Extensions return result.ToString(); } - public static HashSet ToHashSet(this IEnumerable pList) + public static HashSet ToHashSetEx(this IEnumerable pList) { return new HashSet(pList); }