using library_spo_utils.Constants; using library_spo_utils.Enums; using library_spo_utils.Interfaces.Repositories; using library_spo_utils.Interfaces.Services; using Microsoft.Extensions.Logging; using Microsoft.SharePoint.Client; using Microsoft.SharePoint.Client.DocumentSet; namespace library_spo_utils.Services; internal class SubProjectBuilderService : ISubProjectBuilderService { private readonly ISiteOptions siteOptions; private readonly ISharePointCustomOperation cpt; private readonly ISharePointAuthenticationManager authMgr; private readonly ISubProjectRepository subProjectRepository; private readonly IFieldEntryDataUpdate _fieldEntryDataUpdate; private readonly ILogger logger; public SubProjectBuilderService(ISiteOptions siteOptions, ISharePointCustomOperation cpt, ISharePointAuthenticationManager authMgr, ISubProjectRepository subProjectRepository, IFieldEntryDataUpdate fieldEntryDataUpdate, ILogger logger) { this.siteOptions = siteOptions; this.cpt = cpt; this.authMgr = authMgr; this.subProjectRepository = subProjectRepository; _fieldEntryDataUpdate = fieldEntryDataUpdate; this.logger = logger; } public bool SubProjectDocSet(string projName, List listOfSubProjIds) { try { #region Context var listTitle = siteOptions.GetSubProjList(projName); var subSite = siteOptions.GetSubProjSite(projName); var ctx = authMgr.GetContext(subSite); var web = ctx.Web; ctx.Load(web, w => w.Url); var list = web.Lists.GetByTitle(listTitle); ctx.Load(list, l => l.RootFolder, l => l.ContentTypes, l => l.Fields, l => l.ContentTypesEnabled); ctx.ExecuteQuery(); list.ContentTypesEnabled = true; list.Update(); if (cpt.ListContentTypeExist(ctx, listTitle, "Set di documenti") == false) { var documentCT = ctx.Site.RootWeb.AvailableContentTypes.GetById("0x0120D5"); ctx.Load(documentCT); ctx.ExecuteQuery(); var ctDocSet = new ContentTypeCreationInformation() { Name = "Set di documenti", ParentContentType = documentCT }; list.ContentTypes.Add(ctDocSet); list.Update(); ctx.ExecuteQuery(); } var ctData = list.ContentTypes.Where(c => c.Name == "Set di documenti"); var contentType = ctData.FirstOrDefault(); ctx.Load(contentType); ctx.ExecuteQuery(); #endregion foreach (var subProjId in listOfSubProjIds) { if (cpt.FolderExistsInsideList(ctx, listTitle, subProjId)) { _fieldEntryDataUpdate.FieldUpdate(ctx, listTitle, projName, FieldUpdateType.SubProject); continue; } Console.WriteLine($"> Inizializzata la fase di creazione per {subProjId}."); #region DocSet Field Entry DocumentSet.Create(ctx, list.RootFolder, subProjId, contentType.Id); ctx.ExecuteQuery(); Console.WriteLine($"> DocumentSet {subProjId} creata."); //var dsItem = list.RootFolder.Folders.GetByUrl(subProjId).ListItemAllFields; //dsItem["_ExtendedDescription"] = subProjectRepository.DefaultDescription(projName); //dsItem["PAL_Item"] = subProjectRepository.DefaultItem(projName); //dsItem["PAL_ItemCode"] = subProjectRepository.DefaultItemCode(projName); //dsItem["PAL_ItemDescription"] = subProjectRepository.DefaultItemDescription(projName); //dsItem["PAL_SerialNumber"] = subProjectRepository.DefaultSerialNumber(projName); //dsItem["PAL_Status"] = subProjectRepository.DefaultState(projName); //dsItem.Update(); //ctx.ExecuteQuery(); _fieldEntryDataUpdate.FieldUpdate(ctx, listTitle, subProjId, FieldUpdateType.SubProject); Console.WriteLine($"> Field value update."); #endregion #region SubProject Folder foreach (var name in Folders.SubProjectDocSet) { Console.WriteLine($"La sotto cartella {name} verrà creata in {subProjId}"); var rPath = ResourcePath.FromDecodedUrl($"{subProjId}/{name}"); list.RootFolder.AddSubFolderUsingPath(rPath); } ctx.ExecuteQuery(); Console.WriteLine($"Le sotto cartelle sono state create con successo in {subProjId}"); #endregion Console.WriteLine($"> {subProjId} creato con successo in SottoCommesse {projName}."); } } catch (Exception ex) { logger.LogError(ex,"Sub Proj Doc Set"); return false; } return true; } }