From 4fd2f2fc23685236f288733bfcf4bb32483ca0f7 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Thu, 14 May 2020 15:40:41 +0200 Subject: [PATCH] start moving media into separate table --- zero.Core/Api/BackofficeStore.cs | 32 ++++++++++--------- zero.Core/Api/MediaUpload.cs | 19 +++++++---- zero.Core/Entities/Media/Media.cs | 35 ++++++++++----------- zero.Core/Entities/Media/MediaFolder.cs | 5 ++- zero.Core/Entities/User/User.cs | 4 +-- zero.Web.UI/App/navigation.vue | 3 +- zero.Web.UI/App/pages/settings/settings.vue | 4 +-- zero.Web.UI/App/pages/settings/user.vue | 2 +- zero.Web.UI/Sass/Canvas/_navigation.scss | 6 +++- zero.Web/Mapper/UserMapperConfig.cs | 6 ++-- zero.Web/Models/UserEditModel.cs | 2 +- zero.Web/Models/UserListModel.cs | 2 +- zero.Web/ZeroVue.cs | 12 ++++++- 13 files changed, 79 insertions(+), 53 deletions(-) diff --git a/zero.Core/Api/BackofficeStore.cs b/zero.Core/Api/BackofficeStore.cs index 09818633..f8a0d950 100644 --- a/zero.Core/Api/BackofficeStore.cs +++ b/zero.Core/Api/BackofficeStore.cs @@ -91,24 +91,24 @@ namespace zero.Core.Api } // find all media items in model - List> media = ObjectTraverser.Find(model); + //List> media = ObjectTraverser.Find(model); // upload media items - Dictionary mediaItems = new Dictionary(); + //Dictionary mediaItems = new Dictionary(); - foreach (ObjectTraverser.Result item in media) - { - string id = item.Item?.Id; + //foreach (ObjectTraverser.Result item in media) + //{ + // string id = item.Item?.Id; - if (!Media.Upload(item.Item, out bool uploaded, out string uploadError)) - { - return EntityResult.Fail(item.Path, uploadError); - } - else - { - mediaItems.Add(id, item.Item); - } - } + // if (!Media.Upload(item.Item, out bool uploaded, out string uploadError)) + // { + // return EntityResult.Fail(item.Path, uploadError); + // } + // else + // { + // mediaItems.Add(id, item.Item); + // } + //} //if (operation.Media != null) //{ @@ -155,7 +155,11 @@ namespace zero.Core.Api using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { + // store entity await session.StoreAsync(model); + + // store media + await session.SaveChangesAsync(); } diff --git a/zero.Core/Api/MediaUpload.cs b/zero.Core/Api/MediaUpload.cs index 4c3032ff..76085970 100644 --- a/zero.Core/Api/MediaUpload.cs +++ b/zero.Core/Api/MediaUpload.cs @@ -44,15 +44,18 @@ namespace zero.Core.Api return true; } - // generate new id - media.Id = IdGenerator.Create(); + // set id to null in case it was prefixed to signal an upload + media.Id = null; + + // generate file id which is used as the folder name on disk + media.FileId = IdGenerator.Create(); // get bytes for media content string byteString = media.Source.Split(SEP)[1]; byte[] bytes = Convert.FromBase64String(byteString); // build folder and full file path - string folderPath = Path.Combine(Paths.Media, media.Id); + string folderPath = Path.Combine(Paths.Media, media.FileId); string filePath = Path.Combine(folderPath, media.Name); Paths.Create(folderPath); @@ -81,15 +84,19 @@ namespace zero.Core.Api Size = new Size(100, 100), Mode = ResizeMode.Max })); - image.Save(filePath.Replace(extension, THUMB_EXTENSION + extension)); - media.HasThumbnail = true; + string thumbFileName = media.Name.Replace(extension, THUMB_EXTENSION + extension); + string thumbSourcePath = Path.Combine(Paths.Media, media.FileId, thumbFileName); + + image.Save(thumbSourcePath); + + media.ThumbnailSource = Path.Combine(PATH_PREFIX, media.FileId, thumbFileName).Replace(Path.DirectorySeparatorChar, PATH_SEPARATOR); } } // set new properties media.LastModifiedDate = DateTimeOffset.Now; - media.Source = Path.Combine(PATH_PREFIX, media.Id, media.Name).Replace(Path.DirectorySeparatorChar, PATH_SEPARATOR); + media.Source = Path.Combine(PATH_PREFIX, media.FileId, media.Name).Replace(Path.DirectorySeparatorChar, PATH_SEPARATOR); media.Size = bytes.Length; uploaded = true; diff --git a/zero.Core/Entities/Media/Media.cs b/zero.Core/Entities/Media/Media.cs index c34b37ef..af845b57 100644 --- a/zero.Core/Entities/Media/Media.cs +++ b/zero.Core/Entities/Media/Media.cs @@ -5,16 +5,16 @@ namespace zero.Core.Entities /// /// A media file (can contain an image or other media like videos and documents) /// - public class Media : IMedia, IZeroDbConventions + public class Media : ZeroEntity, IMedia { - /// - public string Id { get; set; } - /// public string AppId { get; set; } /// - public string Name { get; set; } + public string FileId { get; set; } + + /// + public string FolderId { get; set; } /// public string AlternativeText { get; set; } @@ -26,7 +26,7 @@ namespace zero.Core.Entities public string Source { get; set; } /// - public bool HasThumbnail { get; set; } + public string ThumbnailSource { get; set; } /// public int Size { get; set; } @@ -39,18 +39,20 @@ namespace zero.Core.Entities /// public MediaFocalPoint FocalPoint { get; set; } - - /// - public string FolderId { get; set; } } - public interface IMedia : IZeroIdEntity, IAppAwareEntity + public interface IMedia : IZeroEntity, IAppAwareEntity, IZeroDbConventions { /// - /// File name + /// Id/name of the folder which is stored on disk/cloud /// - public string Name { get; set; } + public string FileId { get; set; } + + /// + /// Id of the media folder + /// + public string FolderId { get; set; } /// /// Alternative text which is used when the image can't be loaded @@ -68,9 +70,9 @@ namespace zero.Core.Entities string Source { get; set; } /// - /// Whether this file has a thumbnail + /// For images this is the source for a 100x100px thumbnail /// - bool HasThumbnail { get; set; } + string ThumbnailSource { get; set; } /// /// Filesize in bytes @@ -91,10 +93,5 @@ namespace zero.Core.Entities /// Optional focal point for an image /// MediaFocalPoint FocalPoint { get; set; } - - /// - /// Id of the folder - /// - public string FolderId { get; set; } } } diff --git a/zero.Core/Entities/Media/MediaFolder.cs b/zero.Core/Entities/Media/MediaFolder.cs index 27c7719f..d30c9b51 100644 --- a/zero.Core/Entities/Media/MediaFolder.cs +++ b/zero.Core/Entities/Media/MediaFolder.cs @@ -3,8 +3,11 @@ /// /// A media folder contains media and other folders /// - public class MediaFolder : ZeroEntity + public class MediaFolder : ZeroEntity, IAppAwareEntity, IZeroDbConventions { + /// + public string AppId { get; set; } + /// /// Parent folder id /// diff --git a/zero.Core/Entities/User/User.cs b/zero.Core/Entities/User/User.cs index 49bbdcd7..938bce62 100644 --- a/zero.Core/Entities/User/User.cs +++ b/zero.Core/Entities/User/User.cs @@ -24,7 +24,7 @@ namespace zero.Core.Entities public string SecurityStamp { get; set; } /// - public Media Avatar { get; set; } + public string AvatarId { get; set; } /// public string LanguageId { get; set; } @@ -101,7 +101,7 @@ namespace zero.Core.Entities /// /// Avatar image /// - Media Avatar { get; set; } + string AvatarId { get; set; } /// /// Backoffice display language diff --git a/zero.Web.UI/App/navigation.vue b/zero.Web.UI/App/navigation.vue index ecb45bdc..48dd6158 100644 --- a/zero.Web.UI/App/navigation.vue +++ b/zero.Web.UI/App/navigation.vue @@ -31,7 +31,8 @@