diff --git a/Server/Controllers/AnalyticsController.cs b/Server/Controllers/AnalyticsController.cs index b09e292..33e35bb 100644 --- a/Server/Controllers/AnalyticsController.cs +++ b/Server/Controllers/AnalyticsController.cs @@ -12,11 +12,9 @@ namespace Biskilog_Accounting.Server.Controllers [ApiController] public class AnalyticsController : ControllerBase { - private readonly ITokenService m_tokenService; private readonly IAnalytics m_analyticService; - public AnalyticsController(ITokenService tokenService, IAnalytics a_analytics) + public AnalyticsController(IAnalytics a_analytics) { - m_tokenService = tokenService; m_analyticService = a_analytics; } @@ -29,9 +27,6 @@ namespace Biskilog_Accounting.Server.Controllers [HttpGet, Route("cancelledsales/{a_start}/{a_end}")] public IEnumerable GetCancelledSalesAsync(DateTime a_start, DateTime a_end) { - string token = Request.Headers[HeaderNames.Authorization]!; - m_analyticService.SetContraints(token); - return m_analyticService.GetCancelledSales(a_start, a_end); } /// @@ -43,9 +38,6 @@ namespace Biskilog_Accounting.Server.Controllers [HttpGet, Route("sales/{a_start}/{a_end}")] public IEnumerable GetSalesAsync(DateTime a_start, DateTime a_end) { - string token = Request.Headers[HeaderNames.Authorization]!; - - m_analyticService.SetContraints(token); return m_analyticService.GetSalesTransaction(a_start, a_end); } /// @@ -57,9 +49,6 @@ namespace Biskilog_Accounting.Server.Controllers [HttpGet, Route("debtors")] public IEnumerable GetInDebtCustomers() { - string token = Request.Headers[HeaderNames.Authorization]!; - - m_analyticService.SetContraints(token); return m_analyticService.GetInDebtCustomers(); } /// @@ -71,9 +60,6 @@ namespace Biskilog_Accounting.Server.Controllers [HttpGet, Route("pricechanges/{a_start}/{a_end}")] public IEnumerable GetPriceChanges(DateTime a_start, DateTime a_end) { - string token = Request.Headers[HeaderNames.Authorization]!; - - m_analyticService.SetContraints(token); return m_analyticService.GetPriceChanges(a_start, a_end); } /// @@ -85,9 +71,6 @@ namespace Biskilog_Accounting.Server.Controllers [HttpGet, Route("employeesales/{a_start}/{a_end}")] public Dictionary> GetEmployeeSales(DateTime a_start, DateTime a_end) { - string token = Request.Headers[HeaderNames.Authorization]!; - - m_analyticService.SetContraints(token); return m_analyticService.GetEmployeeSales(a_start, a_end); } /// @@ -100,8 +83,7 @@ namespace Biskilog_Accounting.Server.Controllers public IEnumerable GetLowOnStockItems() { string token = Request.Headers[HeaderNames.Authorization]!; - - m_analyticService.SetContraints(token); + return m_analyticService.GetOutOfStockItems(); } /// @@ -113,10 +95,7 @@ namespace Biskilog_Accounting.Server.Controllers [HttpGet, Route("mostpurchaseditem/{a_start}/{a_end}")] public IEnumerable GetMostPurchased(DateTime a_start, DateTime a_end) { - string token = Request.Headers[HeaderNames.Authorization]!; - - m_analyticService.SetContraints(token); - return m_analyticService.GetMostPurchasedItem(a_start, a_end); + return m_analyticService.GetMostPurchasedItem(a_start, a_end); } } } diff --git a/Server/Services/AnalyticalService.cs b/Server/Services/AnalyticalService.cs index 84918d8..2795e05 100644 --- a/Server/Services/AnalyticalService.cs +++ b/Server/Services/AnalyticalService.cs @@ -1,14 +1,9 @@ -using Azure.Core; -using Biskilog_Accounting.Server.POSModels; -using Biskilog_Accounting.ServiceRepo; +using Biskilog_Accounting.Server.POSModels; using Biskilog_Accounting.Shared.CustomModels; using Biskilog_Accounting.Shared.Interfaces; using Biskilog_Accounting.Shared.POSModels; -using Microsoft.EntityFrameworkCore; using Microsoft.Net.Http.Headers; using System.Data.Entity; -using System.Runtime.CompilerServices; -using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace Biskilog_Accounting.Server.Services { @@ -19,135 +14,89 @@ namespace Biskilog_Accounting.Server.Services { private readonly BiskAcdbContext m_context; private readonly ITokenService m_tokenService; - private bool m_comparisonMode; - private string m_activeBranch; - public AnalyticalService(BiskAcdbContext a_context, ITokenService a_tokenService) + private readonly HttpContext m_httpContext; + + public AnalyticalService(BiskAcdbContext a_context, ITokenService a_tokenService, IHttpContextAccessor a_httpContextAccessor) { m_context = a_context; m_tokenService = a_tokenService; + m_httpContext = a_httpContextAccessor?.HttpContext; } public IEnumerable GetCancelledSales(DateTime a_start, DateTime a_end) { - //If in comparison mode, the list is fetched from all branchid of the business - if (m_comparisonMode) - { - return from cSale in m_context.Tblcancelledtransactions - join aSale in m_context.Tblcarts on cSale.Transno equals aSale.Transno into activeSale - join cPurchase in m_context.Tblcustomerpurchases on cSale.Transno equals cPurchase.TransactionId into customerSales - from c in customerSales.DefaultIfEmpty() - join customer in m_context.Tblcustomers on c.CustomerId equals customer.CustomerId into Customers - from cc in Customers.DefaultIfEmpty() - where cSale.DateCancelled >= a_start && cSale.DateCancelled <= a_end - select new CancelledSales - { - CancelledTransaction = cSale, - Value = activeSale.Sum(s => s.Total), - Customer = !String.IsNullOrEmpty(cc.CustomerId) ? $"{cc.Firstname} {cc.Surname}" : "Walk-IN Purchase" - }; - } - else - { - return from cSale in m_context.Tblcancelledtransactions - join aSale in m_context.Tblcarts on cSale.Transno equals aSale.Transno into activeSale - join cPurchase in m_context.Tblcustomerpurchases on cSale.Transno equals cPurchase.TransactionId into customerSales - from c in customerSales.DefaultIfEmpty() - join customer in m_context.Tblcustomers on c.CustomerId equals customer.CustomerId into Customers - from cc in Customers.DefaultIfEmpty() - where cSale.DateCancelled >= a_start && cSale.DateCancelled <= a_end && cSale.BranchId == m_activeBranch - select new CancelledSales - { - CancelledTransaction = cSale, - Value = (from a in activeSale where a.BranchId == m_activeBranch select a.Total).Sum(), - Customer = !String.IsNullOrEmpty(cc.CustomerId) ? $"{cc.Firstname} {cc.Surname}" : "Walk-IN Purchase" - }; + string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; + IEnumerable accessiblebranches = m_tokenService.BranchIds(token); + + return from cSale in m_context.Tblcancelledtransactions + join aSale in m_context.Tblcarts on cSale.Transno equals aSale.Transno into activeSale + join cPurchase in m_context.Tblcustomerpurchases on cSale.Transno equals cPurchase.TransactionId into customerSales + from c in customerSales.DefaultIfEmpty() + join customer in m_context.Tblcustomers on c.CustomerId equals customer.CustomerId into Customers + from cc in Customers.DefaultIfEmpty() + where cSale.DateCancelled >= a_start && cSale.DateCancelled <= a_end && accessiblebranches.Contains(cSale.BranchId) + select new CancelledSales + { + CancelledTransaction = cSale, + Value = (from a in activeSale where accessiblebranches.Contains(a.BranchId) select a.Total).Sum(), + Customer = !String.IsNullOrEmpty(cc.CustomerId) ? $"{cc.Firstname} {cc.Surname}" : "Walk-IN Purchase" + }; - } } public Dictionary> GetEmployeeSales(DateTime a_start, DateTime a_end) { - Dictionary> sales = new Dictionary>(); - if (m_comparisonMode) - { - var employeeSales = m_context.Tblcarts.Where(c => c.Date >= a_start && c.Date <= a_end).Select(e => e.Cashier).Distinct(); + string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; + IEnumerable accessiblebranches = m_tokenService.BranchIds(token); - foreach (string employeeName in employeeSales) - { - var list = (from a in employeeSales - join c in m_context.Tblcarts on a equals c.Cashier into Sales - from s in Sales - group s by s.Transno into saleItem - select new SaleItem - { - Total = saleItem.Sum(c => c.Total), - Transno = saleItem.Key, - Cashier = employeeName, - Date = saleItem.First().Date, - Status = saleItem.First().Status, - BranchId = saleItem.First().BranchId - }).ToList(); - sales.Add(employeeName, list); + Dictionary> sales = new Dictionary>(); + var employeeSales = m_context.Tblcarts.Where(c => c.Date >= a_start && c.Date <= a_end + && accessiblebranches.Contains(c.BranchId)).Select(e => e.Cashier).Distinct().ToList(); - } - } - else + foreach (var employeeName in employeeSales) { - var employeeSales = m_context.Tblcarts.Where(c => c.Date >= a_start && c.Date <= a_end && c.BranchId == m_activeBranch).Select(e => e.Cashier).Distinct().ToList(); - - foreach (var employeeName in employeeSales) - { - var list = (from a in employeeSales - join c in m_context.Tblcarts on a equals c.Cashier into Sales - from s in Sales - group s by s.Transno into saleItem - select new SaleItem - { - Total = saleItem.Sum(c => c.Total), - Transno = saleItem.Key, - Cashier = employeeName, - Date = saleItem.First().Date, - Status = saleItem.First().Status, - BranchId = saleItem.First().BranchId - }).ToList(); - sales.Add(employeeName, list); - } + var list = (from a in employeeSales + join c in m_context.Tblcarts on a equals c.Cashier into Sales + from s in Sales + group s by s.Transno into saleItem + select new SaleItem + { + Total = saleItem.Sum(c => c.Total), + Transno = saleItem.Key, + Cashier = employeeName, + Date = saleItem.First().Date, + Status = saleItem.First().Status, + BranchId = saleItem.First().BranchId + }).ToList(); + sales.Add(employeeName, list); } return sales; } public IEnumerable GetInDebtCustomers() { - if (m_comparisonMode) - { - var listDebts = m_context.Customeraccounts.Where(t => t.Balance < 0).OrderByDescending(d => d.Date).Select(t => t.CustomerId).Distinct().ToList(); - foreach (var customerId in listDebts) - { - yield return new InDebtCustomers - { - Customer = m_context.Tblcustomers.FirstOrDefault(i => i.CustomerId == customerId), - Debt = m_context.Customeraccounts.OrderByDescending(d => d.Date).FirstOrDefault(t => t.Balance < 0 && t.CustomerId == customerId).Balance, - }; - } - } - else + string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; + IEnumerable accessiblebranches = m_tokenService.BranchIds(token); + + var listDebts = m_context.Customeraccounts.Where(t => t.Balance < 0 && accessiblebranches.Contains(t.BranchId)).OrderByDescending(d => d.Date).Select(t => t.CustomerId).Distinct().ToList(); + foreach (var customerId in listDebts) { - var listDebts = m_context.Customeraccounts.Where(t => t.Balance < 0 && t.BranchId == m_activeBranch).OrderByDescending(d => d.Date).Select(t => t.CustomerId).Distinct().ToList(); - foreach (var customerId in listDebts) + yield return new InDebtCustomers { - yield return new InDebtCustomers - { - Customer = m_context.Tblcustomers.FirstOrDefault(i => i.CustomerId == customerId), - Debt = m_context.Customeraccounts.OrderByDescending(d => d.Date).FirstOrDefault(t => t.Balance < 0 && t.CustomerId == customerId).Balance, - }; - } + Customer = m_context.Tblcustomers.FirstOrDefault(i => i.CustomerId == customerId), + Debt = m_context.Customeraccounts.OrderByDescending(d => d.Date).FirstOrDefault(t => t.Balance < 0 && t.CustomerId == customerId).Balance, + }; } } public IEnumerable GetMostPurchasedItem(DateTime a_start, DateTime a_end) { + //TODO either rewrite query or increase memory on server to deal with comparison mode performance issue + string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; + IEnumerable accessiblebranches = m_tokenService.BranchIds(token); + var items = (from s in m_context.Tblcarts join p in m_context.Tblproducts on s.Id equals p.Pcode - where s.Date >= a_start && s.Date <= a_end + where s.Date >= a_start && s.Date <= a_end && s.BranchId == accessiblebranches.First() group s by p into g orderby g.Count() descending select new MostPurchasedItem @@ -162,100 +111,54 @@ namespace Biskilog_Accounting.Server.Services public IEnumerable GetOutOfStockItems() { - if (m_comparisonMode) - { - return (from item in m_context.Tblinventories - join p in m_context.Tblproducts on item.Pcode equals p.Pcode - join pu in m_context.Productaltunits on item.Pcode equals pu.Pcode into AltUnit - from au in AltUnit.DefaultIfEmpty() - join rs in m_context.Restocklevels on item.Pcode equals rs.ProductId - join un in m_context.Unitofmeasures on p.BaseUnit equals un.UnitCode - where p.Status!.ToLower() != "inactive" && - ((rs.WarnLevel >= item.Quantity && rs.Unit == p.BaseUnit) || (rs.WarnLevel >= (item.Quantity / au.QuantityUnit) && - rs.Unit == au.UnitCode) - ) - select new ProductItem - { - Product = p, - Stock = item, - BaseUnit = un.Unitshort! - }); - } - else - { - return (from item in m_context.Tblinventories - join p in m_context.Tblproducts on item.Pcode equals p.Pcode - join pu in m_context.Productaltunits on item.Pcode equals pu.Pcode into AltUnit - from au in AltUnit.DefaultIfEmpty() - join rs in m_context.Restocklevels on item.Pcode equals rs.ProductId - join un in m_context.Unitofmeasures on p.BaseUnit equals un.UnitCode - where p.Status!.ToLower() != "inactive" && item.BranchId == m_activeBranch && - ((rs.WarnLevel >= item.Quantity && rs.Unit == p.BaseUnit) || (rs.WarnLevel >= (item.Quantity / au.QuantityUnit) && - rs.Unit == au.UnitCode) - ) - select new ProductItem - { - Product = p, - Stock = item, - BaseUnit = un.Unitshort! - }); - } - //return null; + string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; + IEnumerable accessiblebranches = m_tokenService.BranchIds(token); + + return (from item in m_context.Tblinventories + join p in m_context.Tblproducts on item.Pcode equals p.Pcode + join pu in m_context.Productaltunits on item.Pcode equals pu.Pcode into AltUnit + from au in AltUnit.DefaultIfEmpty() + join rs in m_context.Restocklevels on item.Pcode equals rs.ProductId + join un in m_context.Unitofmeasures on p.BaseUnit equals un.UnitCode + where p.Status!.ToLower() != "inactive" && accessiblebranches.Contains(item.BranchId) && + ((rs.WarnLevel >= item.Quantity && rs.Unit == p.BaseUnit) || (rs.WarnLevel >= (item.Quantity / au.QuantityUnit) && + rs.Unit == au.UnitCode) + ) + select new ProductItem + { + Product = p, + Stock = item, + BaseUnit = un.Unitshort! + }); } public IEnumerable GetPriceChanges(DateTime a_start, DateTime a_end) { - if (m_comparisonMode) - { - return from change in m_context.Tblpricechanges - join p in m_context.Tblproducts on change.Pcode equals p.Pcode - where change.ChangeDate >= a_start && change.ChangeDate <= a_end - select new ProductPriceChange - { - BranchId = change.BranchId, - ChangeDate = change.ChangeDate, - Pcode = change.Pcode, - CountId = change.CountId, - CurrentPrice = change.CurrentPrice, - PreviousPrice = change.PreviousPrice, - ProductName = p.ProductName - }; - } - else - { - return from change in m_context.Tblpricechanges - join p in m_context.Tblproducts on change.Pcode equals p.Pcode - where change.ChangeDate >= a_start && change.ChangeDate <= a_end && change.BranchId == m_activeBranch - select new ProductPriceChange - { - BranchId = change.BranchId, - ChangeDate = change.ChangeDate, - Pcode = change.Pcode, - CountId = change.CountId, - CurrentPrice = change.CurrentPrice, - PreviousPrice = change.PreviousPrice, - ProductName = p.ProductName - }; - } + string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; + IEnumerable accessiblebranches = m_tokenService.BranchIds(token); + + return from change in m_context.Tblpricechanges + join p in m_context.Tblproducts on change.Pcode equals p.Pcode + where change.ChangeDate >= a_start && change.ChangeDate <= a_end && accessiblebranches.Contains(change.BranchId) + select new ProductPriceChange + { + BranchId = change.BranchId, + ChangeDate = change.ChangeDate, + Pcode = change.Pcode, + CountId = change.CountId, + CurrentPrice = change.CurrentPrice, + PreviousPrice = change.PreviousPrice, + ProductName = p.ProductName + }; } public IEnumerable GetSalesTransaction(DateTime a_start, DateTime a_end) { - //If in comparison mode, the list is fetched from all branchid of the business - if (m_comparisonMode) - { - return m_context.Tblcarts.Where(t => t.Date >= a_start && t.Date <= a_end); - } - else - { - return m_context.Tblcarts.Where(t => t.Date >= a_start && t.Date <= a_end && t.BranchId == m_activeBranch); - } - } + string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; + IEnumerable accessiblebranches = m_tokenService.BranchIds(token); + + return m_context.Tblcarts.Where(t => t.Date >= a_start && t.Date <= a_end && accessiblebranches.Contains(t.BranchId)); - public void SetContraints(string a_token) - { - m_comparisonMode = m_tokenService.GetComparison(a_token)!.Value; - m_activeBranch = m_tokenService.GetBaseBranch(a_token)!; } } } diff --git a/Server/Services/AuthenticationService.cs b/Server/Services/AuthenticationService.cs index 6ca95f6..c1ae403 100644 --- a/Server/Services/AuthenticationService.cs +++ b/Server/Services/AuthenticationService.cs @@ -55,12 +55,12 @@ namespace Biskilog_Accounting.Server.Services List businessIds = GetSiteaccesspermission(user.ClientId, user.UserId).Select(t => t.BusinessId).ToList(); Contract? contract = GetContract(user.ClientId, businessIds); - List businesses = GetClientbusiness(user.ClientId); + List businesses = GetClientbusiness(user.ClientId, user.UserId).Select(t=>t.BusinessExternalId).ToList(); if (contract == null) return AuthEnums.Invalid.ToString(); - return m_tokenService.GenerateToken(user, contract, databasemap, businesses[0], false); + return m_tokenService.GenerateToken(user, contract, databasemap, businesses, false); } /// @@ -95,9 +95,12 @@ namespace Biskilog_Accounting.Server.Services throw new NotImplementedException(); } - public List GetClientbusiness(int a_clientId) + public List GetClientbusiness(int a_clientId, int userId) { - return m_context.Clientbusinesses.Where(i => i.ClientId == a_clientId).ToList(); + return (from b in m_context.Clientbusinesses + join p in m_context.Siteaccesspermissions on new {b.ClientId, b.BusinessId} equals new {p.ClientId, p.BusinessId} + where p.UserId == userId && p.ClientId == a_clientId + select b).ToList(); } public Databasemap GetClientDB(int a_clientId) diff --git a/Server/appsettings.json b/Server/appsettings.json index 140c6ab..984fb06 100644 --- a/Server/appsettings.json +++ b/Server/appsettings.json @@ -7,7 +7,7 @@ }, "ConnectionStrings": { "Connection": "server=54.37.19.162;database=dev_biskilogclients;user=biskilog;password=mefbuk-6niFsu-fytrew", - "PrivateConnection": "server={0};database={1};user=biskilog;password=mefbuk-6niFsu-fytrew" + "PrivateConnection": "server={0};database={1};user=biskilog;password=mefbuk-6niFsu-fytrew;default command timeout=0;" }, "AllowedHosts": "*", "JWT": { diff --git a/Shared/Interfaces/IAnalytics.cs b/Shared/Interfaces/IAnalytics.cs index c1f0102..fb00c93 100644 --- a/Shared/Interfaces/IAnalytics.cs +++ b/Shared/Interfaces/IAnalytics.cs @@ -27,7 +27,7 @@ namespace Biskilog_Accounting.Shared.Interfaces /// /// /// - IEnumerable GetMostPurchasedItem(DateTime a_start, DateTime a_end); + IEnumerable GetMostPurchasedItem(DateTime a_start, DateTime a_end); /// /// Fetches a collection of cancelled transaction within a specified date range /// @@ -49,6 +49,6 @@ namespace Biskilog_Accounting.Shared.Interfaces /// /// IEnumerable GetPriceChanges(DateTime a_start, DateTime a_end); - void SetContraints(string a_token); + //void SetContraints(string a_token); } } diff --git a/Shared/Interfaces/IAuthService.cs b/Shared/Interfaces/IAuthService.cs index 70a8960..f0f93b9 100644 --- a/Shared/Interfaces/IAuthService.cs +++ b/Shared/Interfaces/IAuthService.cs @@ -14,6 +14,6 @@ namespace Biskilog_Accounting.Shared.Interfaces Contract? GetContract(int a_clientId, List a_businessId); Databasemap GetClientDB(int a_clientId); List GetSiteaccesspermission(int a_clientId, int a_userId); - List GetClientbusiness(int a_clientId); + List GetClientbusiness(int a_clientId, int userId); } } diff --git a/Shared/Interfaces/ITokenService.cs b/Shared/Interfaces/ITokenService.cs index 27cdf82..f4dc1f7 100644 --- a/Shared/Interfaces/ITokenService.cs +++ b/Shared/Interfaces/ITokenService.cs @@ -6,12 +6,13 @@ namespace Biskilog_Accounting.Shared.Interfaces public interface ITokenService { AuthEnums ValidateToken(string a_token); - string GenerateToken(Userauth a_user, Contract a_clientContract, Databasemap a_database, Clientbusiness a_business, bool a_comparison); + string GenerateToken(Userauth a_user, Contract a_clientContract, Databasemap a_database, List a_business, bool a_comparison); int? GetDatabaseIdFromToken(string a_token); int? GetUserIdFromToken(string a_token); string? GetUserNameFromToken(string a_token); string? GetBaseBranch(string a_token); bool? GetComparison(string a_token); - + IEnumerable BranchIds(string a_token); + string? GetAllBranch(string a_token); } } diff --git a/Shared/ServiceRepo/TokenService.cs b/Shared/ServiceRepo/TokenService.cs index 022137e..d86df04 100644 --- a/Shared/ServiceRepo/TokenService.cs +++ b/Shared/ServiceRepo/TokenService.cs @@ -43,7 +43,7 @@ namespace Biskilog_Accounting.ServiceRepo /// Generates an access token based on the user /// /// A tokenized string - public string GenerateToken(Userauth a_user, Contract a_clientContract, Databasemap a_database, Clientbusiness a_business, bool a_comparison) + public string GenerateToken(Userauth a_user, Contract a_clientContract, Databasemap a_database, List a_business, bool a_comparison) { try { @@ -57,7 +57,8 @@ namespace Biskilog_Accounting.ServiceRepo new Claim("Username", a_user.Username.ToString()), new Claim("DbId",a_database.DbNo.ToString()), new Claim("ComparisonMode",a_comparison.ToString()), - new Claim("BranchId",a_business.BusinessExternalId.ToString()), + new Claim("BranchId",a_business[0].ToString()), + new Claim("BranchAccess",string.Join(", ", a_business.ToArray())), new Claim("ClientId", a_user.ClientId.ToString()), }; @@ -150,5 +151,50 @@ namespace Biskilog_Accounting.ServiceRepo } return null; } + /// + ///Deserializes the token string if valid to return the specified list of branches a user has access to in the token string + /// + /// + /// Username + public string? GetAllBranch(string a_token) + { + if (ValidateToken(a_token) == AuthEnums.Valid) + { + string token = a_token.Substring(6).Trim(); + var handler = new JwtSecurityTokenHandler(); + JwtSecurityToken jwtToken = (JwtSecurityToken)handler.ReadToken(token); + return jwtToken.Claims.First(claim => claim.Type == "BranchAccess").Value; + } + return null; + } + /// + /// Return a specified list of branches a user has access if comparison mode is set otherwise returns only the + /// active branch on the list + /// + /// + /// + public IEnumerable BranchIds(string a_token) + { + List branchIds = new List(); + if (ValidateToken(a_token) == AuthEnums.Valid) + { + bool comparison = GetComparison(a_token)!.Value; + if (comparison) + { + string? branches = GetAllBranch(a_token); + if (branches != null) + { + string[] branchArray = branches!.Split(); + branchIds.AddRange(branchArray); + } + } + else + { + string? baseBranch = GetBaseBranch(a_token); + branchIds.Add(baseBranch!); + } + } + return branchIds.AsEnumerable(); + } } }