Gets the entity service returning a media's url property and allows this to be used in the media picker.

This commit is contained in:
Shannon
2019-06-13 23:39:36 +10:00
parent 16f6bbcbd4
commit 81077c2681
12 changed files with 96 additions and 92 deletions

View File

@@ -3,6 +3,7 @@ using System.Linq;
namespace Umbraco.Core.Models.Entities
{
/// <summary>
/// Implements <see cref="IDocumentEntitySlim"/>.
/// </summary>

View File

@@ -111,52 +111,6 @@ namespace Umbraco.Core.Models.Entities
public virtual bool IsContainer { get; set; }
/// <summary>
/// Represents a lightweight property.
/// </summary>
public class PropertySlim
{
/// <summary>
/// Initializes a new instance of the <see cref="PropertySlim"/> class.
/// </summary>
public PropertySlim(string editorAlias, object value)
{
PropertyEditorAlias = editorAlias;
Value = value;
}
/// <summary>
/// Gets the property editor alias.
/// </summary>
public string PropertyEditorAlias { get; }
/// <summary>
/// Gets the property value.
/// </summary>
public object Value { get; }
protected bool Equals(PropertySlim other)
{
return PropertyEditorAlias.Equals(other.PropertyEditorAlias) && Equals(Value, other.Value);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != GetType()) return false;
return Equals((PropertySlim) obj);
}
public override int GetHashCode()
{
unchecked
{
return (PropertyEditorAlias.GetHashCode() * 397) ^ (Value != null ? Value.GetHashCode() : 0);
}
}
}
#region IDeepCloneable
/// <inheritdoc />

View File

