Esempio n. 1
0
        public void TestGetMediaTypeFromString(string code, string expectedExtension)
        {
            MediaType mediaType = MediaType.FromString(code);

            Output.WriteLine($"MediaType {code} has extension:" + mediaType.Extensions.First(x => x.Contains(expectedExtension)));
            Assert.Equal(expectedExtension, mediaType.Extensions.First(x => x.Contains(expectedExtension)));
        }
Esempio n. 2
0
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Query filters for soft delete
            modelBuilder.Entity <Account>().HasQueryFilter(f => f.DeletedAt == null);
            modelBuilder.Entity <Page>().HasQueryFilter(f => f.DeletedAt == null);
            modelBuilder.Entity <Notice>().HasQueryFilter(f => f.DeletedAt == null);
            modelBuilder.Entity <Quiz>().HasQueryFilter(f => f.DeletedAt == null);

            // Enum Conversions
            modelBuilder.Entity <Page>().Property(p => p.Section).HasConversion(c => (int)c, c => (Section)c);
            modelBuilder.Entity <Page>().Property(p => p.QuickLink).HasConversion(c => (int)c, c => (QuickLinkSection)c);
            modelBuilder.Entity <CmsButton>().Property(p => p.Align).HasConversion(c => (int)c, c => (Align)c);
            modelBuilder.Entity <CmsButton>().Property(p => p.Color).HasConversion(c => (int)c, c => (Color)c);

            // Discover Deep Cove
            modelBuilder.Entity <Activity>().Property(p => p.ActivityType).HasConversion(c => (int)c, c => (ActivityType)c);

            // Noticeboard
            modelBuilder.Entity <Notice>().Property(p => p.Noticeboard).HasConversion(c => (int)c, c => (Noticeboard)c);

            // End Enum Conversions

            // Conversions
            modelBuilder.Entity <BaseMedia>().Property(p => p.MediaType).HasConversion(c => c.Mime, c => MediaType.FromString(c));
            modelBuilder.Entity <ImageMedia>().Property(p => p.Versions)
            .HasConversion(c => JsonConvert.SerializeObject(c), c => JsonConvert.DeserializeObject <List <ImageVersion> >(c));
            // End conversions

            // Define keys for junction tables
            modelBuilder.Entity <ChannelMembership>()
            .HasKey(e => new { e.AccountId, e.NotificationChannelId });

            modelBuilder.Entity <RevisionTextComponent>()
            .HasKey(e => new { e.PageRevisionId, e.TextComponentId });

            modelBuilder.Entity <RevisionMediaComponent>()
            .HasKey(e => new { e.PageRevisionId, e.MediaComponentId });

            // -- Discover Deep Cove

            modelBuilder.Entity <ActivityImage>()
            .HasKey(e => new { e.ActivityId, e.ImageId });

            modelBuilder.Entity <FactFileEntryImage>()
            .HasKey(e => new { e.FactFileEntryId, e.MediaFileId });

            // ---------------------

            // Place unique constraints onto appropriate properties

            modelBuilder.Entity <PageTemplate>()
            .HasIndex(e => e.Name).IsUnique();

            modelBuilder.Entity <Page>()
            .HasIndex(e => e.Name).IsUnique();

            // -- Configure relationship between activities and media files
            modelBuilder.Entity <Activity>().HasMany(a => a.ActivityImages).WithOne(ai => ai.Activity).HasForeignKey(ai => ai.ActivityId).OnDelete(DeleteBehavior.Restrict);

            // -- Configure relationships between fact file entries and media files
            modelBuilder.Entity <FactFileEntry>().HasMany(ff => ff.FactFileEntryImages).WithOne(ei => ei.FactFileEntry).HasForeignKey(ei => ei.FactFileEntryId).OnDelete(DeleteBehavior.Restrict);

            // -- Configure relationships between pages and navitems
            modelBuilder.Entity <Page>().HasMany(p => p.NavItems).WithOne(ni => ni.Page).HasForeignKey(ni => ni.PageId).OnDelete(DeleteBehavior.Cascade);
            modelBuilder.Entity <Page>().HasMany(p => p.NavItemPages).WithOne(ni => ni.Page).HasForeignKey(ni => ni.PageId).OnDelete(DeleteBehavior.Cascade);

            // -- Configure relationship between question and correct answer
            modelBuilder.Entity <QuizQuestion>().HasOne(q => q.CorrectAnswer).WithOne(a => a.CorrectForQuestion).OnDelete(DeleteBehavior.Cascade);
        }
