Merge pull request #7129 from umbraco/netcore/feature/AB3736-services-models

Moving most repositories and service interfaces (excluding content based ones)
This commit is contained in:
Shannon Deminick
2019-11-12 17:57:19 +11:00
committed by GitHub
75 changed files with 464 additions and 407 deletions
@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;
using Umbraco.Core.Models.Entities;
namespace Umbraco.Core.Models
@@ -0,0 +1,7 @@
namespace Umbraco.Core.Models
{
public interface IScript : IFile
{
}
}
@@ -0,0 +1,30 @@
using System.Collections.Generic;
using Umbraco.Core.Models.Entities;
namespace Umbraco.Core.Models
{
public interface IStylesheet : IFile, IRememberBeingDirty
{
/// <summary>
/// Returns a list of umbraco back office enabled stylesheet properties
/// </summary>
/// <remarks>
/// An umbraco back office enabled stylesheet property has a special prefix, for example:
///
/// /** umb_name: MyPropertyName */ p { font-size: 1em; }
/// </remarks>
IEnumerable<IStylesheetProperty> Properties { get; }
/// <summary>
/// Adds an Umbraco stylesheet property for use in the back office
/// </summary>
/// <param name="property"></param>
void AddProperty(IStylesheetProperty property);
/// <summary>
/// Removes an Umbraco stylesheet property
/// </summary>
/// <param name="name"></param>
void RemoveProperty(string name);
}
}
@@ -0,0 +1,11 @@
using Umbraco.Core.Models.Entities;
namespace Umbraco.Core.Models
{
public interface IStylesheetProperty : IRememberBeingDirty
{
string Alias { get; set; }
string Name { get; }
string Value { get; set; }
}
}
@@ -0,0 +1,13 @@
namespace Umbraco.Core.Models.Identity
{
public interface IUserLoginInfo
{
/// <summary>
/// Provider for the linked login, i.e. Facebook, Google, etc.
/// </summary>
string LoginProvider { get; set; }
/// <summary>User specific key for the login provider</summary>
string ProviderKey { get; set; }
}
}
+2 -5
View File
@@ -9,7 +9,7 @@ namespace Umbraco.Core.Models
/// </summary>
[Serializable]
[DataContract(IsReference = true)]
public class Script : File
public class Script : File, IScript
{
public Script(string path)
: this(path, (Func<File, string>) null)
@@ -25,9 +25,6 @@ namespace Umbraco.Core.Models
/// <remarks>
/// Overrides the default Entity identity check.
/// </remarks>
public override bool HasIdentity
{
get { return string.IsNullOrEmpty(Path) == false; }
}
public override bool HasIdentity => string.IsNullOrEmpty(Path) == false;
}
}
@@ -13,7 +13,7 @@ namespace Umbraco.Core.Models
/// </summary>
[Serializable]
[DataContract(IsReference = true)]
public class Stylesheet : File
public class Stylesheet : File, IStylesheet
{
public Stylesheet(string path)
: this(path, null)
@@ -120,7 +120,7 @@ namespace Umbraco.Core.Models
/// /** umb_name: MyPropertyName */ p { font-size: 1em; }
/// </remarks>
[IgnoreDataMember]
public IEnumerable<StylesheetProperty> Properties
public IEnumerable<IStylesheetProperty> Properties
{
get { return _properties.Value; }
}
@@ -129,7 +129,7 @@ namespace Umbraco.Core.Models
/// Adds an Umbraco stylesheet property for use in the back office
/// </summary>
/// <param name="property"></param>
public void AddProperty(StylesheetProperty property)
public void AddProperty(IStylesheetProperty property)
{
if (Properties.Any(x => x.Name.InvariantEquals(property.Name)))
{
@@ -12,7 +12,7 @@ namespace Umbraco.Core.Models
/// </remarks>
[Serializable]
[DataContract(IsReference = true)]
public class StylesheetProperty : BeingDirtyBase, IValueObject
public class StylesheetProperty : BeingDirtyBase, IValueObject, IStylesheetProperty
{
private string _alias;
private string _value;
@@ -1,6 +1,5 @@
using System.Collections.Generic;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
using Umbraco.Core.Persistence.Querying;
namespace Umbraco.Core.Persistence.Repositories
@@ -1,12 +1,11 @@
using System.Collections.Generic;
using Microsoft.AspNet.Identity;
using Umbraco.Core.Models.Identity;
namespace Umbraco.Core.Persistence.Repositories
{
public interface IExternalLoginRepository : IReadWriteQueryRepository<int, IIdentityUserLogin>
{
void SaveUserLogins(int memberId, IEnumerable<UserLoginInfo> logins);
void SaveUserLogins(int memberId, IEnumerable<IUserLoginInfo> logins);
void DeleteUserLogins(int memberId);
}
}
@@ -3,11 +3,14 @@ using Umbraco.Core.Models;
namespace Umbraco.Core.Persistence.Repositories
{
public interface IScriptRepository : IReadRepository<string, Script>, IWriteRepository<Script>
public interface IScriptRepository : IReadRepository<string, IScript>, IWriteRepository<IScript>
{
bool ValidateScript(Script script);
bool ValidateScript(IScript script);
Stream GetFileContentStream(string filepath);
void SetFileContent(string filepath, Stream content);
long GetFileSize(string filepath);
void AddFolder(string folderPath);
void DeleteFolder(string folderPath);
}
}
@@ -3,11 +3,14 @@ using Umbraco.Core.Models;
namespace Umbraco.Core.Persistence.Repositories
{
public interface IStylesheetRepository : IReadRepository<string, Stylesheet>, IWriteRepository<Stylesheet>
public interface IStylesheetRepository : IReadRepository<string, IStylesheet>, IWriteRepository<IStylesheet>
{
bool ValidateStylesheet(Stylesheet stylesheet);
bool ValidateStylesheet(IStylesheet stylesheet);
Stream GetFileContentStream(string filepath);
void SetFileContent(string filepath, Stream content);
long GetFileSize(string filepath);
void AddFolder(string folderPath);
void DeleteFolder(string folderPath);
}
}
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq.Expressions;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
using Umbraco.Core.Persistence.Querying;
namespace Umbraco.Core.Persistence.Repositories
@@ -43,7 +42,6 @@ namespace Umbraco.Core.Persistence.Repositories
/// <param name="pageSize"></param>
/// <param name="totalRecords"></param>
/// <param name="orderBy"></param>
/// <param name="customFilter"></param>
/// <param name="orderDirection"></param>
/// <param name="includeUserGroups">
/// A filter to only include user that belong to these user groups
@@ -52,6 +50,7 @@ namespace Umbraco.Core.Persistence.Repositories
/// A filter to only include users that do not belong to these user groups
/// </param>
/// <param name="userState">Optional parameter to filter by specified user state</param>
/// <param name="filter"></param>
/// <returns></returns>
IEnumerable<IUser> GetPagedResultsByQuery(IQuery<IUser> query, long pageIndex, int pageSize, out long totalRecords,
Expression<Func<IUser, object>> orderBy, Direction orderDirection = Direction.Ascending,
@@ -3,7 +3,7 @@ using System.Linq;
namespace Umbraco.Core.Services.Changes
{
internal class TreeChange<TItem>
public class TreeChange<TItem>
{
public TreeChange(TItem changedItem, TreeChangeTypes changeTypes)
{
@@ -4,7 +4,7 @@ namespace Umbraco.Core.Services.Changes
{
public static class TreeChangeExtensions
{
internal static TreeChange<TItem>.EventArgs ToEventArgs<TItem>(this IEnumerable<TreeChange<TItem>> changes)
public static TreeChange<TItem>.EventArgs ToEventArgs<TItem>(this IEnumerable<TreeChange<TItem>> changes)
{
return new TreeChange<TItem>.EventArgs(changes);
}
@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
using Umbraco.Core.Persistence.Querying;
namespace Umbraco.Core.Services
@@ -1,5 +1,4 @@
using System.Collections.Generic;
using Microsoft.AspNet.Identity;
using Umbraco.Core.Models.Identity;
namespace Umbraco.Core.Services
@@ -22,14 +21,14 @@ namespace Umbraco.Core.Services
/// </summary>
/// <param name="login"></param>
/// <returns></returns>
IEnumerable<IIdentityUserLogin> Find(UserLoginInfo login);
IEnumerable<IIdentityUserLogin> Find(IUserLoginInfo login);
/// <summary>
/// Save user logins
/// </summary>
/// <param name="userId"></param>
/// <param name="logins"></param>
void SaveUserLogins(int userId, IEnumerable<UserLoginInfo> logins);
void SaveUserLogins(int userId, IEnumerable<IUserLoginInfo> logins);
/// <summary>
/// Deletes all user logins - normally used when a member is deleted
@@ -24,28 +24,28 @@ namespace Umbraco.Core.Services
bool DeletePartialViewMacro(string path, int userId = Constants.Security.SuperUserId);
Attempt<IPartialView> SavePartialView(IPartialView partialView, int userId = Constants.Security.SuperUserId);
Attempt<IPartialView> SavePartialViewMacro(IPartialView partialView, int userId = Constants.Security.SuperUserId);
bool ValidatePartialView(PartialView partialView);
bool ValidatePartialViewMacro(PartialView partialView);
bool ValidatePartialView(IPartialView partialView);
bool ValidatePartialViewMacro(IPartialView partialView);
/// <summary>
/// Gets a list of all <see cref="Stylesheet"/> objects
/// Gets a list of all <see cref="IStylesheet"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="Stylesheet"/> objects</returns>
IEnumerable<Stylesheet> GetStylesheets(params string[] names);
/// <returns>An enumerable list of <see cref="IStylesheet"/> objects</returns>
IEnumerable<IStylesheet> GetStylesheets(params string[] names);
/// <summary>
/// Gets a <see cref="Stylesheet"/> object by its name
/// Gets a <see cref="IStylesheet"/> object by its name
/// </summary>
/// <param name="name">Name of the stylesheet incl. extension</param>
/// <returns>A <see cref="Stylesheet"/> object</returns>
Stylesheet GetStylesheetByName(string name);
/// <returns>A <see cref="IStylesheet"/> object</returns>
IStylesheet GetStylesheetByName(string name);
/// <summary>
/// Saves a <see cref="Stylesheet"/>
/// Saves a <see cref="IStylesheet"/>
/// </summary>
/// <param name="stylesheet"><see cref="Stylesheet"/> to save</param>
/// <param name="stylesheet"><see cref="IStylesheet"/> to save</param>
/// <param name="userId">Optional id of the user saving the stylesheet</param>
void SaveStylesheet(Stylesheet stylesheet, int userId = Constants.Security.SuperUserId);
void SaveStylesheet(IStylesheet stylesheet, int userId = Constants.Security.SuperUserId);
/// <summary>
/// Deletes a stylesheet by its name
@@ -55,31 +55,31 @@ namespace Umbraco.Core.Services
void DeleteStylesheet(string path, int userId = Constants.Security.SuperUserId);
/// <summary>
/// Validates a <see cref="Stylesheet"/>
/// Validates a <see cref="IStylesheet"/>
/// </summary>
/// <param name="stylesheet"><see cref="Stylesheet"/> to validate</param>
/// <param name="stylesheet"><see cref="IStylesheet"/> to validate</param>
/// <returns>True if Stylesheet is valid, otherwise false</returns>
bool ValidateStylesheet(Stylesheet stylesheet);
bool ValidateStylesheet(IStylesheet stylesheet);
/// <summary>
/// Gets a list of all <see cref="Script"/> objects
/// Gets a list of all <see cref="IScript"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="Script"/> objects</returns>
IEnumerable<Script> GetScripts(params string[] names);
/// <returns>An enumerable list of <see cref="IScript"/> objects</returns>
IEnumerable<IScript> GetScripts(params string[] names);
/// <summary>
/// Gets a <see cref="Script"/> object by its name
/// Gets a <see cref="IScript"/> object by its name
/// </summary>
/// <param name="name">Name of the script incl. extension</param>
/// <returns>A <see cref="Script"/> object</returns>
Script GetScriptByName(string name);
/// <returns>A <see cref="IScript"/> object</returns>
IScript GetScriptByName(string name);
/// <summary>
/// Saves a <see cref="Script"/>
/// </summary>
/// <param name="script"><see cref="Script"/> to save</param>
/// <param name="script"><see cref="IScript"/> to save</param>
/// <param name="userId">Optional id of the user saving the script</param>
void SaveScript(Script script, int userId = Constants.Security.SuperUserId);
void SaveScript(IScript script, int userId = Constants.Security.SuperUserId);
/// <summary>
/// Deletes a script by its name
@@ -89,11 +89,11 @@ namespace Umbraco.Core.Services
void DeleteScript(string path, int userId = Constants.Security.SuperUserId);
/// <summary>
/// Validates a <see cref="Script"/>
/// Validates a <see cref="IScript"/>
/// </summary>
/// <param name="script"><see cref="Script"/> to validate</param>
/// <param name="script"><see cref="IScript"/> to validate</param>
/// <returns>True if Script is valid, otherwise false</returns>
bool ValidateScript(Script script);
bool ValidateScript(IScript script);
/// <summary>
/// Creates a folder for scripts
@@ -213,7 +213,7 @@ namespace Umbraco.Core.Services
/// Validates a <see cref="ITemplate"/>
/// </summary>
/// <param name="template"><see cref="ITemplate"/> to validate</param>
/// <returns>True if Script is valid, otherwise false</returns>
/// <returns>True if template is valid, otherwise false</returns>
bool ValidateTemplate(ITemplate template);
/// <summary>
@@ -104,10 +104,10 @@ namespace Umbraco.Core.Services
ILanguage GetLanguageById(int id);
/// <summary>
/// Gets a <see cref="Language"/> by its iso code
/// Gets a <see cref="ILanguage"/> by its iso code
/// </summary>
/// <param name="isoCode">Iso Code of the language (ie. en-US)</param>
/// <returns><see cref="Language"/></returns>
/// <returns><see cref="ILanguage"/></returns>
ILanguage GetLanguageByIsoCode(string isoCode);
/// <summary>
@@ -0,0 +1,153 @@
using System;
using System.Collections.Generic;
using System.Text;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Persistence.Querying;
namespace Umbraco.Core.Services
{
/// <summary>
/// Defines part of the UserService/MemberService, which is specific to methods used by the membership provider.
/// The generic type is restricted to <see cref="IMembershipUser"/>. The implementation of this interface uses
/// either <see cref="IMember"/> for the MemberService or <see cref="IUser"/> for the UserService.
/// </summary>
/// <remarks>
/// Idea is to have this as an isolated interface so that it can be easily 'replaced' in the membership provider implementation.
/// </remarks>
public interface IMembershipMemberService<T> : IService
where T : class, IMembershipUser
{
/// <summary>
/// Gets the total number of Members or Users based on the count type
/// </summary>
/// <remarks>
/// The way the Online count is done is the same way that it is done in the MS SqlMembershipProvider - We query for any members
/// that have their last active date within the Membership.UserIsOnlineTimeWindow (which is in minutes). It isn't exact science
/// but that is how MS have made theirs so we'll follow that principal.
/// </remarks>
/// <param name="countType"><see cref="MemberCountType"/> to count by</param>
/// <returns><see cref="System.int"/> with number of Members or Users for passed in type</returns>
int GetCount(MemberCountType countType);
/// <summary>
/// Checks if a Member with the username exists
/// </summary>
/// <param name="username">Username to check</param>
/// <returns><c>True</c> if the Member exists otherwise <c>False</c></returns>
bool Exists(string username);
/// <summary>
/// Creates and persists a new <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="username">Username of the <see cref="IMembershipUser"/> to create</param>
/// <param name="email">Email of the <see cref="IMembershipUser"/> to create</param>
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
/// <param name="memberTypeAlias">Alias of the Type</param>
/// <returns><see cref="IMembershipUser"/></returns>
T CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias);
/// <summary>
/// Creates and persists a new <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="username">Username of the <see cref="IMembershipUser"/> to create</param>
/// <param name="email">Email of the <see cref="IMembershipUser"/> to create</param>
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
/// <param name="memberTypeAlias">Alias of the Type</param>
/// <param name="isApproved">IsApproved of the <see cref="IMembershipUser"/> to create</param>
/// <returns><see cref="IMembershipUser"/></returns>
T CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias, bool isApproved);
/// <summary>
/// Gets an <see cref="IMembershipUser"/> by its provider key
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="id">Id to use for retrieval</param>
/// <returns><see cref="IMembershipUser"/></returns>
T GetByProviderKey(object id);
/// <summary>
/// Get an <see cref="IMembershipUser"/> by email
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="email">Email to use for retrieval</param>
/// <returns><see cref="IMembershipUser"/></returns>
T GetByEmail(string email);
/// <summary>
/// Get an <see cref="IMembershipUser"/> by username
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="username">Username to use for retrieval</param>
/// <returns><see cref="IMembershipUser"/></returns>
T GetByUsername(string username);
/// <summary>
/// Deletes an <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="membershipUser"><see cref="IMember"/> or <see cref="IUser"/> to Delete</param>
void Delete(T membershipUser);
/// <summary>
/// Saves an <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="entity"><see cref="IMember"/> or <see cref="IUser"/> to Save</param>
/// <param name="raiseEvents">Optional parameter to raise events.
/// Default is <c>True</c> otherwise set to <c>False</c> to not raise events</param>
void Save(T entity, bool raiseEvents = true);
/// <summary>
/// Saves a list of <see cref="IMembershipUser"/> objects
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="entities"><see cref="IEnumerable{T}"/> to save</param>
/// <param name="raiseEvents">Optional parameter to raise events.
/// Default is <c>True</c> otherwise set to <c>False</c> to not raise events</param>
void Save(IEnumerable<T> entities, bool raiseEvents = true);
/// <summary>
/// Gets the default MemberType alias
/// </summary>
/// <remarks>By default we'll return the 'writer', but we need to check it exists. If it doesn't we'll
/// return the first type that is not an admin, otherwise if there's only one we will return that one.</remarks>
/// <returns>Alias of the default MemberType</returns>
string GetDefaultMemberType();
/// <summary>
/// Finds a list of <see cref="IMembershipUser"/> objects by a partial email string
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="emailStringToMatch">Partial email string to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{T}"/></returns>
IEnumerable<T> FindByEmail(string emailStringToMatch, long pageIndex, int pageSize, out long totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
/// <summary>
/// Finds a list of <see cref="IMembershipUser"/> objects by a partial username
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="login">Partial username to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{T}"/></returns>
IEnumerable<T> FindByUsername(string login, long pageIndex, int pageSize, out long totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
/// <summary>
/// Gets a list of paged <see cref="IMembershipUser"/> objects
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <returns><see cref="IEnumerable{T}"/></returns>
IEnumerable<T> GetAll(long pageIndex, int pageSize, out long totalRecords);
}
}
@@ -1,5 +1,6 @@
using Umbraco.Core.Cache;
using Umbraco.Core.Composing;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
@@ -19,7 +20,8 @@ namespace Umbraco.Core
AppCaches appCaches,
IUmbracoDatabaseFactory databaseFactory,
TypeLoader typeLoader,
IRuntimeState state)
IRuntimeState state,
IIOHelper ioHelper)
{
composition.RegisterUnique(logger);
composition.RegisterUnique(profiler);
@@ -30,6 +32,7 @@ namespace Umbraco.Core
composition.RegisterUnique(factory => factory.GetInstance<IUmbracoDatabaseFactory>().SqlContext);
composition.RegisterUnique(typeLoader);
composition.RegisterUnique(state);
composition.RegisterUnique(ioHelper);
}
}
}
@@ -0,0 +1,28 @@
using Microsoft.AspNet.Identity;
namespace Umbraco.Core.Models.Identity
{
internal class UserLoginInfoWrapper : IUserLoginInfo
{
private readonly UserLoginInfo _info;
public static IUserLoginInfo Wrap(UserLoginInfo info) => new UserLoginInfoWrapper(info);
private UserLoginInfoWrapper(UserLoginInfo info)
{
_info = info;
}
public string LoginProvider
{
get => _info.LoginProvider;
set => _info.LoginProvider = value;
}
public string ProviderKey
{
get => _info.ProviderKey;
set => _info.ProviderKey = value;
}
}
}
@@ -25,7 +25,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
Database.Execute("DELETE FROM ExternalLogins WHERE UserId=@userId", new { userId = memberId });
}
public void SaveUserLogins(int memberId, IEnumerable<UserLoginInfo> logins)
public void SaveUserLogins(int memberId, IEnumerable<IUserLoginInfo> logins)
{
//clear out logins for member
Database.Execute("DELETE FROM umbracoExternalLogin WHERE userId=@userId", new { userId = memberId });
@@ -12,19 +12,19 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
/// <summary>
/// Represents the Script Repository
/// </summary>
internal class ScriptRepository : FileRepository<string, Script>, IScriptRepository
internal class ScriptRepository : FileRepository<string, IScript>, IScriptRepository
{
private readonly IContentSection _contentConfig;
private readonly IIOHelper _ioHelper;
public ScriptRepository(IFileSystems fileSystems, IContentSection contentConfig)
public ScriptRepository(IFileSystems fileSystems, IIOHelper ioHelper)
: base(fileSystems.ScriptsFileSystem)
{
_contentConfig = contentConfig ?? throw new ArgumentNullException(nameof(contentConfig));
_ioHelper = ioHelper ?? throw new ArgumentNullException(nameof(ioHelper));
}
#region Implementation of IRepository<string,Script>
public override Script Get(string id)
public override IScript Get(string id)
{
// get the relative path within the filesystem
// (though... id should be relative already)
@@ -55,16 +55,19 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
return script;
}
public override void Save(Script entity)
public override void Save(IScript entity)
{
base.Save(entity);
// TODO: Casting :/ Review GetFileContent and it's usages, need to look into it later
var script = (Script) entity;
base.Save(script);
// ensure that from now on, content is lazy-loaded
if (entity.GetFileContent == null)
entity.GetFileContent = file => GetFileContent(file.OriginalPath);
if (script.GetFileContent == null)
script.GetFileContent = file => GetFileContent(file.OriginalPath);
}
public override IEnumerable<Script> GetMany(params string[] ids)
public override IEnumerable<IScript> GetMany(params string[] ids)
{
//ensure they are de-duplicated, easy win if people don't do this as this can cause many excess queries
ids = ids.Distinct().ToArray();
@@ -86,7 +89,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
}
public bool ValidateScript(Script script)
public bool ValidateScript(IScript script)
{
// get full path
string fullPath;
@@ -102,9 +105,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
// validate path & extension
var validDir = SystemDirectories.Scripts;
var isValidPath = Current.IOHelper.VerifyEditPath(fullPath, validDir);
var isValidPath = _ioHelper.VerifyEditPath(fullPath, validDir);
var validExts = new[] {"js"};
var isValidExtension = Current.IOHelper.VerifyFileExtension(script.Path, validExts);
var isValidExtension = _ioHelper.VerifyFileExtension(script.Path, validExts);
return isValidPath && isValidExtension;
}
@@ -10,15 +10,19 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
/// <summary>
/// Represents the Stylesheet Repository
/// </summary>
internal class StylesheetRepository : FileRepository<string, Stylesheet>, IStylesheetRepository
internal class StylesheetRepository : FileRepository<string, IStylesheet>, IStylesheetRepository
{
public StylesheetRepository(IFileSystems fileSystems)
private readonly IIOHelper _ioHelper;
public StylesheetRepository(IFileSystems fileSystems, IIOHelper ioHelper)
: base(fileSystems.StylesheetsFileSystem)
{ }
{
_ioHelper = ioHelper;
}
#region Overrides of FileRepository<string,Stylesheet>
public override Stylesheet Get(string id)
public override IStylesheet Get(string id)
{
// get the relative path within the filesystem
// (though... id should be relative already)
@@ -51,16 +55,19 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
public override void Save(Stylesheet entity)
public override void Save(IStylesheet entity)
{
base.Save(entity);
// TODO: Casting :/ Review GetFileContent and it's usages, need to look into it later
var stylesheet = (Stylesheet)entity;
base.Save(stylesheet);
// ensure that from now on, content is lazy-loaded
if (entity.GetFileContent == null)
entity.GetFileContent = file => GetFileContent(file.OriginalPath);
if (stylesheet.GetFileContent == null)
stylesheet.GetFileContent = file => GetFileContent(file.OriginalPath);
}
public override IEnumerable<Stylesheet> GetMany(params string[] ids)
public override IEnumerable<IStylesheet> GetMany(params string[] ids)
{
//ensure they are de-duplicated, easy win if people don't do this as this can cause many excess queries
ids = ids
@@ -92,14 +99,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
/// If null or not specified, will return the stylesheets at the root path relative to the IFileSystem
/// </param>
/// <returns></returns>
public IEnumerable<Stylesheet> GetStylesheetsAtPath(string rootPath = null)
public IEnumerable<IStylesheet> GetStylesheetsAtPath(string rootPath = null)
{
return FileSystem.GetFiles(rootPath ?? string.Empty, "*.css").Select(Get);
}
private static readonly List<string> ValidExtensions = new List<string> { "css" };
public bool ValidateStylesheet(Stylesheet stylesheet)
public bool ValidateStylesheet(IStylesheet stylesheet)
{
// get full path
string fullPath;
@@ -115,8 +122,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
// validate path and extension
var validDir = SystemDirectories.Css;
var isValidPath = Current.IOHelper.VerifyEditPath(fullPath, validDir);
var isValidExtension = Current.IOHelper.VerifyFileExtension(stylesheet.Path, ValidExtensions);
var isValidPath = _ioHelper.VerifyEditPath(fullPath, validDir);
var isValidExtension = _ioHelper.VerifyFileExtension(stylesheet.Path, ValidExtensions);
return isValidPath && isValidExtension;
}
+18 -2
View File
@@ -42,6 +42,11 @@ namespace Umbraco.Core.Runtime
/// </summary>
protected IProfilingLogger ProfilingLogger { get; private set; }
/// <summary>
/// Gets the <see cref="IIOHelper"/>
/// </summary>
protected IIOHelper IOHelper { get; private set; }
/// <inheritdoc />
public IRuntimeState State => _state;
@@ -56,6 +61,10 @@ namespace Umbraco.Core.Runtime
var profiler = Profiler = GetProfiler();
var profilingLogger = ProfilingLogger = new ProfilingLogger(logger, profiler);
IOHelper = GetIOHelper();
if (IOHelper == null)
throw new InvalidOperationException($"The object returned from {nameof(GetIOHelper)} cannot be null");
// the boot loader boots using a container scope, so anything that is PerScope will
// be disposed after the boot loader has booted, and anything else will remain.
// note that this REQUIRES that perWebRequestScope has NOT been enabled yet, else
@@ -128,9 +137,9 @@ namespace Umbraco.Core.Runtime
// main dom
var mainDom = new MainDom(Logger);
// create the composition
// create the composition
composition = new Composition(register, typeLoader, ProfilingLogger, _state, configs);
composition.RegisterEssentials(Logger, Profiler, ProfilingLogger, mainDom, appCaches, databaseFactory, typeLoader, _state);
composition.RegisterEssentials(Logger, Profiler, ProfilingLogger, mainDom, appCaches, databaseFactory, typeLoader, _state, IOHelper);
// run handlers
RuntimeOptions.DoRuntimeEssentials(composition, appCaches, typeLoader, databaseFactory);
@@ -313,6 +322,13 @@ namespace Umbraco.Core.Runtime
protected virtual IProfiler GetProfiler()
=> new LogProfiler(Logger);
/// <summary>
/// Gets a <see cref="IIOHelper"/>
/// </summary>
/// <returns></returns>
protected virtual IIOHelper GetIOHelper()
=> new Umbraco.Core.IO.IOHelper();
/// <summary>
/// Gets the application caches.
/// </summary>
@@ -141,7 +141,7 @@ namespace Umbraco.Core.Security
if (isLoginsPropertyDirty)
{
var logins = await GetLoginsAsync(user);
_externalLoginService.SaveUserLogins(found.Id, logins);
_externalLoginService.SaveUserLogins(found.Id, logins.Select(UserLoginInfoWrapper.Wrap));
}
}
}
@@ -382,7 +382,7 @@ namespace Umbraco.Core.Security
if (login == null) throw new ArgumentNullException("login");
//get all logins associated with the login id
var result = _externalLoginService.Find(login).ToArray();
var result = _externalLoginService.Find(UserLoginInfoWrapper.Wrap(login)).ToArray();
if (result.Any())
{
//return the first user that matches the result
@@ -3,7 +3,7 @@ using Umbraco.Core.Models;
namespace Umbraco.Core.Services.Changes
{
internal static class ContentTypeChangeExtensions
public static class ContentTypeChangeExtensions
{
public static ContentTypeChange<TItem>.EventArgs ToEventArgs<TItem>(this IEnumerable<ContentTypeChange<TItem>> changes)
where TItem : class, IContentTypeComposition
@@ -23,148 +23,5 @@ namespace Umbraco.Core.Services
IMember CreateMemberWithIdentity(string username, string email, IMemberType memberType);
}
/// <summary>
/// Defines part of the UserService/MemberService, which is specific to methods used by the membership provider.
/// The generic type is restricted to <see cref="IMembershipUser"/>. The implementation of this interface uses
/// either <see cref="IMember"/> for the MemberService or <see cref="IUser"/> for the UserService.
/// </summary>
/// <remarks>
/// Idea is to have this as an isolated interface so that it can be easily 'replaced' in the membership provider implementation.
/// </remarks>
public interface IMembershipMemberService<T> : IService
where T : class, IMembershipUser
{
/// <summary>
/// Gets the total number of Members or Users based on the count type
/// </summary>
/// <remarks>
/// The way the Online count is done is the same way that it is done in the MS SqlMembershipProvider - We query for any members
/// that have their last active date within the Membership.UserIsOnlineTimeWindow (which is in minutes). It isn't exact science
/// but that is how MS have made theirs so we'll follow that principal.
/// </remarks>
/// <param name="countType"><see cref="MemberCountType"/> to count by</param>
/// <returns><see cref="System.int"/> with number of Members or Users for passed in type</returns>
int GetCount(MemberCountType countType);
/// <summary>
/// Checks if a Member with the username exists
/// </summary>
/// <param name="username">Username to check</param>
/// <returns><c>True</c> if the Member exists otherwise <c>False</c></returns>
bool Exists(string username);
/// <summary>
/// Creates and persists a new <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="username">Username of the <see cref="IMembershipUser"/> to create</param>
/// <param name="email">Email of the <see cref="IMembershipUser"/> to create</param>
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
/// <param name="memberTypeAlias">Alias of the Type</param>
/// <returns><see cref="IMembershipUser"/></returns>
T CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias);
/// <summary>
/// Creates and persists a new <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="username">Username of the <see cref="IMembershipUser"/> to create</param>
/// <param name="email">Email of the <see cref="IMembershipUser"/> to create</param>
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
/// <param name="memberTypeAlias">Alias of the Type</param>
/// <param name="isApproved">IsApproved of the <see cref="IMembershipUser"/> to create</param>
/// <returns><see cref="IMembershipUser"/></returns>
T CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias, bool isApproved);
/// <summary>
/// Gets an <see cref="IMembershipUser"/> by its provider key
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="id">Id to use for retrieval</param>
/// <returns><see cref="IMembershipUser"/></returns>
T GetByProviderKey(object id);
/// <summary>
/// Get an <see cref="IMembershipUser"/> by email
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="email">Email to use for retrieval</param>
/// <returns><see cref="IMembershipUser"/></returns>
T GetByEmail(string email);
/// <summary>
/// Get an <see cref="IMembershipUser"/> by username
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="username">Username to use for retrieval</param>
/// <returns><see cref="IMembershipUser"/></returns>
T GetByUsername(string username);
/// <summary>
/// Deletes an <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="membershipUser"><see cref="IMember"/> or <see cref="IUser"/> to Delete</param>
void Delete(T membershipUser);
/// <summary>
/// Saves an <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="entity"><see cref="IMember"/> or <see cref="IUser"/> to Save</param>
/// <param name="raiseEvents">Optional parameter to raise events.
/// Default is <c>True</c> otherwise set to <c>False</c> to not raise events</param>
void Save(T entity, bool raiseEvents = true);
/// <summary>
/// Saves a list of <see cref="IMembershipUser"/> objects
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="entities"><see cref="IEnumerable{T}"/> to save</param>
/// <param name="raiseEvents">Optional parameter to raise events.
/// Default is <c>True</c> otherwise set to <c>False</c> to not raise events</param>
void Save(IEnumerable<T> entities, bool raiseEvents = true);
/// <summary>
/// Gets the default MemberType alias
/// </summary>
/// <remarks>By default we'll return the 'writer', but we need to check it exists. If it doesn't we'll
/// return the first type that is not an admin, otherwise if there's only one we will return that one.</remarks>
/// <returns>Alias of the default MemberType</returns>
string GetDefaultMemberType();
/// <summary>
/// Finds a list of <see cref="IMembershipUser"/> objects by a partial email string
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="emailStringToMatch">Partial email string to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{T}"/></returns>
IEnumerable<T> FindByEmail(string emailStringToMatch, long pageIndex, int pageSize, out long totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
/// <summary>
/// Finds a list of <see cref="IMembershipUser"/> objects by a partial username
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="login">Partial username to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{T}"/></returns>
IEnumerable<T> FindByUsername(string login, long pageIndex, int pageSize, out long totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
/// <summary>
/// Gets a list of paged <see cref="IMembershipUser"/> objects
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <returns><see cref="IEnumerable{T}"/></returns>
IEnumerable<T> GetAll(long pageIndex, int pageSize, out long totalRecords);
}
}
@@ -19,7 +19,7 @@ namespace Umbraco.Core.Services
/// <param name="operatingUser"></param>
/// <param name="action"></param>
/// <param name="actionName"></param>
/// <param name="http"></param>
/// <param name="siteUri"></param>
/// <param name="createSubject"></param>
/// <param name="createBody"></param>
void SendNotifications(IUser operatingUser, IEnumerable<IContent> entities, string action, string actionName, Uri siteUri,
@@ -40,7 +40,7 @@ namespace Umbraco.Core.Services.Implement
/// </summary>
/// <param name="login"></param>
/// <returns></returns>
public IEnumerable<IIdentityUserLogin> Find(UserLoginInfo login)
public IEnumerable<IIdentityUserLogin> Find(IUserLoginInfo login)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
@@ -54,7 +54,7 @@ namespace Umbraco.Core.Services.Implement
/// </summary>
/// <param name="userId"></param>
/// <param name="logins"></param>
public void SaveUserLogins(int userId, IEnumerable<UserLoginInfo> logins)
public void SaveUserLogins(int userId, IEnumerable<IUserLoginInfo> logins)
{
using (var scope = ScopeProvider.CreateScope())
{
@@ -45,11 +45,8 @@ namespace Umbraco.Core.Services.Implement
#region Stylesheets
/// <summary>
/// Gets a list of all <see cref="Stylesheet"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="Stylesheet"/> objects</returns>
public IEnumerable<Stylesheet> GetStylesheets(params string[] names)
/// <inheritdoc />
public IEnumerable<IStylesheet> GetStylesheets(params string[] names)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
@@ -57,12 +54,8 @@ namespace Umbraco.Core.Services.Implement
}
}
/// <summary>
/// Gets a <see cref="Stylesheet"/> object by its name
/// </summary>
/// <param name="name">Name of the stylesheet incl. extension</param>
/// <returns>A <see cref="Stylesheet"/> object</returns>
public Stylesheet GetStylesheetByName(string name)
/// <inheritdoc />
public IStylesheet GetStylesheetByName(string name)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
@@ -70,16 +63,12 @@ namespace Umbraco.Core.Services.Implement
}
}
/// <summary>
/// Saves a <see cref="Stylesheet"/>
/// </summary>
/// <param name="stylesheet"><see cref="Stylesheet"/> to save</param>
/// <param name="userId"></param>
public void SaveStylesheet(Stylesheet stylesheet, int userId = Constants.Security.SuperUserId)
/// <inheritdoc />
public void SaveStylesheet(IStylesheet stylesheet, int userId = Constants.Security.SuperUserId)
{
using (var scope = ScopeProvider.CreateScope())
{
var saveEventArgs = new SaveEventArgs<Stylesheet>(stylesheet);
var saveEventArgs = new SaveEventArgs<IStylesheet>(stylesheet);
if (scope.Events.DispatchCancelable(SavingStylesheet, this, saveEventArgs))
{
scope.Complete();
@@ -91,16 +80,12 @@ namespace Umbraco.Core.Services.Implement
saveEventArgs.CanCancel = false;
scope.Events.Dispatch(SavedStylesheet, this, saveEventArgs);
Audit(AuditType.Save, userId, -1, ObjectTypes.GetName(UmbracoObjectTypes.Stylesheet));
Audit(AuditType.Save, userId, -1, UmbracoObjectTypes.Stylesheet.GetName());
scope.Complete();
}
}
/// <summary>
/// Deletes a stylesheet by its name
/// </summary>
/// <param name="path">Name incl. extension of the Stylesheet to delete</param>
/// <param name="userId"></param>
/// <inheritdoc />
public void DeleteStylesheet(string path, int userId = Constants.Security.SuperUserId)
{
using (var scope = ScopeProvider.CreateScope())
@@ -112,7 +97,7 @@ namespace Umbraco.Core.Services.Implement
return;
}
var deleteEventArgs = new DeleteEventArgs<Stylesheet>(stylesheet);
var deleteEventArgs = new DeleteEventArgs<IStylesheet>(stylesheet);
if (scope.Events.DispatchCancelable(DeletingStylesheet, this, deleteEventArgs))
{
scope.Complete();
@@ -123,17 +108,13 @@ namespace Umbraco.Core.Services.Implement
deleteEventArgs.CanCancel = false;
scope.Events.Dispatch(DeletedStylesheet, this, deleteEventArgs);
Audit(AuditType.Delete, userId, -1, ObjectTypes.GetName(UmbracoObjectTypes.Stylesheet));
Audit(AuditType.Delete, userId, -1, UmbracoObjectTypes.Stylesheet.GetName());
scope.Complete();
}
}
/// <summary>
/// Validates a <see cref="Stylesheet"/>
/// </summary>
/// <param name="stylesheet"><see cref="Stylesheet"/> to validate</param>
/// <returns>True if Stylesheet is valid, otherwise false</returns>
public bool ValidateStylesheet(Stylesheet stylesheet)
/// <inheritdoc />
public bool ValidateStylesheet(IStylesheet stylesheet)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
@@ -145,7 +126,7 @@ namespace Umbraco.Core.Services.Implement
{
using (var scope = ScopeProvider.CreateScope())
{
((StylesheetRepository) _stylesheetRepository).AddFolder(folderPath);
_stylesheetRepository.AddFolder(folderPath);
scope.Complete();
}
}
@@ -154,7 +135,7 @@ namespace Umbraco.Core.Services.Implement
{
using (var scope = ScopeProvider.CreateScope())
{
((StylesheetRepository) _stylesheetRepository).DeleteFolder(folderPath);
_stylesheetRepository.DeleteFolder(folderPath);
scope.Complete();
}
}
@@ -188,11 +169,8 @@ namespace Umbraco.Core.Services.Implement
#region Scripts
/// <summary>
/// Gets a list of all <see cref="Script"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="Script"/> objects</returns>
public IEnumerable<Script> GetScripts(params string[] names)
/// <inheritdoc />
public IEnumerable<IScript> GetScripts(params string[] names)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
@@ -200,12 +178,8 @@ namespace Umbraco.Core.Services.Implement
}
}
/// <summary>
/// Gets a <see cref="Script"/> object by its name
/// </summary>
/// <param name="name">Name of the script incl. extension</param>
/// <returns>A <see cref="Script"/> object</returns>
public Script GetScriptByName(string name)
/// <inheritdoc />
public IScript GetScriptByName(string name)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
@@ -213,16 +187,12 @@ namespace Umbraco.Core.Services.Implement
}
}
/// <summary>
/// Saves a <see cref="Script"/>
/// </summary>
/// <param name="script"><see cref="Script"/> to save</param>
/// <param name="userId"></param>
public void SaveScript(Script script, int userId = Constants.Security.SuperUserId)
/// <inheritdoc />
public void SaveScript(IScript script, int userId = Constants.Security.SuperUserId)
{
using (var scope = ScopeProvider.CreateScope())
{
var saveEventArgs = new SaveEventArgs<Script>(script);
var saveEventArgs = new SaveEventArgs<IScript>(script);
if (scope.Events.DispatchCancelable(SavingScript, this, saveEventArgs))
{
scope.Complete();
@@ -238,11 +208,7 @@ namespace Umbraco.Core.Services.Implement
}
}
/// <summary>
/// Deletes a script by its name
/// </summary>
/// <param name="path">Name incl. extension of the Script to delete</param>
/// <param name="userId"></param>
/// <inheritdoc />
public void DeleteScript(string path, int userId = Constants.Security.SuperUserId)
{
using (var scope = ScopeProvider.CreateScope())
@@ -254,7 +220,7 @@ namespace Umbraco.Core.Services.Implement
return;
}
var deleteEventArgs = new DeleteEventArgs<Script>(script);
var deleteEventArgs = new DeleteEventArgs<IScript>(script);
if (scope.Events.DispatchCancelable(DeletingScript, this, deleteEventArgs))
{
scope.Complete();
@@ -270,12 +236,8 @@ namespace Umbraco.Core.Services.Implement
}
}
/// <summary>
/// Validates a <see cref="Script"/>
/// </summary>
/// <param name="script"><see cref="Script"/> to validate</param>
/// <returns>True if Script is valid, otherwise false</returns>
public bool ValidateScript(Script script)
/// <inheritdoc />
public bool ValidateScript(IScript script)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
@@ -287,7 +249,7 @@ namespace Umbraco.Core.Services.Implement
{
using (var scope = ScopeProvider.CreateScope())
{
((ScriptRepository) _scriptRepository).AddFolder(folderPath);
_scriptRepository.AddFolder(folderPath);
scope.Complete();
}
}
@@ -296,7 +258,7 @@ namespace Umbraco.Core.Services.Implement
{
using (var scope = ScopeProvider.CreateScope())
{
((ScriptRepository) _scriptRepository).DeleteFolder(folderPath);
_scriptRepository.DeleteFolder(folderPath);
scope.Complete();
}
}
@@ -578,7 +540,7 @@ namespace Umbraco.Core.Services.Implement
scope.Events.Dispatch(SavedTemplate, this, new SaveEventArgs<ITemplate>(template, false));
Audit(AuditType.Save, userId, template.Id, ObjectTypes.GetName(UmbracoObjectTypes.Template));
Audit(AuditType.Save, userId, template.Id, UmbracoObjectTypes.Template.GetName());
scope.Complete();
}
}
@@ -604,7 +566,7 @@ namespace Umbraco.Core.Services.Implement
scope.Events.Dispatch(SavedTemplate, this, new SaveEventArgs<ITemplate>(templatesA, false));
Audit(AuditType.Save, userId, -1, ObjectTypes.GetName(UmbracoObjectTypes.Template));
Audit(AuditType.Save, userId, -1, UmbracoObjectTypes.Template.GetName());
scope.Complete();
}
}
@@ -907,7 +869,7 @@ namespace Umbraco.Core.Services.Implement
return Attempt.Succeed(partialView);
}
public bool ValidatePartialView(PartialView partialView)
public bool ValidatePartialView(IPartialView partialView)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
@@ -915,7 +877,7 @@ namespace Umbraco.Core.Services.Implement
}
}
public bool ValidatePartialViewMacro(PartialView partialView)
public bool ValidatePartialViewMacro(IPartialView partialView)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
@@ -1106,22 +1068,22 @@ namespace Umbraco.Core.Services.Implement
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Script>> DeletingScript;
public static event TypedEventHandler<IFileService, DeleteEventArgs<IScript>> DeletingScript;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Script>> DeletedScript;
public static event TypedEventHandler<IFileService, DeleteEventArgs<IScript>> DeletedScript;
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Stylesheet>> DeletingStylesheet;
public static event TypedEventHandler<IFileService, DeleteEventArgs<IStylesheet>> DeletingStylesheet;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Stylesheet>> DeletedStylesheet;
public static event TypedEventHandler<IFileService, DeleteEventArgs<IStylesheet>> DeletedStylesheet;
/// <summary>
/// Occurs before Save
@@ -1136,22 +1098,22 @@ namespace Umbraco.Core.Services.Implement
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Script>> SavingScript;
public static event TypedEventHandler<IFileService, SaveEventArgs<IScript>> SavingScript;
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Script>> SavedScript;
public static event TypedEventHandler<IFileService, SaveEventArgs<IScript>> SavedScript;
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Stylesheet>> SavingStylesheet;
public static event TypedEventHandler<IFileService, SaveEventArgs<IStylesheet>> SavingStylesheet;
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Stylesheet>> SavedStylesheet;
public static event TypedEventHandler<IFileService, SaveEventArgs<IStylesheet>> SavedStylesheet;
/// <summary>
/// Occurs before Save
@@ -1252,7 +1252,7 @@ namespace Umbraco.Core.Services.Implement
/// <summary>
/// Occurs after change.
/// </summary>
internal static event TypedEventHandler<IMediaService, TreeChange<IMedia>.EventArgs> TreeChanged;
public static event TypedEventHandler<IMediaService, TreeChange<IMedia>.EventArgs> TreeChanged;
#endregion
@@ -28,14 +28,13 @@ namespace Umbraco.Core.Services.Implement
private readonly IAuditRepository _auditRepository;
private readonly IMemberGroupService _memberGroupService;
private readonly IMediaFileSystem _mediaFileSystem;
//only for unit tests!
internal MembershipProviderBase MembershipProvider { get; set; }
#region Constructor
public MemberService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IMemberGroupService memberGroupService, IMediaFileSystem mediaFileSystem,
public MemberService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IMemberGroupService memberGroupService,
IMemberRepository memberRepository, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository, IAuditRepository auditRepository)
: base(provider, logger, eventMessagesFactory)
{
@@ -44,7 +43,6 @@ namespace Umbraco.Core.Services.Implement
_memberGroupRepository = memberGroupRepository;
_auditRepository = auditRepository;
_memberGroupService = memberGroupService ?? throw new ArgumentNullException(nameof(memberGroupService));
_mediaFileSystem = mediaFileSystem ?? throw new ArgumentNullException(nameof(mediaFileSystem));
}
#endregion
+3 -45
View File
@@ -234,6 +234,7 @@
<Compile Include="Models\IDataType.cs" />
<Compile Include="Models\IDataValueEditor.cs" />
<Compile Include="Models\Identity\IdentityMapDefinition.cs" />
<Compile Include="Models\Identity\UserLoginInfoWrapper.cs" />
<Compile Include="Models\IMedia.cs" />
<Compile Include="Models\IMediaType.cs" />
<Compile Include="Models\IMember.cs" />
@@ -293,13 +294,10 @@
<Compile Include="Serialization\JsonNetSerializer.cs" />
<Compile Include="Services\Changes\ContentTypeChange.cs" />
<Compile Include="Services\Changes\ContentTypeChangeExtensions.cs" />
<Compile Include="Services\Changes\TreeChange.cs" />
<Compile Include="Services\Changes\TreeChangeExtensions.cs" />
<Compile Include="Services\IDataTypeService.cs" />
<Compile Include="Services\IEntityService.cs" />
<Compile Include="Services\IFileService.cs" />
<Compile Include="Services\ILocalizationService.cs" />
<Compile Include="Services\IMacroService.cs" />
<Compile Include="Services\IMembershipMemberService.cs" />
<Compile Include="Services\INotificationService.cs" />
<Compile Include="Services\IPackagingService.cs" />
<Compile Include="Services\LocalizedTextServiceExtensions.cs" />
<Compile Include="Services\DateTypeServiceExtensions.cs" />
@@ -470,8 +468,6 @@
<Compile Include="Persistence\Mappers\AuditItemMapper.cs" />
<Compile Include="Persistence\Mappers\ConsentMapper.cs" />
<Compile Include="Persistence\Mappers\SimpleContentTypeMapper.cs" />
<Compile Include="Persistence\Repositories\IAuditEntryRepository.cs" />
<Compile Include="Persistence\Repositories\IConsentRepository.cs" />
<Compile Include="Persistence\Repositories\Implement\AuditEntryRepository.cs" />
<Compile Include="Persistence\Repositories\Implement\ConsentRepository.cs" />
<Compile Include="Persistence\SqlContextExtensions.cs" />
@@ -583,7 +579,6 @@
<Compile Include="Models\DictionaryItem.cs" />
<Compile Include="Models\DictionaryItemExtensions.cs" />
<Compile Include="Models\DictionaryTranslation.cs" />
<Compile Include="Models\EntityContainer.cs" />
<Compile Include="Models\EntityExtensions.cs" />
<Compile Include="Models\GridValue.cs" />
<Compile Include="Models\Identity\BackOfficeIdentityUser.cs" />
@@ -737,7 +732,6 @@
<Compile Include="Persistence\FaultHandling\Strategies\NetworkConnectivityErrorDetectionStrategy.cs" />
<Compile Include="Persistence\FaultHandling\Strategies\SqlAzureTransientErrorDetectionStrategy.cs" />
<Compile Include="Persistence\FaultHandling\ThrottlingCondition.cs" />
<Compile Include="Persistence\IReadWriteQueryRepository.cs" />
<Compile Include="Persistence\ISqlContext.cs" />
<Compile Include="Persistence\IUmbracoDatabase.cs" />
<Compile Include="Persistence\IUmbracoDatabaseFactory.cs" />
@@ -891,14 +885,12 @@
<Compile Include="Persistence\PocoDataDataReader.cs" />
<Compile Include="Persistence\Querying\CachedExpression.cs" />
<Compile Include="Persistence\Querying\ExpressionVisitorBase.cs" />
<Compile Include="Persistence\Querying\IQuery.cs" />
<Compile Include="Persistence\Querying\ModelToSqlExpressionVisitor.cs" />
<Compile Include="Persistence\Querying\PocoToSqlExpressionVisitor.cs" />
<Compile Include="Persistence\Querying\Query.cs" />
<Compile Include="Persistence\Querying\QueryExtensions.cs" />
<Compile Include="Persistence\Querying\SqlExpressionExtensions.cs" />
<Compile Include="Persistence\Querying\SqlTranslator.cs" />
<Compile Include="Persistence\Querying\StringPropertyMatchType.cs" />
<Compile Include="Persistence\Querying\TextColumnType.cs" />
<Compile Include="Persistence\Querying\ValuePropertyMatchType.cs" />
<Compile Include="Persistence\RecordPersistenceType.cs" />
@@ -916,46 +908,18 @@
<Compile Include="Persistence\Repositories\Implement\EntityRepository.cs" />
<Compile Include="Persistence\Repositories\Implement\ExternalLoginRepository.cs" />
<Compile Include="Persistence\Repositories\Implement\FileRepository.cs" />
<Compile Include="Persistence\Repositories\IAuditRepository.cs" />
<Compile Include="Persistence\Repositories\IDocumentBlueprintRepository.cs" />
<Compile Include="Persistence\Repositories\IDocumentRepository.cs" />
<Compile Include="Persistence\Repositories\IContentTypeRepository.cs" />
<Compile Include="Persistence\Repositories\IContentTypeRepositoryBase.cs" />
<Compile Include="Persistence\Repositories\IDataTypeContainerRepository.cs" />
<Compile Include="Persistence\Repositories\IDataTypeRepository.cs" />
<Compile Include="Persistence\Repositories\IDictionaryRepository.cs" />
<Compile Include="Persistence\Repositories\IDocumentTypeContainerRepository.cs" />
<Compile Include="Persistence\Repositories\IDomainRepository.cs" />
<Compile Include="Persistence\Repositories\IEntityContainerRepository.cs" />
<Compile Include="Persistence\Repositories\IEntityRepository.cs" />
<Compile Include="Persistence\Repositories\IExternalLoginRepository.cs" />
<Compile Include="Persistence\Repositories\ILanguageRepository.cs" />
<Compile Include="Persistence\Repositories\IMacroRepository.cs" />
<Compile Include="Persistence\Repositories\IMediaRepository.cs" />
<Compile Include="Persistence\Repositories\IMediaTypeContainerRepository.cs" />
<Compile Include="Persistence\Repositories\IMediaTypeRepository.cs" />
<Compile Include="Persistence\Repositories\IMemberGroupRepository.cs" />
<Compile Include="Persistence\Repositories\IMemberRepository.cs" />
<Compile Include="Persistence\Repositories\IMemberTypeRepository.cs" />
<Compile Include="Persistence\Repositories\INotificationsRepository.cs" />
<Compile Include="Persistence\Repositories\IPartialViewMacroRepository.cs" />
<Compile Include="Persistence\Repositories\IPartialViewRepository.cs" />
<Compile Include="Persistence\Repositories\IPublicAccessRepository.cs" />
<Compile Include="Persistence\IQueryRepository.cs" />
<Compile Include="Persistence\IReadRepository.cs" />
<Compile Include="Persistence\Repositories\IRedirectUrlRepository.cs" />
<Compile Include="Persistence\Repositories\IRelationRepository.cs" />
<Compile Include="Persistence\Repositories\IRelationTypeRepository.cs" />
<Compile Include="Persistence\IRepository.cs" />
<Compile Include="Persistence\Repositories\IContentRepository.cs" />
<Compile Include="Persistence\Repositories\IScriptRepository.cs" />
<Compile Include="Persistence\Repositories\IServerRegistrationRepository.cs" />
<Compile Include="Persistence\Repositories\IStylesheetRepository.cs" />
<Compile Include="Persistence\Repositories\ITagRepository.cs" />
<Compile Include="Persistence\Repositories\ITemplateRepository.cs" />
<Compile Include="Persistence\Repositories\IUserGroupRepository.cs" />
<Compile Include="Persistence\Repositories\IUserRepository.cs" />
<Compile Include="Persistence\IWriteRepository.cs" />
<Compile Include="Persistence\Repositories\Implement\LanguageRepository.cs" />
<Compile Include="Persistence\Repositories\Implement\MacroRepository.cs" />
<Compile Include="Persistence\Repositories\Implement\MediaRepository.cs" />
@@ -1099,22 +1063,16 @@
<Compile Include="Services\Implement\EntityXmlSerializer.cs" />
<Compile Include="Services\Implement\ExternalLoginService.cs" />
<Compile Include="Services\Implement\FileService.cs" />
<Compile Include="Services\IAuditService.cs" />
<Compile Include="Services\IContentService.cs" />
<Compile Include="Services\IContentServiceBase.cs" />
<Compile Include="Services\IContentTypeService.cs" />
<Compile Include="Services\IContentTypeServiceBase.cs" />
<Compile Include="Services\IdkMap.cs" />
<Compile Include="Services\IExternalLoginService.cs" />
<Compile Include="Services\IMediaService.cs" />
<Compile Include="Services\IMediaTypeService.cs" />
<Compile Include="Services\IMemberService.cs" />
<Compile Include="Services\IMembershipMemberService.cs" />
<Compile Include="Services\IMembershipRoleService.cs" />
<Compile Include="Services\IMembershipUserService.cs" />
<Compile Include="Services\IMemberTypeService.cs" />
<Compile Include="Services\Implement\KeyValueService.cs" />
<Compile Include="Services\INotificationService.cs" />
<Compile Include="Services\IPublicAccessService.cs" />
<Compile Include="Services\IUserService.cs" />
<Compile Include="Services\Implement\LocalizationService.cs" />
@@ -60,8 +60,8 @@ namespace Umbraco.Tests.Cache
new EventDefinition<IDataTypeService, SaveEventArgs<IDataType>>(null, serviceContext.DataTypeService, new SaveEventArgs<IDataType>(Enumerable.Empty<IDataType>())),
new EventDefinition<IDataTypeService, DeleteEventArgs<IDataType>>(null, serviceContext.DataTypeService, new DeleteEventArgs<IDataType>(Enumerable.Empty<IDataType>())),
new EventDefinition<IFileService, SaveEventArgs<Stylesheet>>(null, serviceContext.FileService, new SaveEventArgs<Stylesheet>(Enumerable.Empty<Stylesheet>())),
new EventDefinition<IFileService, DeleteEventArgs<Stylesheet>>(null, serviceContext.FileService, new DeleteEventArgs<Stylesheet>(Enumerable.Empty<Stylesheet>())),
new EventDefinition<IFileService, SaveEventArgs<IStylesheet>>(null, serviceContext.FileService, new SaveEventArgs<IStylesheet>(Enumerable.Empty<IStylesheet>())),
new EventDefinition<IFileService, DeleteEventArgs<IStylesheet>>(null, serviceContext.FileService, new DeleteEventArgs<IStylesheet>(Enumerable.Empty<IStylesheet>())),
new EventDefinition<IDomainService, SaveEventArgs<IDomain>>(null, serviceContext.DomainService, new SaveEventArgs<IDomain>(Enumerable.Empty<IDomain>())),
new EventDefinition<IDomainService, DeleteEventArgs<IDomain>>(null, serviceContext.DomainService, new DeleteEventArgs<IDomain>(Enumerable.Empty<IDomain>())),
@@ -6,6 +6,7 @@ using NUnit.Framework;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.IO;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.Repositories.Implement;
using Umbraco.Core.PropertyEditors;
using Umbraco.Tests.TestHelpers;
@@ -33,6 +34,11 @@ namespace Umbraco.Tests.Persistence.Repositories
}
}
private IScriptRepository CreateRepository()
{
return new ScriptRepository(_fileSystems, new IOHelper());
}
protected override void Compose()
{
base.Compose();
@@ -48,7 +54,7 @@ namespace Umbraco.Tests.Persistence.Repositories
using (var scope = ScopeProvider.CreateScope())
{
// Act
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
// Assert
Assert.That(repository, Is.Not.Null);
@@ -62,7 +68,7 @@ namespace Umbraco.Tests.Persistence.Repositories
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = ScopeProvider.CreateScope())
{
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
// Act
var script = new Script("test-add-script.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
@@ -81,7 +87,7 @@ namespace Umbraco.Tests.Persistence.Repositories
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = ScopeProvider.CreateScope())
{
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
// Act
var script = new Script("test-updated-script.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
@@ -107,7 +113,7 @@ namespace Umbraco.Tests.Persistence.Repositories
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = ScopeProvider.CreateScope())
{
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
// Act
var script = repository.Get("test-script.js");
@@ -127,7 +133,7 @@ namespace Umbraco.Tests.Persistence.Repositories
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = ScopeProvider.CreateScope())
{
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
// Act
var exists = repository.Get("test-script.js");
@@ -146,7 +152,7 @@ namespace Umbraco.Tests.Persistence.Repositories
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = ScopeProvider.CreateScope())
{
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
var script = new Script("test-script1.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
repository.Save(script);
@@ -174,7 +180,7 @@ namespace Umbraco.Tests.Persistence.Repositories
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = ScopeProvider.CreateScope())
{
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
var script = new Script("test-script1.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
repository.Save(script);
@@ -202,7 +208,7 @@ namespace Umbraco.Tests.Persistence.Repositories
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = ScopeProvider.CreateScope())
{
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
// Act
var exists = repository.Exists("test-script.js");
@@ -221,9 +227,9 @@ namespace Umbraco.Tests.Persistence.Repositories
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = ScopeProvider.CreateScope())
{
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
var script = new Script("test-move-script.js") { Content = content };
IScript script = new Script("test-move-script.js") { Content = content };
repository.Save(script);
@@ -254,9 +260,9 @@ namespace Umbraco.Tests.Persistence.Repositories
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = ScopeProvider.CreateScope())
{
var repository = new ScriptRepository(_fileSystems, Mock.Of<IContentSection>());
var repository = CreateRepository();
var script = new Script("test-path-1.js") { Content = "// script" };
IScript script = new Script("test-path-1.js") { Content = "// script" };
repository.Save(script);
Assert.IsTrue(_fileSystem.FileExists("test-path-1.js"));
@@ -6,6 +6,7 @@ using Moq;
using NUnit.Framework;
using Umbraco.Core.IO;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.Repositories.Implement;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.Testing;
@@ -30,6 +31,11 @@ namespace Umbraco.Tests.Persistence.Repositories
_fileSystem.AddFile("styles.css", stream);
}
private IStylesheetRepository CreateRepository()
{
return new StylesheetRepository(_fileSystems, new IOHelper());
}
[Test]
public void Can_Instantiate_Repository()
{
@@ -37,7 +43,7 @@ namespace Umbraco.Tests.Persistence.Repositories
using (ScopeProvider.CreateScope())
{
// Act
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
// Assert
@@ -51,7 +57,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
// Act
var stylesheet = new Stylesheet("test-add.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
@@ -69,7 +75,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
// Act
var stylesheet = new Stylesheet("test-update.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
@@ -96,10 +102,10 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
// Act
var stylesheet = new Stylesheet("test-update.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
IStylesheet stylesheet = new Stylesheet("test-update.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
repository.Save(stylesheet);
@@ -123,7 +129,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
// Act
var stylesheet = new Stylesheet("test-update.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
@@ -142,7 +148,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
// Act
var stylesheet = new Stylesheet("test-delete.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
@@ -163,7 +169,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
// Act
var stylesheet = repository.Get("styles.css");
@@ -182,7 +188,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
var stylesheet = new Stylesheet("styles-v2.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
repository.Save(stylesheet);
@@ -205,7 +211,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
var stylesheet = new Stylesheet("styles-v2.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
repository.Save(stylesheet);
@@ -228,7 +234,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
// Act
var exists = repository.Exists("styles.css");
@@ -245,9 +251,9 @@ namespace Umbraco.Tests.Persistence.Repositories
using (ScopeProvider.CreateScope())
{
var repository = new StylesheetRepository(_fileSystems);
var repository = CreateRepository();
var stylesheet = new Stylesheet("test-path-1.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
IStylesheet stylesheet = new Stylesheet("test-path-1.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" };
repository.Save(stylesheet);
Assert.IsTrue(_fileSystem.FileExists("test-path-1.css"));
@@ -68,7 +68,7 @@ namespace Umbraco.Tests.Runtimes
// create the register and the composition
var register = RegisterFactory.Create();
var composition = new Composition(register, typeLoader, profilingLogger, runtimeState);
composition.RegisterEssentials(logger, profiler, profilingLogger, mainDom, appCaches, databaseFactory, typeLoader, runtimeState);
composition.RegisterEssentials(logger, profiler, profilingLogger, mainDom, appCaches, databaseFactory, typeLoader, runtimeState, new IOHelper());
// create the core runtime and have it compose itself
var coreRuntime = new CoreRuntime();
@@ -258,7 +258,7 @@ namespace Umbraco.Tests.Runtimes
// create the register and the composition
var register = RegisterFactory.Create();
var composition = new Composition(register, typeLoader, profilingLogger, runtimeState);
composition.RegisterEssentials(logger, profiler, profilingLogger, mainDom, appCaches, databaseFactory, typeLoader, runtimeState);
composition.RegisterEssentials(logger, profiler, profilingLogger, mainDom, appCaches, databaseFactory, typeLoader, runtimeState, new IOHelper());
// create the core runtime and have it compose itself
var coreRuntime = new CoreRuntime();
+1 -1
View File
@@ -157,7 +157,7 @@ namespace Umbraco.Tests.TestHelpers
var notificationService = GetLazyService<INotificationService>(factory, c => new NotificationService(scopeProvider, userService.Value, contentService.Value, localizationService.Value, logger, GetRepo<INotificationsRepository>(c), globalSettings, umbracoSettings.Content));
var serverRegistrationService = GetLazyService<IServerRegistrationService>(factory, c => new ServerRegistrationService(scopeProvider, logger, eventMessagesFactory, GetRepo<IServerRegistrationRepository>(c)));
var memberGroupService = GetLazyService<IMemberGroupService>(factory, c => new MemberGroupService(scopeProvider, logger, eventMessagesFactory, GetRepo<IMemberGroupRepository>(c)));
var memberService = GetLazyService<IMemberService>(factory, c => new MemberService(scopeProvider, logger, eventMessagesFactory, memberGroupService.Value, mediaFileSystem, GetRepo<IMemberRepository>(c), GetRepo<IMemberTypeRepository>(c), GetRepo<IMemberGroupRepository>(c), GetRepo<IAuditRepository>(c)));
var memberService = GetLazyService<IMemberService>(factory, c => new MemberService(scopeProvider, logger, eventMessagesFactory, memberGroupService.Value, GetRepo<IMemberRepository>(c), GetRepo<IMemberTypeRepository>(c), GetRepo<IMemberGroupRepository>(c), GetRepo<IAuditRepository>(c)));
var mediaService = GetLazyService<IMediaService>(factory, c => new MediaService(scopeProvider, mediaFileSystem, logger, eventMessagesFactory, GetRepo<IMediaRepository>(c), GetRepo<IAuditRepository>(c), GetRepo<IMediaTypeRepository>(c), GetRepo<IEntityRepository>(c)));
var contentTypeService = GetLazyService<IContentTypeService>(factory, c => new ContentTypeService(scopeProvider, logger, eventMessagesFactory, contentService.Value, GetRepo<IContentTypeRepository>(c), GetRepo<IAuditRepository>(c), GetRepo<IDocumentTypeContainerRepository>(c), GetRepo<IEntityRepository>(c)));
var mediaTypeService = GetLazyService<IMediaTypeService>(factory, c => new MediaTypeService(scopeProvider, logger, eventMessagesFactory, mediaService.Value, GetRepo<IMediaTypeRepository>(c), GetRepo<IAuditRepository>(c), GetRepo<IMediaTypeContainerRepository>(c), GetRepo<IEntityRepository>(c)));
@@ -99,6 +99,8 @@ namespace Umbraco.Tests.Testing
protected ILogger Logger => Factory.GetInstance<ILogger>();
protected IIOHelper IOHelper { get; private set; }
protected IProfiler Profiler => Factory.GetInstance<IProfiler>();
protected virtual IProfilingLogger ProfilingLogger => Factory.GetInstance<IProfilingLogger>();
@@ -129,6 +131,7 @@ namespace Umbraco.Tests.Testing
var (logger, profiler) = GetLoggers(Options.Logger);
var proflogger = new ProfilingLogger(logger, profiler);
IOHelper = new IOHelper();
var appCaches = GetAppCaches();
var globalSettings = SettingsForTests.GetDefaultGlobalSettings();
var typeLoader = GetTypeLoader(appCaches.RuntimeCache, globalSettings, proflogger, Options.TypeLoader);
@@ -137,6 +140,7 @@ namespace Umbraco.Tests.Testing
Composition = new Composition(register, typeLoader, proflogger, ComponentTests.MockRuntimeState(RuntimeLevel.Run));
Composition.RegisterUnique(IOHelper);
Composition.RegisterUnique(typeLoader);
Composition.RegisterUnique(logger);
Composition.RegisterUnique(profiler);
@@ -380,8 +380,8 @@ namespace Umbraco.Web.Cache
}
// TODO: our weird events handling wants this for now
private void FileService_DeletedStylesheet(IFileService sender, DeleteEventArgs<Stylesheet> e) { }
private void FileService_SavedStylesheet(IFileService sender, SaveEventArgs<Stylesheet> e) { }
private void FileService_DeletedStylesheet(IFileService sender, DeleteEventArgs<IStylesheet> e) { }
private void FileService_SavedStylesheet(IFileService sender, SaveEventArgs<IStylesheet> e) { }
#endregion
@@ -178,7 +178,7 @@ namespace Umbraco.Web.Editors
var script = Services.FileService.GetScriptByName(virtualPath);
if (script != null)
{
var display = Mapper.Map<Script, CodeFileDisplay>(script);
var display = Mapper.Map<IScript, CodeFileDisplay>(script);
display.FileType = Core.Constants.Trees.Scripts;
display.Path = Url.GetTreePathFromFilePath(script.Path);
display.Id = System.Web.HttpUtility.UrlEncode(script.Path);
@@ -190,7 +190,7 @@ namespace Umbraco.Web.Editors
var stylesheet = Services.FileService.GetStylesheetByName(virtualPath);
if (stylesheet != null)
{
var display = Mapper.Map<Stylesheet, CodeFileDisplay>(stylesheet);
var display = Mapper.Map<IStylesheet, CodeFileDisplay>(stylesheet);
display.FileType = Core.Constants.Trees.Stylesheets;
display.Path = Url.GetTreePathFromFilePath(stylesheet.Path);
display.Id = System.Web.HttpUtility.UrlEncode(stylesheet.Path);
@@ -503,7 +503,7 @@ namespace Umbraco.Web.Editors
/// It's important to note that Scripts are DIFFERENT from cshtml files since scripts use IFileSystem and cshtml files
/// use a normal file system because they must exist on a real file system for ASP.NET to work.
/// </remarks>
private Script CreateOrUpdateScript(CodeFileDisplay display)
private IScript CreateOrUpdateScript(CodeFileDisplay display)
{
return CreateOrUpdateFile(display, ".js", Current.FileSystems.ScriptsFileSystem,
name => Services.FileService.GetScriptByName(name),
@@ -511,7 +511,7 @@ namespace Umbraco.Web.Editors
name => new Script(name));
}
private Stylesheet CreateOrUpdateStylesheet(CodeFileDisplay display)
private IStylesheet CreateOrUpdateStylesheet(CodeFileDisplay display)
{
return CreateOrUpdateFile(display, ".css", Current.FileSystems.StylesheetsFileSystem,
name => Services.FileService.GetStylesheetByName(name),
@@ -521,7 +521,7 @@ namespace Umbraco.Web.Editors
}
private T CreateOrUpdateFile<T>(CodeFileDisplay display, string extension, IFileSystem fileSystem,
Func<string, T> getFileByName, Action<T, int> saveFile, Func<string, T> createFile) where T : Core.Models.File
Func<string, T> getFileByName, Action<T, int> saveFile, Func<string, T> createFile) where T : Core.Models.IFile
{
//must always end with the correct extension
display.Name = EnsureCorrectFileExtension(display.Name, extension);
@@ -9,17 +9,17 @@ namespace Umbraco.Web.Models.Mapping
{
public void DefineMaps(UmbracoMapper mapper)
{
mapper.Define<Stylesheet, EntityBasic>((source, context) => new EntityBasic(), Map);
mapper.Define<IStylesheet, EntityBasic>((source, context) => new EntityBasic(), Map);
mapper.Define<IPartialView, CodeFileDisplay>((source, context) => new CodeFileDisplay(), Map);
mapper.Define<Script, CodeFileDisplay>((source, context) => new CodeFileDisplay(), Map);
mapper.Define<Stylesheet, CodeFileDisplay>((source, context) => new CodeFileDisplay(), Map);
mapper.Define<IScript, CodeFileDisplay>((source, context) => new CodeFileDisplay(), Map);
mapper.Define<IStylesheet, CodeFileDisplay>((source, context) => new CodeFileDisplay(), Map);
mapper.Define<CodeFileDisplay, IPartialView>(Map);
mapper.Define<CodeFileDisplay, Script>(Map);
mapper.Define<CodeFileDisplay, IScript>(Map);
}
// Umbraco.Code.MapAll -Trashed -Udi -Icon
private static void Map(Stylesheet source, EntityBasic target, MapperContext context)
private static void Map(IStylesheet source, EntityBasic target, MapperContext context)
{
target.Alias = source.Alias;
target.Id = source.Id;
@@ -39,7 +39,7 @@ namespace Umbraco.Web.Models.Mapping
}
// Umbraco.Code.MapAll -FileType -Notifications -Path -Snippet
private static void Map(Script source, CodeFileDisplay target, MapperContext context)
private static void Map(IScript source, CodeFileDisplay target, MapperContext context)
{
target.Content = source.Content;
target.Id = source.Id.ToString();
@@ -48,7 +48,7 @@ namespace Umbraco.Web.Models.Mapping
}
// Umbraco.Code.MapAll -FileType -Notifications -Path -Snippet
private static void Map(Stylesheet source, CodeFileDisplay target, MapperContext context)
private static void Map(IStylesheet source, CodeFileDisplay target, MapperContext context)
{
target.Content = source.Content;
target.Id = source.Id.ToString();
@@ -66,7 +66,7 @@ namespace Umbraco.Web.Models.Mapping
// Umbraco.Code.MapAll -CreateDate -DeleteDate -UpdateDate -GetFileContent
// Umbraco.Code.MapAll -Id -Key -Alias -Name -OriginalPath -Path
private static void Map(CodeFileDisplay source, Script target, MapperContext context)
private static void Map(CodeFileDisplay source, IScript target, MapperContext context)
{
target.Content = source.Content;
target.VirtualPath = source.VirtualPath;