Changeset 595d2e5 for KernelRecordsMVC.Web/Controllers/AdminController.cs
- Timestamp:
- 09/02/26 05:22:09 (4 weeks ago)
- Branches:
- main
- Children:
- 1dcdb2c
- Parents:
- d89d25b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
KernelRecordsMVC.Web/Controllers/AdminController.cs
rd89d25b r595d2e5 497 497 498 498 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 502 507 503 508 if (model.ReleaseType != "ALBUM" && … … 510 515 511 516 512 // ===================================================== 517 // ========================================================= 513 518 // MAIN ARTIST VALIDATION 514 // ===================================================== 519 // ========================================================= 515 520 516 521 var mainArtistExists = 517 522 _context.Artists.Any(a => 518 a.ArtistId == 519 model.MainArtistId); 523 a.ArtistId == model.MainArtistId); 520 524 521 525 … … 528 532 529 533 530 // ===================================================== 534 // ========================================================= 531 535 // FEATURED ARTISTS 532 // ===================================================== 536 // ========================================================= 533 537 534 538 model.FeaturedArtistIds ??= … … 539 543 model.FeaturedArtistIds 540 544 .Distinct() 545 .Where(id => 546 id != model.MainArtistId) 541 547 .ToList(); 542 548 543 549 544 // Do not allow the main artist545 // to also be a featured artist.546 model.FeaturedArtistIds.Remove(547 model.MainArtistId);548 549 550 // Validate that featured artists exist.551 550 if (model.FeaturedArtistIds.Count > 0) 552 551 { … … 567 566 568 567 569 // ===================================================== 568 // ========================================================= 570 569 // SINGLE VALIDATION 571 // ===================================================== 570 // ========================================================= 572 571 573 572 if (model.ReleaseType == "SINGLE") 574 573 { 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 575 594 if (string.IsNullOrWhiteSpace( 576 model.SingleDuration))595 model.SingleDuration)) 577 596 { 578 597 ModelState.AddModelError( … … 580 599 "Duration is required for a single."); 581 600 } 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 // ========================================================= 586 613 // ALBUM VALIDATION 587 // ===================================================== 614 // ========================================================= 588 615 589 616 if (model.ReleaseType == "ALBUM") 590 617 { 618 // Single duration does not apply to an album. 619 ModelState.Remove( 620 nameof(model.SingleDuration)); 621 622 model.SingleDuration = 623 null; 624 625 591 626 model.Tracks ??= 592 627 new List<CreateTrackViewModel>(); 593 628 594 629 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 596 648 model.Tracks = 597 649 model.Tracks … … 625 677 ModelState.AddModelError( 626 678 $"Tracks[{i}].SongName", 627 "Trackname is required.");679 $"Track {i + 1}: name is required."); 628 680 } 629 681 … … 634 686 ModelState.AddModelError( 635 687 $"Tracks[{i}].SongDuration", 636 "Trackduration is required.");688 $"Track {i + 1}: duration is required."); 637 689 } 638 690 … … 648 700 649 701 650 // Validate selected track artists.651 702 if (track.ArtistIds.Count > 0) 652 703 { … … 662 713 ModelState.AddModelError( 663 714 $"Tracks[{i}].ArtistIds", 664 "One or more selected trackartists are invalid.");715 $"Track {i + 1}: one or more artists are invalid."); 665 716 } 666 717 } … … 669 720 670 721 722 // ========================================================= 723 // VALIDATION FAILED 724 // ========================================================= 725 671 726 if (!ModelState.IsValid) 672 727 { … … 676 731 } 677 732 733 734 // ========================================================= 735 // DATABASE TRANSACTION 736 // ========================================================= 678 737 679 738 using var transaction = … … 683 742 try 684 743 { 685 // ================================================= 686 // CREATERELEASE687 // ================================================= 744 // ===================================================== 745 // RELEASE 746 // ===================================================== 688 747 689 748 var release = … … 719 778 720 779 721 // ================================================= 722 // MAIN RELEASE ARTIST723 // ================================================= 724 725 var mainReleaseArtist =780 // ===================================================== 781 // RELEASE ARTISTS 782 // ===================================================== 783 784 _context.ReleaseArtists.Add( 726 785 new ReleaseArtist 727 786 { … … 732 791 model.MainArtistId, 733 792 734 ReleaseOrdinal = 1, 793 ReleaseOrdinal = 794 1, 735 795 736 796 Type = 737 797 ArtistReleaseType.MAIN 738 }; 739 740 741 _context.ReleaseArtists.Add( 742 mainReleaseArtist); 743 744 745 // ================================================= 746 // FEATURED RELEASE ARTISTS 747 // ================================================= 798 }); 799 748 800 749 801 long releaseOrdinal = 2; … … 753 805 in model.FeaturedArtistIds) 754 806 { 755 var featuredArtist =807 _context.ReleaseArtists.Add( 756 808 new ReleaseArtist 757 809 { … … 767 819 Type = 768 820 ArtistReleaseType.FEATURE 769 }; 770 771 772 _context.ReleaseArtists.Add( 773 featuredArtist); 821 }); 774 822 } 775 823 … … 778 826 779 827 780 // ================================================= 828 // ===================================================== 781 829 // ALBUM 782 // ================================================= 830 // ===================================================== 783 831 784 832 if (model.ReleaseType == "ALBUM") … … 798 846 799 847 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 803 853 804 854 foreach (var trackModel … … 809 859 { 810 860 SongId = 811 GetNextSongId(),861 nextSongId++, 812 862 813 863 SongName = 814 trackModel 815 .SongName 816 .Trim(), 864 trackModel.SongName.Trim(), 817 865 818 866 SongDuration = 819 trackModel 820 .SongDuration 821 .Trim() 867 trackModel.SongDuration.Trim() 822 868 }; 823 869 … … 829 875 830 876 831 // ========================================= 832 // LINK SONG TO ALBUM 833 // ========================================= 834 835 var albumSong = 877 _context.AlbumSongs.Add( 836 878 new AlbumSong 837 879 { … … 841 883 SongId = 842 884 song.SongId 843 }; 844 845 846 _context.AlbumSongs.Add( 847 albumSong); 848 849 850 // ========================================= 851 // SONG ARTISTS 852 // ========================================= 885 }); 886 853 887 854 888 var trackArtistIds = … … 858 892 859 893 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. 863 896 if (trackArtistIds.Count == 0) 864 897 { … … 874 907 in trackArtistIds) 875 908 { 876 var songArtist =909 _context.SongArtists.Add( 877 910 new SongArtist 878 911 { … … 885 918 SongOrdinal = 886 919 songOrdinal++ 887 }; 888 889 890 _context.SongArtists.Add( 891 songArtist); 920 }); 892 921 } 893 922 … … 898 927 899 928 900 // ================================================= 929 // ===================================================== 901 930 // SINGLE 902 // ================================================= 931 // ===================================================== 903 932 904 933 else 905 934 { 906 var single =935 _context.SingleReleases.Add( 907 936 new SingleRelease 908 937 { … … 911 940 912 941 Duration = 913 model.SingleDuration! 914 .Trim() 915 }; 916 917 918 _context.SingleReleases.Add( 919 single); 942 model.SingleDuration!.Trim() 943 }); 944 920 945 921 946 _context.SaveChanges(); … … 931 956 932 957 return RedirectToAction( 933 nameof( Index));934 } 935 catch 958 nameof(Releases)); 959 } 960 catch (Exception ex) 936 961 { 937 962 transaction.Rollback(); 938 963 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); 940 981 } 941 982 }
Note:
See TracChangeset
for help on using the changeset viewer.
