public BlockActionResult GetContent(Guid connectionTypeGuid, GetConnectionOpportunitiesFilterViewModel filter = null) { filter = filter ?? new GetConnectionOpportunitiesFilterViewModel(); return(ActionOk(GetConnectionOpportunities(connectionTypeGuid, filter))); }
/// <summary> /// Gets the connection opportunities view model that can be sent to the client. /// </summary> /// <param name="connectionTypeGuid">The connection type unique identifier.</param> /// <param name="filterViewModel">The filter.</param> /// <returns>The <see cref="GetContentViewModel"/> that contains the information about the response.</returns> private GetContentViewModel GetConnectionOpportunities(Guid connectionTypeGuid, GetConnectionOpportunitiesFilterViewModel filterViewModel) { using (var rockContext = new RockContext()) { var opportunityService = new ConnectionOpportunityService(rockContext); var opportunityClientService = new ConnectionOpportunityClientService(rockContext, RequestContext.CurrentPerson); var connectionType = new ConnectionTypeService(rockContext).GetNoTracking(connectionTypeGuid); var filterOptions = new ConnectionOpportunityQueryOptions { ConnectionTypeGuids = new List <Guid> { connectionTypeGuid }, IncludeInactive = true }; if (filterViewModel.OnlyMyConnections) { filterOptions.ConnectorPersonIds = new List <int> { RequestContext.CurrentPerson?.Id ?? 0 }; } // Put all the opportunities in memory so we can check security. var qry = opportunityService.GetConnectionOpportunitiesQuery(filterOptions); var opportunities = qry.ToList() .Where(o => o.IsAuthorized(Authorization.VIEW, RequestContext.CurrentPerson)); // Get the various counts to make available to the Lava template. // The conversion of the value to a dictionary is a temporary work-around // until we have a way to mark external types as lava safe. var opportunityIds = opportunities.Select(o => o.Id).ToList(); var requestCounts = opportunityClientService.GetOpportunityRequestCounts(opportunityIds) .ToDictionary(k => k.Key, k => k.Value .GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) .ToDictionary(prop => prop.Name, prop => prop.GetValue(k.Value, null))); // Process the connection opportunities with the template. var mergeFields = RequestContext.GetCommonMergeFields(); mergeFields.AddOrReplace("ConnectionOpportunities", opportunities); mergeFields.AddOrReplace("DetailPage", DetailPageGuid); mergeFields.AddOrReplace("ConnectionRequestCounts", requestCounts); var content = OpportunityTemplate.ResolveMergeFields(mergeFields); // Process the header template for. mergeFields = RequestContext.GetCommonMergeFields(); if (connectionType != null) { mergeFields.Add("ConnectionType", connectionType); } var headerContent = HeaderTemplate.ResolveMergeFields(mergeFields); return(new GetContentViewModel { HeaderContent = headerContent, Content = content }); } }