@@ -2,6 +2,7 @@
namespace Umbraco.Core.Models.Entities
{
/// <summary>
/// Represents a lightweight document entity, managed by the entity service.
/// </summary>

View File

@@ -0,0 +1,14 @@
namespace Umbraco.Core.Models.Entities
{
/// <summary>
/// Represents a lightweight media entity, managed by the entity service.
/// </summary>
public interface IMediaEntitySlim : IContentEntitySlim
{
/// <summary>
/// The media file's path/url
/// </summary>
string MediaPath { get; }
}
}

View File

@@ -0,0 +1,10 @@
namespace Umbraco.Core.Models.Entities
{
/// <summary>
/// Implements <see cref="IMediaEntitySlim"/>.
/// </summary>
public class MediaEntitySlim : ContentEntitySlim, IMediaEntitySlim
{
public string MediaPath { get; set; }
}
}

View File

@@ -75,6 +75,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
dtos = page.Items;
totalRecords = page.TotalItems;
}
else if (isMedia)
{
var page = Database.Page<MediaEntityDto>(pageIndexToFetch, pageSize, sql);
dtos = page.Items;
totalRecords = page.TotalItems;
}
else
{
var page = Database.Page<BaseDto>(pageIndexToFetch, pageSize, sql);
@@ -87,10 +93,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
if (isContent)
BuildVariants(entities.Cast<DocumentEntitySlim>());
//// TODO: see https://github.com/umbraco/Umbraco-CMS/pull/3460#issuecomment-434903930 we need to not load any property data at all for media
//if (isMedia)
// BuildProperties(entities, dtos.ToList());
return entities;
}
@@ -112,14 +114,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
return cdtos.Count == 0 ? null : BuildVariants(BuildDocumentEntity(cdtos[0]));
}
var dto = Database.FirstOrDefault<BaseDto>(sql);
var dto = isMedia
? Database.FirstOrDefault<MediaEntityDto>(sql)
: Database.FirstOrDefault<BaseDto>(sql);
if (dto == null) return null;
var entity = BuildEntity(false, isMedia, dto);
//if (isMedia)
// BuildProperties(entity, dto);
return entity;
}
@@ -174,15 +176,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
: BuildVariants(cdtos.Select(BuildDocumentEntity)).ToList();
}
var dtos = Database.Fetch<BaseDto>(sql);
if (dtos.Count == 0) return Enumerable.Empty<IEntitySlim>();
var dtos = isMedia
? (IEnumerable<BaseDto>)Database.Fetch<MediaEntityDto>(sql)
: Database.Fetch<BaseDto>(sql);
var entities = dtos.Select(x => BuildEntity(false, isMedia, x)).ToArray();
//// TODO: See https://github.com/umbraco/Umbraco-CMS/pull/3460#issuecomment-434903930 we need to not load any property data at all for media
//if (isMedia && loadMediaProperties)
// BuildProperties(entities, dtos);
return entities;
}
@@ -424,7 +423,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
// gets the base SELECT + FROM [+ filter] sql
// always from the 'current' content version
protected Sql<ISqlContext> GetBase(bool isContent, bool isMedia, Action<Sql<ISqlContext>> filter, bool isCount = false)
{
{
var sql = Sql();
if (isCount)
@@ -448,6 +447,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
sql
.AndSelect<DocumentDto>(x => x.Published, x => x.Edited);
}
if (isMedia)
{
sql
.AndSelect<MediaVersionDto>(x => Alias(x.Path, "MediaPath"));
}
}
sql
@@ -467,6 +472,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
.InnerJoin<DocumentDto>().On<NodeDto, DocumentDto>((left, right) => left.NodeId == right.NodeId);
}
if (isMedia)
{
sql
.InnerJoin<MediaVersionDto>().On<ContentVersionDto, MediaVersionDto>((left, right) => left.Id == right.Id);
}
//Any LeftJoin statements need to come last
if (isCount == false)
{
@@ -536,6 +547,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
.AndBy<DocumentDto>(x => x.Published, x => x.Edited);
}
if (isMedia)
{
sql
.AndBy<MediaVersionDto>(x => Alias(x.Path, "MediaPath"));
}
if (isContent || isMedia)
sql
@@ -594,6 +611,11 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
public bool Edited { get; set; }
}
private class MediaEntityDto : BaseDto
{
public string MediaPath { get; set; }
}
public class VariantInfoDto
{
public int NodeId { get; set; }
@@ -645,7 +667,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
if (isContent)
return BuildDocumentEntity(dto);
if (isMedia)
return BuildContentEntity(dto);
return BuildMediaEntity(dto);
// EntitySlim does not track changes
var entity = new EntitySlim();
@@ -678,11 +700,18 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
entity.ContentTypeThumbnail = dto.Thumbnail;
}
private static EntitySlim BuildContentEntity(BaseDto dto)
private MediaEntitySlim BuildMediaEntity(BaseDto dto)
{
// EntitySlim does not track changes
var entity = new ContentEntitySlim();
var entity = new MediaEntitySlim();
BuildContentEntity(entity, dto);
if (dto is MediaEntityDto contentDto)
{
// fill in the media info
entity.MediaPath = contentDto.MediaPath;
}
return entity;
}

View File

@@ -249,6 +249,8 @@
<Compile Include="Migrations\Upgrade\V_8_1_0\ConvertTinyMceAndGridMediaUrlsToLocalLink.cs" />
<Compile Include="Migrations\Upgrade\V_8_0_0\FixLanguageIsoCodeLength.cs" />
<Compile Include="Models\CultureImpact.cs" />
<Compile Include="Models\Entities\IMediaEntitySlim.cs" />
<Compile Include="Models\Entities\MediaEntitySlim.cs" />
<Compile Include="Models\PublishedContent\ILivePublishedModelFactory.cs" />
<Compile Include="Persistence\Dtos\PropertyTypeCommonDto.cs" />
<Compile Include="Persistence\Repositories\Implement\ContentTypeCommonRepository.cs" />

View File

@@ -37,9 +37,7 @@ namespace Umbraco.Tests.Models
};
item.AdditionalData.Add("test1", 3);
item.AdditionalData.Add("test2", "valuie");
item.AdditionalData.Add("test3", new EntitySlim.PropertySlim("TestPropertyEditor", "test"));
item.AdditionalData.Add("test4", new EntitySlim.PropertySlim("TestPropertyEditor2", "test2"));
var result = ss.ToStream(item);
var json = result.ResultStream.ToJsonString();
Debug.Print(json); // FIXME: compare with v7