Esempio n. 3
0
        public async Task <IActionResult> Index(IFormCollection request)
        {
            try
            {
                // Create required directories if not existing
                EnsureInit();

                // Deserialize cropping data if applicable
                CropData cropData = null;
                if (request.Str("cropData") != null)
                {
                    cropData = JsonConvert.DeserializeObject <CropData>(request.Str("cropData"));
                }


                // Original filename
                string uploadedName = request.Str("filename");

                // Generate a backend filename for the uploaded file - same extension as uploaded file.
                string filename = Guid.NewGuid().ToString() + Path.GetExtension(uploadedName);

                string fileType = request.Str("fileType");

                // Determine what type of file has been uploaded and act accordingly (may want to refactor these)

                // FOR IMAGES
                if (MediaType.MimesForCategory(MediaCategory.Image).Contains(fileType))
                {
                    string filepath = Path.Combine("Storage", "Media", "Images", filename);

                    // Save image and all associated versions of it.
                    var filedata = ImageUtils.SaveImage(request.Str("file")
                                                        .Split(',')[1], filepath, cropData);

                    // Create database record to track images
                    ImageMedia dbImageMedia = new ImageMedia {
                        Name      = Path.GetFileNameWithoutExtension(uploadedName),
                        MediaType = MediaType.FromString(fileType),
                        FilePath  = filepath,
                        Size      = filedata["size"],
                        Title     = request.Str("title"),
                        Alt       = request.Str("alt"),
                        Width     = filedata["width"],
                        Height    = filedata["height"],
                        Versions  = filedata["versions"]
                    };

                    await _Db.AddAsync(dbImageMedia);
                }

                // FOR AUDIO
                else if (MediaType.MimesForCategory(MediaCategory.Audio).Contains(fileType))
                {
                    string filepath = Path.Combine("Storage", "Media", "Audio", filename);

                    // Save the audio file
                    byte[] bytes = request.Str("file").Split(',')[1].DecodeBase64Bytes();
                    await System.IO.File.WriteAllBytesAsync(filepath, bytes);

                    // Read the audio file to determine its duration - it will either be mp3(mpeg) or wav

                    // Configure ffprobe path using appsettings values
                    FFProbe probe = new FFProbe();
                    probe.ToolPath = _Config["ffprobePath"];

                    // If running linux, look for ffprobe instaed of ffprobe.exe
                    if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
                    {
                        probe.FFProbeExeName = "ffprobe";
                    }

                    // Get audio file metadata
                    MediaInfo mediaInfo = probe.GetMediaInfo(Path.Combine(_HostingEnv.ContentRootPath, filepath));

                    // Create the media database record
                    AudioMedia audioMedia = new AudioMedia
                    {
                        Name      = Path.GetFileNameWithoutExtension(uploadedName),
                        MediaType = MediaType.FromString(fileType),
                        FilePath  = filepath,
                        Size      = new FileInfo(filepath).Length,
                        Duration  = Math.Round(mediaInfo.Duration.TotalSeconds)
                    };

                    await _Db.AddAsync(audioMedia);
                }

                // FOR GENERAL
                else if (MediaType.MimesForCategory(MediaCategory.General).Contains(fileType))
                {
                    string filepath = Path.Combine("Storage", "Media", "Documents", filename);

                    // Save the file
                    byte[] bytes = request.Str("file").Split(',')[1].DecodeBase64Bytes();
                    System.IO.File.WriteAllBytes(filepath, bytes);

                    // Create the media database record
                    GeneralMedia generalMedia = new GeneralMedia
                    {
                        Name      = Path.GetFileNameWithoutExtension(uploadedName),
                        MediaType = MediaType.FromString(fileType),
                        FilePath  = filepath,
                        Size      = new FileInfo(filepath).Length,
                    };

                    await _Db.AddAsync(generalMedia);
                }

                else
                {
                    return(new UnsupportedMediaTypeResult());
                }

                await _Db.SaveChangesAsync();

                return(Ok());
            }
            catch (Exception ex)
            {
                _Logger.LogError("Error uploading file: {0}", ex.Message);
                _Logger.LogError(ex.StackTrace);
                return(BadRequest(new ResponseHelper("Something went wrong, please contact the devloper if the problem persists", ex.Message)));
            }
        }