using Nop.Services.Installation; using Nop.Web.Framework.Mvc.Routing; namespace Nop.Web.Infrastructure; /// /// Represents provider that provided basic routes /// public partial class RouteProvider : BaseRouteProvider, IRouteProvider { #region Methods /// /// Register routes /// /// Route builder public void RegisterRoutes(IEndpointRouteBuilder endpointRouteBuilder) { //get language pattern //it's not needed to use language pattern in AJAX requests and for actions returning the result directly (e.g. file to download), //use it only for URLs of pages that the user can go to var lang = GetLanguageRoutePattern(); //areas endpointRouteBuilder.MapControllerRoute(name: "areaRoute", pattern: $"{{area:exists}}/{{controller=Home}}/{{action=Index}}/{{id?}}"); //home page endpointRouteBuilder.MapControllerRoute(name: "Homepage", pattern: $"{lang}", defaults: new { controller = "Home", action = "Index" }); //login endpointRouteBuilder.MapControllerRoute(name: "Login", pattern: $"{lang}/login/", defaults: new { controller = "Customer", action = "Login" }); // multi-factor verification digit code page endpointRouteBuilder.MapControllerRoute(name: "MultiFactorVerification", pattern: $"{lang}/multi-factor-verification/", defaults: new { controller = "Customer", action = "MultiFactorVerification" }); //register endpointRouteBuilder.MapControllerRoute(name: "Register", pattern: $"{lang}/register/", defaults: new { controller = "Customer", action = "Register" }); //logout endpointRouteBuilder.MapControllerRoute(name: "Logout", pattern: $"{lang}/logout/", defaults: new { controller = "Customer", action = "Logout" }); //shopping cart endpointRouteBuilder.MapControllerRoute(name: "ShoppingCart", pattern: $"{lang}/cart/", defaults: new { controller = "ShoppingCart", action = "Cart" }); //estimate shipping (AJAX) endpointRouteBuilder.MapControllerRoute(name: "EstimateShipping", pattern: $"cart/estimateshipping", defaults: new { controller = "ShoppingCart", action = "GetEstimateShipping" }); //select shipping option (AJAX) endpointRouteBuilder.MapControllerRoute(name: "SelectShippingOption", pattern: $"cart/selectshippingoption", defaults: new { controller = "ShoppingCart", action = "SelectShippingOption" }); //wishlist endpointRouteBuilder.MapControllerRoute(name: "Wishlist", pattern: $"{lang}/wishlist/{{customerGuid?}}", defaults: new { controller = "ShoppingCart", action = "Wishlist" }); //checkout attribute change (AJAX) endpointRouteBuilder.MapControllerRoute(name: "CheckoutAttributeChange", pattern: "shoppingcart/checkoutattributechange/{{isEditable}}", defaults: new { controller = "ShoppingCart", action = "CheckoutAttributeChange" }); //customer account links endpointRouteBuilder.MapControllerRoute(name: "CustomerInfo", pattern: $"{lang}/customer/info", defaults: new { controller = "Customer", action = "Info" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerAddresses", pattern: $"{lang}/customer/addresses", defaults: new { controller = "Customer", action = "Addresses" }); //customer address delete (AJAX) endpointRouteBuilder.MapControllerRoute(name: "CustomerAddressDelete", pattern: $"customer/addressdelete", defaults: new { controller = "Customer", action = "AddressDelete" }); //remove external association (AJAX) endpointRouteBuilder.MapControllerRoute(name: "CustomerRemoveExternalAssociation", pattern: $"customer/removeexternalassociation", defaults: new { controller = "Customer", action = "RemoveExternalAssociation" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerOrders", pattern: $"{lang}/order/history", defaults: new { controller = "Order", action = "CustomerOrders" }); //contact us endpointRouteBuilder.MapControllerRoute(name: "ContactUs", pattern: $"{lang}/contactus", defaults: new { controller = "Common", action = "ContactUs" }); //product search endpointRouteBuilder.MapControllerRoute(name: "ProductSearch", pattern: $"{lang}/search/", defaults: new { controller = "Catalog", action = "Search" }); //autocomplete search term (AJAX) endpointRouteBuilder.MapControllerRoute(name: "ProductSearchAutoComplete", pattern: $"catalog/searchtermautocomplete", defaults: new { controller = "Catalog", action = "SearchTermAutoComplete" }); //change currency endpointRouteBuilder.MapControllerRoute(name: "ChangeCurrency", pattern: $"{lang}/changecurrency/{{customercurrency:min(0)}}", defaults: new { controller = "Common", action = "SetCurrency" }); //change language endpointRouteBuilder.MapControllerRoute(name: "ChangeLanguage", pattern: $"{lang}/changelanguage/{{langid:min(0)}}", defaults: new { controller = "Common", action = "SetLanguage" }); //change tax endpointRouteBuilder.MapControllerRoute(name: "ChangeTaxType", pattern: $"{lang}/changetaxtype/{{customertaxtype:min(0)}}", defaults: new { controller = "Common", action = "SetTaxType" }); //set store theme endpointRouteBuilder.MapControllerRoute(name: "SetStoreTheme", pattern: $"{lang}/setstoretheme/{{themeName}}/{{returnUrl}}", defaults: new { controller = "Common", action = "SetStoreTheme" }); //recently viewed products endpointRouteBuilder.MapControllerRoute(name: "RecentlyViewedProducts", pattern: $"{lang}/recentlyviewedproducts/", defaults: new { controller = "Product", action = "RecentlyViewedProducts" }); //new products endpointRouteBuilder.MapControllerRoute(name: "NewProducts", pattern: $"{lang}/newproducts/", defaults: new { controller = "Catalog", action = "NewProducts" }); //blog endpointRouteBuilder.MapControllerRoute(name: "Blog", pattern: $"{lang}/blog", defaults: new { controller = "Blog", action = "List" }); //news endpointRouteBuilder.MapControllerRoute(name: "NewsArchive", pattern: $"{lang}/news", defaults: new { controller = "News", action = "List" }); //forum endpointRouteBuilder.MapControllerRoute(name: "Boards", pattern: $"{lang}/boards", defaults: new { controller = "Boards", action = "Index" }); //compare products endpointRouteBuilder.MapControllerRoute(name: "CompareProducts", pattern: $"{lang}/compareproducts/", defaults: new { controller = "Product", action = "CompareProducts" }); //product tags endpointRouteBuilder.MapControllerRoute(name: "ProductTagsAll", pattern: $"{lang}/producttag/all/", defaults: new { controller = "Catalog", action = "ProductTagsAll" }); //manufacturers endpointRouteBuilder.MapControllerRoute(name: "ManufacturerList", pattern: $"{lang}/manufacturer/all/", defaults: new { controller = "Catalog", action = "ManufacturerAll" }); //vendors endpointRouteBuilder.MapControllerRoute(name: "VendorList", pattern: $"{lang}/vendor/all/", defaults: new { controller = "Catalog", action = "VendorAll" }); endpointRouteBuilder.MapControllerRoute(name: "VendorReviews", pattern: $"{lang}/vendor/{{vendorId:min(0)}}/reviews", defaults: new { controller = "Catalog", action = "VendorReviews" }); //add product to cart (without any attributes and options). used on catalog pages. (AJAX) endpointRouteBuilder.MapControllerRoute(name: "AddProductToCart-Catalog", pattern: $"addproducttocart/catalog/{{productId:min(0)}}/{{shoppingCartTypeId:min(0)}}/{{quantity:min(0)}}", defaults: new { controller = "ShoppingCart", action = "AddProductToCart_Catalog" }); //add product to cart (with attributes and options). used on the product details pages. (AJAX) endpointRouteBuilder.MapControllerRoute(name: "AddProductToCart-Details", pattern: $"addproducttocart/details/{{productId:min(0)}}/{{shoppingCartTypeId:min(0)}}", defaults: new { controller = "ShoppingCart", action = "AddProductToCart_Details" }); //comparing products (AJAX) endpointRouteBuilder.MapControllerRoute(name: "AddProductToCompare", pattern: $"compareproducts/add/{{productId:min(0)}}", defaults: new { controller = "Product", action = "AddProductToCompareList" }); //product email a friend endpointRouteBuilder.MapControllerRoute(name: "ProductEmailAFriend", pattern: $"{lang}/productemailafriend/{{productId:min(0)}}", defaults: new { controller = "Product", action = "ProductEmailAFriend" }); //product estimate shipping (AJAX) endpointRouteBuilder.MapControllerRoute(name: "ProductEstimateShipping", pattern: "product/estimateshipping/{{ProductId:min(0)}}", defaults: new { controller = "Product", action = "EstimateShipping" }); //reviews endpointRouteBuilder.MapControllerRoute(name: "CustomerProductReviews", pattern: $"{lang}/customer/productreviews", defaults: new { controller = "Product", action = "CustomerProductReviews" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerProductReviewsPaged", pattern: $"{lang}/customer/productreviews/page/{{pageNumber:min(0)}}", defaults: new { controller = "Product", action = "CustomerProductReviews" }); //back in stock notifications (AJAX) endpointRouteBuilder.MapControllerRoute(name: "BackInStockSubscribePopup", pattern: $"backinstocksubscribe/{{productId:min(0)}}", defaults: new { controller = "BackInStockSubscription", action = "SubscribePopup" }); endpointRouteBuilder.MapControllerRoute(name: "BackInStockSubscribeSend", pattern: $"backinstocksubscribesend/{{productId:min(0)}}", defaults: new { controller = "BackInStockSubscription", action = "SubscribePopupPOST" }); //downloads (file result) endpointRouteBuilder.MapControllerRoute(name: "GetSampleDownload", pattern: $"download/sample/{{productid:min(0)}}", defaults: new { controller = "Download", action = "Sample" }); //downloads endpointRouteBuilder.MapControllerRoute(name: "DownloadGetFileUpload", pattern: $"download/getfileupload/{{downloadId}}", defaults: new { controller = "Download", action = "GetFileUpload" }); //checkout pages endpointRouteBuilder.MapControllerRoute(name: "Checkout", pattern: $"{lang}/checkout/", defaults: new { controller = "Checkout", action = "Index" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutOnePage", pattern: $"{lang}/onepagecheckout/", defaults: new { controller = "Checkout", action = "OnePageCheckout" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutShippingAddress", pattern: $"{lang}/checkout/shippingaddress", defaults: new { controller = "Checkout", action = "ShippingAddress" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutSelectShippingAddress", pattern: $"{lang}/checkout/selectshippingaddress", defaults: new { controller = "Checkout", action = "SelectShippingAddress" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutBillingAddress", pattern: $"{lang}/checkout/billingaddress", defaults: new { controller = "Checkout", action = "BillingAddress" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutSelectBillingAddress", pattern: $"{lang}/checkout/selectbillingaddress", defaults: new { controller = "Checkout", action = "SelectBillingAddress" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutShippingMethod", pattern: $"{lang}/checkout/shippingmethod", defaults: new { controller = "Checkout", action = "ShippingMethod" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutPaymentMethod", pattern: $"{lang}/checkout/paymentmethod", defaults: new { controller = "Checkout", action = "PaymentMethod" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutPaymentInfo", pattern: $"{lang}/checkout/paymentinfo", defaults: new { controller = "Checkout", action = "PaymentInfo" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutConfirm", pattern: $"{lang}/checkout/confirm", defaults: new { controller = "Checkout", action = "Confirm" }); endpointRouteBuilder.MapControllerRoute(name: "CheckoutCompleted", pattern: $"{lang}/checkout/completed/{{orderId:int?}}", defaults: new { controller = "Checkout", action = "Completed" }); //subscribe newsletters (AJAX) endpointRouteBuilder.MapControllerRoute(name: "SubscribeNewsletter", pattern: $"subscribenewsletter", defaults: new { controller = "Newsletter", action = "SubscribeNewsletter" }); //email wishlist endpointRouteBuilder.MapControllerRoute(name: "EmailWishlist", pattern: $"{lang}/emailwishlist", defaults: new { controller = "ShoppingCart", action = "EmailWishlist" }); //login page for checkout as guest endpointRouteBuilder.MapControllerRoute(name: "LoginCheckoutAsGuest", pattern: $"{lang}/login/checkoutasguest", defaults: new { controller = "Customer", action = "Login", checkoutAsGuest = true }); //register result page endpointRouteBuilder.MapControllerRoute(name: "RegisterResult", pattern: $"{lang}/registerresult/{{resultId:min(0)}}", defaults: new { controller = "Customer", action = "RegisterResult" }); //check username availability (AJAX) endpointRouteBuilder.MapControllerRoute(name: "CheckUsernameAvailability", pattern: $"customer/checkusernameavailability", defaults: new { controller = "Customer", action = "CheckUsernameAvailability" }); //passwordrecovery endpointRouteBuilder.MapControllerRoute(name: "PasswordRecovery", pattern: $"{lang}/passwordrecovery", defaults: new { controller = "Customer", action = "PasswordRecovery" }); //password recovery confirmation endpointRouteBuilder.MapControllerRoute(name: "PasswordRecoveryConfirm", pattern: $"{lang}/passwordrecovery/confirm", defaults: new { controller = "Customer", action = "PasswordRecoveryConfirm" }); //topics (AJAX) endpointRouteBuilder.MapControllerRoute(name: "TopicPopup", pattern: $"t-popup/{{SystemName}}", defaults: new { controller = "Topic", action = "TopicDetailsPopup" }); //blog endpointRouteBuilder.MapControllerRoute(name: "BlogByTag", pattern: $"{lang}/blog/tag/{{tag}}", defaults: new { controller = "Blog", action = "BlogByTag" }); endpointRouteBuilder.MapControllerRoute(name: "BlogByMonth", pattern: $"{lang}/blog/month/{{month}}", defaults: new { controller = "Blog", action = "BlogByMonth" }); //blog RSS (file result) endpointRouteBuilder.MapControllerRoute(name: "BlogRSS", pattern: $"blog/rss/{{languageId:min(0)}}", defaults: new { controller = "Blog", action = "ListRss" }); //news RSS (file result) endpointRouteBuilder.MapControllerRoute(name: "NewsRSS", pattern: $"news/rss/{{languageId:min(0)}}", defaults: new { controller = "News", action = "ListRss" }); //set review helpfulness (AJAX) endpointRouteBuilder.MapControllerRoute(name: "SetProductReviewHelpfulness", pattern: $"setproductreviewhelpfulness", defaults: new { controller = "Product", action = "SetProductReviewHelpfulness" }); //customer account links endpointRouteBuilder.MapControllerRoute(name: "CustomerReturnRequests", pattern: $"{lang}/returnrequest/history", defaults: new { controller = "ReturnRequest", action = "CustomerReturnRequests" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerDownloadableProducts", pattern: $"{lang}/customer/downloadableproducts", defaults: new { controller = "Customer", action = "DownloadableProducts" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerBackInStockSubscriptions", pattern: $"{lang}/backinstocksubscriptions/manage/{{pageNumber:int?}}", defaults: new { controller = "BackInStockSubscription", action = "CustomerSubscriptions" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerRewardPoints", pattern: $"{lang}/rewardpoints/history", defaults: new { controller = "Order", action = "CustomerRewardPoints" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerRewardPointsPaged", pattern: $"{lang}/rewardpoints/history/page/{{pageNumber:min(0)}}", defaults: new { controller = "Order", action = "CustomerRewardPoints" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerChangePassword", pattern: $"{lang}/customer/changepassword", defaults: new { controller = "Customer", action = "ChangePassword" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerAvatar", pattern: $"{lang}/customer/avatar", defaults: new { controller = "Customer", action = "Avatar" }); endpointRouteBuilder.MapControllerRoute(name: "AccountActivation", pattern: $"{lang}/customer/activation", defaults: new { controller = "Customer", action = "AccountActivation" }); endpointRouteBuilder.MapControllerRoute(name: "EmailRevalidation", pattern: $"{lang}/customer/revalidateemail", defaults: new { controller = "Customer", action = "EmailRevalidation" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerForumSubscriptions", pattern: $"{lang}/boards/forumsubscriptions/{{pageNumber:int?}}", defaults: new { controller = "Boards", action = "CustomerForumSubscriptions" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerAddressEdit", pattern: $"{lang}/customer/addressedit/{{addressId:min(0)}}", defaults: new { controller = "Customer", action = "AddressEdit" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerAddressAdd", pattern: $"{lang}/customer/addressadd", defaults: new { controller = "Customer", action = "AddressAdd" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerMultiFactorAuthenticationProviderConfig", pattern: $"{lang}/customer/providerconfig", defaults: new { controller = "Customer", action = "ConfigureMultiFactorAuthenticationProvider" }); //customer profile page endpointRouteBuilder.MapControllerRoute(name: "CustomerProfile", pattern: $"{lang}/profile/{{id:min(0)}}", defaults: new { controller = "Profile", action = "Index" }); endpointRouteBuilder.MapControllerRoute(name: "CustomerProfilePaged", pattern: $"{lang}/profile/{{id:min(0)}}/page/{{pageNumber:min(0)}}", defaults: new { controller = "Profile", action = "Index" }); //orders endpointRouteBuilder.MapControllerRoute(name: "OrderDetails", pattern: $"{lang}/orderdetails/{{orderId:min(0)}}", defaults: new { controller = "Order", action = "Details" }); endpointRouteBuilder.MapControllerRoute(name: "ShipmentDetails", pattern: $"{lang}/orderdetails/shipment/{{shipmentId}}", defaults: new { controller = "Order", action = "ShipmentDetails" }); endpointRouteBuilder.MapControllerRoute(name: "ReturnRequest", pattern: $"{lang}/returnrequest/{{orderId:min(0)}}", defaults: new { controller = "ReturnRequest", action = "ReturnRequest" }); endpointRouteBuilder.MapControllerRoute(name: "ReOrder", pattern: $"{lang}/reorder/{{orderId:min(0)}}", defaults: new { controller = "Order", action = "ReOrder" }); //pdf invoice (file result) endpointRouteBuilder.MapControllerRoute(name: "GetOrderPdfInvoice", pattern: $"orderdetails/pdf/{{orderId}}", defaults: new { controller = "Order", action = "GetPdfInvoice" }); endpointRouteBuilder.MapControllerRoute(name: "PrintOrderDetails", pattern: $"{lang}/orderdetails/print/{{orderId}}", defaults: new { controller = "Order", action = "PrintOrderDetails" }); //order downloads (file result) endpointRouteBuilder.MapControllerRoute(name: "GetDownload", pattern: $"download/getdownload/{{orderItemId:guid}}/{{agree?}}", defaults: new { controller = "Download", action = "GetDownload" }); endpointRouteBuilder.MapControllerRoute(name: "GetLicense", pattern: $"download/getlicense/{{orderItemId:guid}}/", defaults: new { controller = "Download", action = "GetLicense" }); endpointRouteBuilder.MapControllerRoute(name: "DownloadUserAgreement", pattern: $"customer/useragreement/{{orderItemId:guid}}", defaults: new { controller = "Customer", action = "UserAgreement" }); endpointRouteBuilder.MapControllerRoute(name: "GetOrderNoteFile", pattern: $"download/ordernotefile/{{ordernoteid:min(0)}}", defaults: new { controller = "Download", action = "GetOrderNoteFile" }); //contact vendor endpointRouteBuilder.MapControllerRoute(name: "ContactVendor", pattern: $"{lang}/contactvendor/{{vendorId}}", defaults: new { controller = "Common", action = "ContactVendor" }); //apply for vendor account endpointRouteBuilder.MapControllerRoute(name: "ApplyVendorAccount", pattern: $"{lang}/vendor/apply", defaults: new { controller = "Vendor", action = "ApplyVendor" }); //vendor info endpointRouteBuilder.MapControllerRoute(name: "CustomerVendorInfo", pattern: $"{lang}/customer/vendorinfo", defaults: new { controller = "Vendor", action = "Info" }); //customer GDPR endpointRouteBuilder.MapControllerRoute(name: "GdprTools", pattern: $"{lang}/customer/gdpr", defaults: new { controller = "Customer", action = "GdprTools" }); //customer check gift card balance endpointRouteBuilder.MapControllerRoute(name: "CheckGiftCardBalance", pattern: $"{lang}/customer/checkgiftcardbalance", defaults: new { controller = "Customer", action = "CheckGiftCardBalance" }); //customer multi-factor authentication settings endpointRouteBuilder.MapControllerRoute(name: "MultiFactorAuthenticationSettings", pattern: $"{lang}/customer/multifactorauthentication", defaults: new { controller = "Customer", action = "MultiFactorAuthentication" }); //poll vote (AJAX) endpointRouteBuilder.MapControllerRoute(name: "PollVote", pattern: $"poll/vote", defaults: new { controller = "Poll", action = "Vote" }); //comparing products endpointRouteBuilder.MapControllerRoute(name: "RemoveProductFromCompareList", pattern: $"{lang}/compareproducts/remove/{{productId}}", defaults: new { controller = "Product", action = "RemoveProductFromCompareList" }); endpointRouteBuilder.MapControllerRoute(name: "ClearCompareList", pattern: $"{lang}/clearcomparelist/", defaults: new { controller = "Product", action = "ClearCompareList" }); //new RSS (file result) endpointRouteBuilder.MapControllerRoute(name: "NewProductsRSS", pattern: $"newproducts/rss", defaults: new { controller = "Catalog", action = "NewProductsRss" }); //get state list by country ID (AJAX) endpointRouteBuilder.MapControllerRoute(name: "GetStatesByCountryId", pattern: $"country/getstatesbycountryid/", defaults: new { controller = "Country", action = "GetStatesByCountryId" }); //EU Cookie law accept button handler (AJAX) endpointRouteBuilder.MapControllerRoute(name: "EuCookieLawAccept", pattern: $"eucookielawaccept", defaults: new { controller = "Common", action = "EuCookieLawAccept" }); //authenticate topic (AJAX) endpointRouteBuilder.MapControllerRoute(name: "TopicAuthenticate", pattern: $"topic/authenticate", defaults: new { controller = "Topic", action = "Authenticate" }); //prepare top menu (AJAX) endpointRouteBuilder.MapControllerRoute(name: "GetCatalogRoot", pattern: $"catalog/getcatalogroot", defaults: new { controller = "Catalog", action = "GetCatalogRoot" }); endpointRouteBuilder.MapControllerRoute(name: "GetCatalogSubCategories", pattern: $"catalog/getcatalogsubcategories", defaults: new { controller = "Catalog", action = "GetCatalogSubCategories" }); //Catalog products (AJAX) endpointRouteBuilder.MapControllerRoute(name: "GetCategoryProducts", pattern: $"category/products/", defaults: new { controller = "Catalog", action = "GetCategoryProducts" }); endpointRouteBuilder.MapControllerRoute(name: "GetManufacturerProducts", pattern: $"manufacturer/products/", defaults: new { controller = "Catalog", action = "GetManufacturerProducts" }); endpointRouteBuilder.MapControllerRoute(name: "GetTagProducts", pattern: $"tag/products", defaults: new { controller = "Catalog", action = "GetTagProducts" }); endpointRouteBuilder.MapControllerRoute(name: "SearchProducts", pattern: "product/search", defaults: new { controller = "Catalog", action = "SearchProducts" }); endpointRouteBuilder.MapControllerRoute(name: "GetVendorProducts", pattern: $"vendor/products", defaults: new { controller = "Catalog", action = "GetVendorProducts" }); endpointRouteBuilder.MapControllerRoute(name: "GetNewProducts", pattern: $"newproducts/products/", defaults: new { controller = "Catalog", action = "GetNewProducts" }); //product combinations (AJAX) endpointRouteBuilder.MapControllerRoute(name: "GetProductCombinations", pattern: $"product/combinations", defaults: new { controller = "Product", action = "GetProductCombinations" }); //product attributes with "upload file" type (AJAX) endpointRouteBuilder.MapControllerRoute(name: "UploadFileProductAttribute", pattern: $"uploadfileproductattribute/{{attributeId:min(0)}}", defaults: new { controller = "ShoppingCart", action = "UploadFileProductAttribute" }); //checkout attributes with "upload file" type (AJAX) endpointRouteBuilder.MapControllerRoute(name: "UploadFileCheckoutAttribute", pattern: $"uploadfilecheckoutattribute/{{attributeId:min(0)}}", defaults: new { controller = "ShoppingCart", action = "UploadFileCheckoutAttribute" }); //attribute change (AJAX) endpointRouteBuilder.MapControllerRoute(name: "ProductDetailsAttributeChange", pattern: $"shoppingcart/productdetails_attributechange/{{productId:min(0)}}/{{validateAttributeConditions}}/{{loadPicture}}", defaults: new { controller = "ShoppingCart", action = "ProductDetails_AttributeChange" }); //return request with "upload file" support (AJAX) endpointRouteBuilder.MapControllerRoute(name: "UploadFileReturnRequest", pattern: $"uploadfilereturnrequest", defaults: new { controller = "ReturnRequest", action = "UploadFileReturnRequest" }); //forums endpointRouteBuilder.MapControllerRoute(name: "ActiveDiscussions", pattern: $"{lang}/boards/activediscussions", defaults: new { controller = "Boards", action = "ActiveDiscussions" }); endpointRouteBuilder.MapControllerRoute(name: "ActiveDiscussionsPaged", pattern: $"{lang}/boards/activediscussions/page/{{pageNumber:int}}", defaults: new { controller = "Boards", action = "ActiveDiscussions" }); //forums RSS (file result) endpointRouteBuilder.MapControllerRoute(name: "ActiveDiscussionsRSS", pattern: $"boards/activediscussionsrss", defaults: new { controller = "Boards", action = "ActiveDiscussionsRSS" }); endpointRouteBuilder.MapControllerRoute(name: "PostEdit", pattern: $"{lang}/boards/postedit/{{id:min(0)}}", defaults: new { controller = "Boards", action = "PostEdit" }); endpointRouteBuilder.MapControllerRoute(name: "PostDelete", pattern: $"{lang}/boards/postdelete/{{id:int?}}", defaults: new { controller = "Boards", action = "PostDelete" }); endpointRouteBuilder.MapControllerRoute(name: "PostCreate", pattern: $"{lang}/boards/postcreate/{{id:min(0)}}", defaults: new { controller = "Boards", action = "PostCreate" }); endpointRouteBuilder.MapControllerRoute(name: "PostCreateQuote", pattern: $"{lang}/boards/postcreate/{{id:min(0)}}/{{quote:min(0)}}", defaults: new { controller = "Boards", action = "PostCreate" }); endpointRouteBuilder.MapControllerRoute(name: "TopicEdit", pattern: $"{lang}/boards/topicedit/{{id:min(0)}}", defaults: new { controller = "Boards", action = "TopicEdit" }); endpointRouteBuilder.MapControllerRoute(name: "TopicDelete", pattern: $"{lang}/boards/topicdelete/{{id:int?}}", defaults: new { controller = "Boards", action = "TopicDelete" }); endpointRouteBuilder.MapControllerRoute(name: "TopicCreate", pattern: $"{lang}/boards/topiccreate/{{id:min(0)}}", defaults: new { controller = "Boards", action = "TopicCreate" }); endpointRouteBuilder.MapControllerRoute(name: "TopicMove", pattern: $"{lang}/boards/topicmove/{{id:min(0)}}", defaults: new { controller = "Boards", action = "TopicMove" }); //topic watch (AJAX) endpointRouteBuilder.MapControllerRoute(name: "TopicWatch", pattern: $"boards/topicwatch/{{id:min(0)}}", defaults: new { controller = "Boards", action = "TopicWatch" }); endpointRouteBuilder.MapControllerRoute(name: "TopicSlug", pattern: $"{lang}/boards/topic/{{id:min(0)}}/{{slug?}}", defaults: new { controller = "Boards", action = "Topic" }); endpointRouteBuilder.MapControllerRoute(name: "TopicSlugPaged", pattern: $"{lang}/boards/topic/{{id:min(0)}}/{{slug?}}/page/{{pageNumber:int}}", defaults: new { controller = "Boards", action = "Topic" }); //forum watch (AJAX) endpointRouteBuilder.MapControllerRoute(name: "ForumWatch", pattern: $"boards/forumwatch/{{id:min(0)}}", defaults: new { controller = "Boards", action = "ForumWatch" }); //forums RSS (file result) endpointRouteBuilder.MapControllerRoute(name: "ForumRSS", pattern: $"boards/forumrss/{{id:min(0)}}", defaults: new { controller = "Boards", action = "ForumRSS" }); endpointRouteBuilder.MapControllerRoute(name: "ForumSlug", pattern: $"{lang}/boards/forum/{{id:min(0)}}/{{slug?}}", defaults: new { controller = "Boards", action = "Forum" }); endpointRouteBuilder.MapControllerRoute(name: "ForumSlugPaged", pattern: $"{lang}/boards/forum/{{id:min(0)}}/{{slug?}}/page/{{pageNumber:int}}", defaults: new { controller = "Boards", action = "Forum" }); endpointRouteBuilder.MapControllerRoute(name: "ForumGroupSlug", pattern: $"{lang}/boards/forumgroup/{{id:min(0)}}/{{slug?}}", defaults: new { controller = "Boards", action = "ForumGroup" }); endpointRouteBuilder.MapControllerRoute(name: "Search", pattern: $"{lang}/boards/search", defaults: new { controller = "Boards", action = "Search" }); //post vote (AJAX) endpointRouteBuilder.MapControllerRoute(name: "PostVote", pattern: "boards/postvote", defaults: new { controller = "Boards", action = "PostVote" }); //private messages endpointRouteBuilder.MapControllerRoute(name: "PrivateMessages", pattern: $"{lang}/privatemessages/{{tab?}}", defaults: new { controller = "PrivateMessages", action = "Index" }); endpointRouteBuilder.MapControllerRoute(name: "PrivateMessagesPaged", pattern: $"{lang}/privatemessages/{{tab?}}/page/{{pageNumber:min(0)}}", defaults: new { controller = "PrivateMessages", action = "Index" }); endpointRouteBuilder.MapControllerRoute(name: "PrivateMessagesInbox", pattern: $"{lang}/inboxupdate", defaults: new { controller = "PrivateMessages", action = "InboxUpdate" }); endpointRouteBuilder.MapControllerRoute(name: "PrivateMessagesSent", pattern: $"{lang}/sentupdate", defaults: new { controller = "PrivateMessages", action = "SentUpdate" }); endpointRouteBuilder.MapControllerRoute(name: "SendPM", pattern: $"{lang}/sendpm/{{toCustomerId:min(0)}}", defaults: new { controller = "PrivateMessages", action = "SendPM" }); endpointRouteBuilder.MapControllerRoute(name: "SendPMReply", pattern: $"{lang}/sendpm/{{toCustomerId:min(0)}}/{{replyToMessageId:min(0)}}", defaults: new { controller = "PrivateMessages", action = "SendPM" }); endpointRouteBuilder.MapControllerRoute(name: "ViewPM", pattern: $"{lang}/viewpm/{{privateMessageId:min(0)}}", defaults: new { controller = "PrivateMessages", action = "ViewPM" }); endpointRouteBuilder.MapControllerRoute(name: "DeletePM", pattern: $"{lang}/deletepm/{{privateMessageId:min(0)}}", defaults: new { controller = "PrivateMessages", action = "DeletePM" }); //activate newsletters endpointRouteBuilder.MapControllerRoute(name: "NewsletterActivation", pattern: $"{lang}/newsletter/subscriptionactivation/{{token:guid}}/{{active}}", defaults: new { controller = "Newsletter", action = "SubscriptionActivation" }); //robots.txt (file result) endpointRouteBuilder.MapControllerRoute(name: "robots.txt", pattern: $"robots.txt", defaults: new { controller = "Common", action = "RobotsTextFile" }); //sitemap endpointRouteBuilder.MapControllerRoute(name: "Sitemap", pattern: $"{lang}/sitemap", defaults: new { controller = "Common", action = "Sitemap" }); //sitemap.xml (file result) endpointRouteBuilder.MapControllerRoute(name: "sitemap.xml", pattern: $"sitemap.xml", defaults: new { controller = "Common", action = "SitemapXml" }); endpointRouteBuilder.MapControllerRoute(name: "sitemap-indexed.xml", pattern: $"sitemap-{{Id:min(0)}}.xml", defaults: new { controller = "Common", action = "SitemapXml" }); //store closed endpointRouteBuilder.MapControllerRoute(name: "StoreClosed", pattern: $"{lang}/storeclosed", defaults: new { controller = "Common", action = "StoreClosed" }); //install endpointRouteBuilder.MapControllerRoute(name: "Installation", pattern: $"{NopInstallationDefaults.InstallPath}", defaults: new { controller = "Install", action = "Index" }); endpointRouteBuilder.MapControllerRoute(name: "InstallationChangeLanguage", pattern: $"{NopInstallationDefaults.InstallPath}/ChangeLanguage/{{language}}", defaults: new { controller = "Install", action = "ChangeLanguage" }); //restart application (AJAX) endpointRouteBuilder.MapControllerRoute(name: "InstallationRestartApplication", pattern: $"{NopInstallationDefaults.InstallPath}/restartapplication", defaults: new { controller = "Install", action = "RestartApplication" }); //page not found endpointRouteBuilder.MapControllerRoute(name: "PageNotFound", pattern: $"{lang}/page-not-found", defaults: new { controller = "Common", action = "PageNotFound" }); //fallback is intended to handle cases when no other endpoint has matched //we use it to invoke [CheckLanguageSeoCode] and give a chance to find a localized route endpointRouteBuilder.MapFallbackToController("FallbackRedirect", "Common"); } #endregion #region Properties /// /// Gets a priority of route provider /// public int Priority => 0; #endregion }