using Nop.Core; using Nop.Core.Domain.Customers; using Nop.Core.Domain.Forums; using Nop.Core.Domain.Media; using Nop.Services.Common; using Nop.Services.Customers; using Nop.Services.Directory; using Nop.Services.Forums; using Nop.Services.Helpers; using Nop.Services.Localization; using Nop.Services.Media; using Nop.Web.Framework.Extensions; using Nop.Web.Models.Common; using Nop.Web.Models.Profile; namespace Nop.Web.Factories; /// /// Represents the profile model factory /// public partial class ProfileModelFactory : IProfileModelFactory { #region Fields protected readonly CustomerSettings _customerSettings; protected readonly ForumSettings _forumSettings; protected readonly ICountryService _countryService; protected readonly ICustomerService _customerService; protected readonly IDateTimeHelper _dateTimeHelper; protected readonly IForumService _forumService; protected readonly IGenericAttributeService _genericAttributeService; protected readonly ILocalizationService _localizationService; protected readonly IPictureService _pictureService; protected readonly IWorkContext _workContext; protected readonly MediaSettings _mediaSettings; #endregion #region Ctor public ProfileModelFactory(CustomerSettings customerSettings, ForumSettings forumSettings, ICountryService countryService, ICustomerService customerService, IDateTimeHelper dateTimeHelper, IForumService forumService, IGenericAttributeService genericAttributeService, ILocalizationService localizationService, IPictureService pictureService, IWorkContext workContext, MediaSettings mediaSettings) { _customerSettings = customerSettings; _forumSettings = forumSettings; _countryService = countryService; _customerService = customerService; _dateTimeHelper = dateTimeHelper; _forumService = forumService; _genericAttributeService = genericAttributeService; _localizationService = localizationService; _pictureService = pictureService; _workContext = workContext; _mediaSettings = mediaSettings; } #endregion #region Methods /// /// Prepare the profile index model /// /// Customer /// Number of posts page; pass null to disable paging /// /// A task that represents the asynchronous operation /// The task result contains the profile index model /// public virtual async Task PrepareProfileIndexModelAsync(Customer customer, int? page) { ArgumentNullException.ThrowIfNull(customer); var pagingPosts = false; var postsPage = 0; if (page.HasValue) { postsPage = page.Value; pagingPosts = true; } var name = await _customerService.FormatUsernameAsync(customer); var title = string.Format(await _localizationService.GetResourceAsync("Profile.ProfileOf"), name); var model = new ProfileIndexModel { ProfileTitle = title, PostsPage = postsPage, PagingPosts = pagingPosts, CustomerProfileId = customer.Id, ForumsEnabled = _forumSettings.ForumsEnabled }; return model; } /// /// Prepare the profile info model /// /// Customer /// /// A task that represents the asynchronous operation /// The task result contains the profile info model /// public virtual async Task PrepareProfileInfoModelAsync(Customer customer) { ArgumentNullException.ThrowIfNull(customer); //avatar var avatarUrl = ""; if (_customerSettings.AllowCustomersToUploadAvatars) { avatarUrl = await _pictureService.GetPictureUrlAsync( await _genericAttributeService.GetAttributeAsync(customer, NopCustomerDefaults.AvatarPictureIdAttribute), _mediaSettings.AvatarPictureSize, _customerSettings.DefaultAvatarEnabled, defaultPictureType: PictureType.Avatar); } //location var locationEnabled = false; var location = string.Empty; if (_customerSettings.ShowCustomersLocation) { locationEnabled = true; var countryId = customer.CountryId; var country = await _countryService.GetCountryByIdAsync(countryId); if (country != null) { location = await _localizationService.GetLocalizedAsync(country, x => x.Name); } else { locationEnabled = false; } } //private message var pmEnabled = _forumSettings.AllowPrivateMessages && !await _customerService.IsGuestAsync(customer); //total forum posts var totalPostsEnabled = false; var totalPosts = 0; if (_forumSettings.ForumsEnabled && _forumSettings.ShowCustomersPostCount) { totalPostsEnabled = true; totalPosts = await _genericAttributeService.GetAttributeAsync(customer, NopCustomerDefaults.ForumPostCountAttribute); } //registration date var joinDateEnabled = false; var joinDate = string.Empty; if (_customerSettings.ShowCustomersJoinDate) { joinDateEnabled = true; joinDate = (await _dateTimeHelper.ConvertToUserTimeAsync(customer.CreatedOnUtc, DateTimeKind.Utc)).ToString("f"); } //birth date var dateOfBirthEnabled = false; var dateOfBirth = string.Empty; if (_customerSettings.DateOfBirthEnabled) { if (customer.DateOfBirth.HasValue) { dateOfBirthEnabled = true; dateOfBirth = customer.DateOfBirth.Value.ToString("D"); } } var model = new ProfileInfoModel { CustomerProfileId = customer.Id, AvatarUrl = avatarUrl, LocationEnabled = locationEnabled, Location = location, PMEnabled = pmEnabled, TotalPostsEnabled = totalPostsEnabled, TotalPosts = totalPosts.ToString(), JoinDateEnabled = joinDateEnabled, JoinDate = joinDate, DateOfBirthEnabled = dateOfBirthEnabled, DateOfBirth = dateOfBirth, }; return model; } /// /// Prepare the profile posts model /// /// Customer /// Number of posts page /// /// A task that represents the asynchronous operation /// The task result contains the profile posts model /// public virtual async Task PrepareProfilePostsModelAsync(Customer customer, int page) { ArgumentNullException.ThrowIfNull(customer); if (page > 0) { page -= 1; } var pageSize = _forumSettings.LatestCustomerPostsPageSize; var list = await _forumService.GetAllPostsAsync(0, customer.Id, string.Empty, false, page, pageSize); var latestPosts = new List(); foreach (var forumPost in list) { string posted; if (_forumSettings.RelativeDateTimeFormattingEnabled) { var languageCode = (await _workContext.GetWorkingLanguageAsync()).LanguageCulture; var postedAgo = forumPost.CreatedOnUtc.RelativeFormat(languageCode); posted = string.Format(await _localizationService.GetResourceAsync("Common.RelativeDateTime.Past"), postedAgo); } else { posted = (await _dateTimeHelper.ConvertToUserTimeAsync(forumPost.CreatedOnUtc, DateTimeKind.Utc)).ToString("f"); } var topic = await _forumService.GetTopicByIdAsync(forumPost.TopicId); latestPosts.Add(new PostsModel { ForumTopicId = topic.Id, ForumTopicTitle = topic.Subject, ForumTopicSlug = await _forumService.GetTopicSeNameAsync(topic), ForumPostText = _forumService.FormatPostText(forumPost), Posted = posted }); } var pagerModel = new PagerModel(_localizationService) { PageSize = list.PageSize, TotalRecords = list.TotalCount, PageIndex = list.PageIndex, ShowTotalSummary = false, RouteActionName = "CustomerProfilePaged", UseRouteLinks = true, RouteValues = new SlugRouteValues { PageNumber = page, Id = customer.Id } }; var model = new ProfilePostsModel { PagerModel = pagerModel, Posts = latestPosts, }; return model; } #endregion }