Ignore:
Timestamp:
09/02/26 05:22:09 (4 weeks ago)
Author:
mmilevski <markomilevski3@…>
Branches:
main
Children:
1dcdb2c
Parents:
d89d25b
Message:

Various UI bugfixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • KernelRecordsMVC.Web/Controllers/AdminController.cs

    rd89d25b r595d2e5  
    497497
    498498
    499         // =====================================================
    500         // RELEASE TYPE VALIDATION
    501         // =====================================================
     499        // =========================================================
     500        // NORMALIZE RELEASE TYPE
     501        // =========================================================
     502
     503        model.ReleaseType =
     504            model.ReleaseType?.Trim().ToUpperInvariant()
     505            ?? string.Empty;
     506
    502507
    503508        if (model.ReleaseType != "ALBUM" &&
    … …  
    510515
    511516
    512         // =====================================================
     517        // =========================================================
    513518        // MAIN ARTIST VALIDATION
    514         // =====================================================
     519        // =========================================================
    515520
    516521        var mainArtistExists =
    517522            _context.Artists.Any(a =>
    518                 a.ArtistId ==
    519                 model.MainArtistId);
     523                a.ArtistId == model.MainArtistId);
    520524
    521525
    … …  
    528532
    529533
    530         // =====================================================
     534        // =========================================================
    531535        // FEATURED ARTISTS
    532         // =====================================================
     536        // =========================================================
    533537
    534538        model.FeaturedArtistIds ??=
    … …  
    539543            model.FeaturedArtistIds
    540544                .Distinct()
     545                .Where(id =>
     546                    id != model.MainArtistId)
    541547                .ToList();
    542548
    543549
    544         // Do not allow the main artist
    545         // to also be a featured artist.
    546         model.FeaturedArtistIds.Remove(
    547             model.MainArtistId);
    548 
    549 
    550         // Validate that featured artists exist.
    551550        if (model.FeaturedArtistIds.Count > 0)
    552551        {
    … …  
    567566
    568567
    569         // =====================================================
     568        // =========================================================
    570569        // SINGLE VALIDATION
    571         // =====================================================
     570        // =========================================================
    572571
    573572        if (model.ReleaseType == "SINGLE")
    574573        {
     574            // Album track values do not apply to a single.
     575            model.Tracks =
     576                new List<CreateTrackViewModel>();
     577
     578
     579            var trackModelStateKeys =
     580                ModelState.Keys
     581                    .Where(key =>
     582                        key.StartsWith(
     583                            "Tracks[",
     584                            StringComparison.OrdinalIgnoreCase))
     585                    .ToList();
     586
     587
     588            foreach (var key in trackModelStateKeys)
     589            {
     590                ModelState.Remove(key);
     591            }
     592
     593
    575594            if (string.IsNullOrWhiteSpace(
    576                 model.SingleDuration))
     595                    model.SingleDuration))
    577596            {
    578597                ModelState.AddModelError(
    … …  
    580599                    "Duration is required for a single.");
    581600            }
    582         }
    583 
    584 
    585         // =====================================================
     601            else if (!System.Text.RegularExpressions.Regex.IsMatch(
     602                         model.SingleDuration.Trim(),
     603                         @"^\d{1,2}:[0-5]\d$"))
     604            {
     605                ModelState.AddModelError(
     606                    nameof(model.SingleDuration),
     607                    "Duration must be in MM:SS format, for example 03:42.");
     608            }
     609        }
     610
     611
     612        // =========================================================
    586613        // ALBUM VALIDATION
    587         // =====================================================
     614        // =========================================================
    588615
    589616        if (model.ReleaseType == "ALBUM")
    590617        {
     618            // Single duration does not apply to an album.
     619            ModelState.Remove(
     620                nameof(model.SingleDuration));
     621
     622            model.SingleDuration =
     623                null;
     624
     625
    591626            model.Tracks ??=
    592627                new List<CreateTrackViewModel>();
    593628
    594629
    595             // Remove completely empty rows.
     630            // The model binder may already have added validation
     631            // errors for blank track rows. Remove those and validate
     632            // the cleaned list ourselves.
     633            var existingTrackKeys =
     634                ModelState.Keys
     635                    .Where(key =>
     636                        key.StartsWith(
     637                            "Tracks[",
     638                            StringComparison.OrdinalIgnoreCase))
     639                    .ToList();
     640
     641
     642            foreach (var key in existingTrackKeys)
     643            {
     644                ModelState.Remove(key);
     645            }
     646
     647
    596648            model.Tracks =
    597649                model.Tracks
    … …  
    625677                    ModelState.AddModelError(
    626678                        $"Tracks[{i}].SongName",
    627                         "Track name is required.");
     679                        $"Track {i + 1}: name is required.");
    628680                }
    629681
    … …  
    634686                    ModelState.AddModelError(
    635687                        $"Tracks[{i}].SongDuration",
    636                         "Track duration is required.");
     688                        $"Track {i + 1}: duration is required.");
    637689                }
    638690
    … …  
    648700
    649701
    650                 // Validate selected track artists.
    651702                if (track.ArtistIds.Count > 0)
    652703                {
    … …  
    662713                        ModelState.AddModelError(
    663714                            $"Tracks[{i}].ArtistIds",
    664                             "One or more selected track artists are invalid.");
     715                            $"Track {i + 1}: one or more artists are invalid.");
    665716                    }
    666717                }
    … …  
    669720
    670721
     722        // =========================================================
     723        // VALIDATION FAILED
     724        // =========================================================
     725
    671726        if (!ModelState.IsValid)
    672727        {
    … …  
    676731        }
    677732
     733
     734        // =========================================================
     735        // DATABASE TRANSACTION
     736        // =========================================================
    678737
    679738        using var transaction =
    … …  
    683742        try
    684743        {
    685             // =================================================
    686             // CREATE RELEASE
    687             // =================================================
     744            // =====================================================
     745            // RELEASE
     746            // =====================================================
    688747
    689748            var release =
    … …  
    719778
    720779
    721             // =================================================
    722             // MAIN RELEASE ARTIST
    723             // =================================================
    724 
    725             var mainReleaseArtist =
     780            // =====================================================
     781            // RELEASE ARTISTS
     782            // =====================================================
     783
     784            _context.ReleaseArtists.Add(
    726785                new ReleaseArtist
    727786                {
    … …  
    732791                        model.MainArtistId,
    733792
    734                     ReleaseOrdinal = 1,
     793                    ReleaseOrdinal =
     794                        1,
    735795
    736796                    Type =
    737797                        ArtistReleaseType.MAIN
    738                 };
    739 
    740 
    741             _context.ReleaseArtists.Add(
    742                 mainReleaseArtist);
    743 
    744 
    745             // =================================================
    746             // FEATURED RELEASE ARTISTS
    747             // =================================================
     798                });
     799
    748800
    749801            long releaseOrdinal = 2;
    … …  
    753805                     in model.FeaturedArtistIds)
    754806            {
    755                 var featuredArtist =
     807                _context.ReleaseArtists.Add(
    756808                    new ReleaseArtist
    757809                    {
    … …  
    767819                        Type =
    768820                            ArtistReleaseType.FEATURE
    769                     };
    770 
    771 
    772                 _context.ReleaseArtists.Add(
    773                     featuredArtist);
     821                    });
    774822            }
    775823
    … …  
    778826
    779827
    780             // =================================================
     828            // =====================================================
    781829            // ALBUM
    782             // =================================================
     830            // =====================================================
    783831
    784832            if (model.ReleaseType == "ALBUM")
    … …  
    798846
    799847
    800                 // =============================================
    801                 // TRACKS
    802                 // =============================================
     848                // Get the next song ID once for this request.
     849                // Each track then gets a unique incremented ID.
     850                var nextSongId =
     851                    GetNextSongId();
     852
    803853
    804854                foreach (var trackModel
    … …  
    809859                        {
    810860                            SongId =
    811                                 GetNextSongId(),
     861                                nextSongId++,
    812862
    813863                            SongName =
    814                                 trackModel
    815                                     .SongName
    816                                     .Trim(),
     864                                trackModel.SongName.Trim(),
    817865
    818866                            SongDuration =
    819                                 trackModel
    820                                     .SongDuration
    821                                     .Trim()
     867                                trackModel.SongDuration.Trim()
    822868                        };
    823869
    … …  
    829875
    830876
    831                     // =========================================
    832                     // LINK SONG TO ALBUM
    833                     // =========================================
    834 
    835                     var albumSong =
     877                    _context.AlbumSongs.Add(
    836878                        new AlbumSong
    837879                        {
    … …  
    841883                            SongId =
    842884                                song.SongId
    843                         };
    844 
    845 
    846                     _context.AlbumSongs.Add(
    847                         albumSong);
    848 
    849 
    850                     // =========================================
    851                     // SONG ARTISTS
    852                     // =========================================
     885                        });
     886
    853887
    854888                    var trackArtistIds =
    … …  
    858892
    859893
    860                     // If no track artists were selected,
    861                     // automatically use the release's
    862                     // main artist.
     894                    // Default to the main release artist when
     895                    // no track-specific artists were selected.
    863896                    if (trackArtistIds.Count == 0)
    864897                    {
    … …  
    874907                             in trackArtistIds)
    875908                    {
    876                         var songArtist =
     909                        _context.SongArtists.Add(
    877910                            new SongArtist
    878911                            {
    … …  
    885918                                SongOrdinal =
    886919                                    songOrdinal++
    887                             };
    888 
    889 
    890                         _context.SongArtists.Add(
    891                             songArtist);
     920                            });
    892921                    }
    893922
    … …  
    898927
    899928
    900             // =================================================
     929            // =====================================================
    901930            // SINGLE
    902             // =================================================
     931            // =====================================================
    903932
    904933            else
    905934            {
    906                 var single =
     935                _context.SingleReleases.Add(
    907936                    new SingleRelease
    908937                    {
    … …  
    911940
    912941                        Duration =
    913                             model.SingleDuration!
    914                                 .Trim()
    915                     };
    916 
    917 
    918                 _context.SingleReleases.Add(
    919                     single);
     942                            model.SingleDuration!.Trim()
     943                    });
     944
    920945
    921946                _context.SaveChanges();
    … …  
    931956
    932957            return RedirectToAction(
    933                 nameof(Index));
    934         }
    935         catch
     958                nameof(Releases));
     959        }
     960        catch (Exception ex)
    936961        {
    937962            transaction.Rollback();
    938963
    939             throw;
     964
     965            Console.WriteLine(
     966                "CREATE RELEASE FAILED:");
     967
     968            Console.WriteLine(ex);
     969
     970
     971            ModelState.AddModelError(
     972                string.Empty,
     973                ex.InnerException?.Message
     974                ?? ex.Message);
     975
     976
     977            LoadArtists();
     978
     979
     980            return View(model);
    940981        }
    941982    }
Note: See TracChangeset for help on using the changeset viewer.