diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs index fa31692bfe..434a162abe 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs @@ -19,5 +19,10 @@ { public const string UrlSlugAlreadyExist = "CmsKit:BlogPost:0001"; } + + public static class MediaDescriptors + { + public const string InvalidName = "CmsKit:Medias:0001"; + } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs index f6293fc659..08eaf7a919 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs @@ -10,6 +10,8 @@ namespace Volo.CmsKit.GlobalFeatures public ReactionsFeature Reactions => GetFeature(); public CommentsFeature Comments => GetFeature(); + + public MediasFeature Medias => GetFeature(); public RatingsFeature Ratings => GetFeature(); @@ -23,6 +25,7 @@ namespace Volo.CmsKit.GlobalFeatures : base(featureManager) { AddFeature(new ReactionsFeature(this)); + AddFeature(new MediasFeature(this)); AddFeature(new CommentsFeature(this)); AddFeature(new RatingsFeature(this)); AddFeature(new TagsFeature(this)); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MediasFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MediasFeature.cs new file mode 100644 index 0000000000..b39f3a10e3 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MediasFeature.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures +{ + [GlobalFeatureName(Name)] + public class MediasFeature : GlobalFeature + { + public const string Name = "CmsKit.Medias"; + + internal MediasFeature( + [NotNull] GlobalCmsKitFeatures cmsKit + ) : base(cmsKit) + { + + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 8b2588a12f..520664d0aa 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -40,6 +40,7 @@ "Undo": "Undo", "Update": "Update", "YourComment": "Your comment", - "YourReply": "Your reply" + "YourReply": "Your reply", + "CmsKit:Medias:0001": "'{Name}' is not a valid media name." } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/Extensions/MediaDescriptorExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/Extensions/MediaDescriptorExtensions.cs new file mode 100644 index 0000000000..579affbd02 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/Extensions/MediaDescriptorExtensions.cs @@ -0,0 +1,19 @@ +using System.IO; +using System.Linq; + +namespace Volo.CmsKit.Medias.Extensions +{ + public static class MediaDescriptorExtensions + { + public static bool IsValidMediaFileName(this string name) + { + if (string.IsNullOrWhiteSpace(name)) + { + return false; + } + + // "con" is not valid folder/file name for Windows OS + return !(Path.GetInvalidFileNameChars().Any(name.Contains) || name == "con"); + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/IMediaDescriptorRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/IMediaDescriptorRepository.cs new file mode 100644 index 0000000000..552c840897 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/IMediaDescriptorRepository.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.Domain.Repositories; + +namespace Volo.CmsKit.Medias +{ + public interface IMediaDescriptorRepository : IBasicRepository + { + + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/InvalidMediaDescriptorNameException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/InvalidMediaDescriptorNameException.cs new file mode 100644 index 0000000000..376c221cd1 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/InvalidMediaDescriptorNameException.cs @@ -0,0 +1,23 @@ +using System; +using System.Runtime.Serialization; +using JetBrains.Annotations; +using Volo.Abp; + +namespace Volo.CmsKit.Medias +{ + [Serializable] + public class InvalidMediaDescriptorNameException : BusinessException + { + public InvalidMediaDescriptorNameException([NotNull] string name) + { + Code = CmsKitErrorCodes.MediaDescriptors.InvalidName; + WithData(nameof(MediaDescriptor.Name), name); + } + + public InvalidMediaDescriptorNameException(SerializationInfo serializationInfo, StreamingContext context) + : base(serializationInfo, context) + { + + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/MediaContainer.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/MediaContainer.cs new file mode 100644 index 0000000000..d1bb7a76da --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/MediaContainer.cs @@ -0,0 +1,10 @@ +using Volo.Abp.BlobStoring; + +namespace Volo.CmsKit.Medias +{ + [BlobContainerName("cms-kit-medias")] + public class MediaContainer + { + + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/MediaDescriptor.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/MediaDescriptor.cs new file mode 100644 index 0000000000..78bc42119d --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Medias/MediaDescriptor.cs @@ -0,0 +1,42 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; +using Volo.CmsKit.Medias.Extensions; + +namespace Volo.CmsKit.Medias +{ + public class MediaDescriptor : FullAuditedAggregateRoot, IMultiTenant + { + public Guid? TenantId { get; protected set; } + + public string Name { get; protected set; } + + public string MimeType { get; set; } + + public int Size { get; protected set; } + + protected MediaDescriptor() + { + + } + + public MediaDescriptor(Guid id, Guid? tenantId, string name, string mimeType, int size) : base(id) + { + TenantId = tenantId; + MimeType = mimeType; + Size = size; + + SetName(name); + } + + public void SetName(string name) + { + if (!name.IsValidMediaFileName()) + { + throw new InvalidMediaDescriptorNameException(name); + } + + Name = name; + } + } +} \ No newline at end of file