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:
@@ -3,6 +3,7 @@ using System.Linq;
|
||||
|
||||
namespace Umbraco.Core.Models.Entities
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Implements <see cref="IDocumentEntitySlim"/>.
|
||||
/// </summary>
|
||||
|
||||
@@ -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 />
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Umbraco.Core.Models.Entities
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Represents a lightweight document entity, managed by the entity service.
|
||||
/// </summary>
|
||||
|
||||
14
src/Umbraco.Core/Models/Entities/IMediaEntitySlim.cs
Normal file
14
src/Umbraco.Core/Models/Entities/IMediaEntitySlim.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
10
src/Umbraco.Core/Models/Entities/MediaEntitySlim.cs
Normal file
10
src/Umbraco.Core/Models/Entities/MediaEntitySlim.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user