View File

@@ -675,15 +675,10 @@ namespace Umbraco.Tests.Services
foreach (var entity in entities)
{
Console.WriteLine();
foreach (var data in entity.AdditionalData)
{
Console.WriteLine($"{entity.Id} {data.Key} {data.Value} {(data.Value is EntitySlim.PropertySlim p ? p.PropertyEditorAlias : "")}");
}
Assert.IsTrue(entity.GetType().Implements<IMediaEntitySlim>());
Console.WriteLine(((IMediaEntitySlim)entity).MediaPath);
Assert.IsNotEmpty(((IMediaEntitySlim)entity).MediaPath);
}
Assert.That(entities.Any(x =>
x.AdditionalData.Any(y => y.Value is EntitySlim.PropertySlim && ((EntitySlim.PropertySlim)y.Value).PropertyEditorAlias == Constants.PropertyEditors.Aliases.UploadField)), Is.True);
}
[Test]

View File

@@ -143,27 +143,21 @@ function mediaHelper(umbRequestHelper) {
*/
resolveFileFromEntity: function (mediaEntity, thumbnail) {
if (!angular.isObject(mediaEntity.metaData)) {
if (!angular.isObject(mediaEntity.metaData) || !mediaEntity.metaData.MediaPath) {
throw "Cannot resolve the file url from the mediaEntity, it does not contain the required metaData";
}
var values = _.values(mediaEntity.metaData);
for (var i = 0; i < values.length; i++) {
var val = values[i];
if (angular.isObject(val) && val.PropertyEditorAlias) {
for (var resolver in _mediaFileResolvers) {
if (val.PropertyEditorAlias === resolver) {
//we need to format a property variable that coincides with how the property would be structured
// if it came from the mediaResource just to keep things slightly easier for the file resolvers.
var property = { value: val.Value };
return _mediaFileResolvers[resolver](property, mediaEntity, thumbnail);
}
}
if (thumbnail) {
if (this.detectIfImageByExtension(mediaEntity.metaData.MediaPath)) {
return this.getThumbnailFromPath(mediaEntity.metaData.MediaPath);
}
else {
return null;
}
}
return "";
else {
return mediaEntity.metaData.MediaPath;
}
},
/**

View File

@@ -61,7 +61,7 @@ namespace Umbraco.Web.Editors
//redirect to ImageProcessor thumbnail with rnd generated from last modified time of original media file
var response = Request.CreateResponse(HttpStatusCode.Found);
var imageLastModified = _mediaFileSystem.GetLastModified(imagePath);
response.Headers.Location = new Uri($"{imagePath}?rnd={imageLastModified:yyyyMMddHHmmss}&upscale=false&width={width}", UriKind.Relative);
response.Headers.Location = new Uri($"{imagePath}?rnd={imageLastModified:yyyyMMddHHmmss}&upscale=false&width={width}&animationprocessmode=first&mode=max", UriKind.Relative);
return response;
}

View File

@@ -45,6 +45,12 @@ namespace Umbraco.Web.Models.Mapping
if (source.NodeObjectType == Constants.ObjectTypes.Member && target.Icon.IsNullOrWhiteSpace())
target.Icon = "icon-user";
if (source.NodeObjectType == Constants.ObjectTypes.Media && source is IContentEntitySlim contentSlim)
source.AdditionalData["ContentTypeAlias"] = contentSlim.ContentTypeAlias;
if (source.NodeObjectType == Constants.ObjectTypes.Media && source is IMediaEntitySlim mediaSlim)
source.AdditionalData["MediaPath"] = mediaSlim.MediaPath;
// NOTE: we're mapping the objects in AdditionalData by object reference here.
// it works fine for now, but it's something to keep in mind in the future
foreach(var kvp in source.AdditionalData)