Ignore:
Timestamp:
09/01/26 07:17:16 (4 weeks ago)
Author:
mmilevski <markomilevski3@…>
Branches:
main
Children:
595d2e5
Parents:
d2eccb3
Message:

Added few implementaions, minor UI changes.

File:
1 edited

Legend:

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

    rd2eccb3 rd89d25b  
    11501150        _context.SaveChanges();
    11511151    }
     1152    // =========================================================
     1153// ARTISTS
     1154// =========================================================
     1155
     1156[HttpGet]
     1157public IActionResult Artists()
     1158{
     1159    if (!IsAdmin())
     1160        return Forbid();
     1161
     1162    var artists = _context.Artists
     1163        .OrderBy(a => a.ArtistName)
     1164        .ToList();
     1165
     1166    return View(artists);
    11521167}
     1168
     1169
     1170// =========================================================
     1171// CREATE ARTIST - GET
     1172// =========================================================
     1173
     1174[HttpGet]
     1175public IActionResult CreateArtist()
     1176{
     1177    if (!IsAdmin())
     1178        return Forbid();
     1179
     1180    return View(new CreateArtistViewModel());
     1181}
     1182
     1183
     1184// =========================================================
     1185// CREATE ARTIST - POST
     1186// =========================================================
     1187
     1188[HttpPost]
     1189[ValidateAntiForgeryToken]
     1190public IActionResult CreateArtist(CreateArtistViewModel model)
     1191{
     1192    if (!IsAdmin())
     1193        return Forbid();
     1194
     1195    if (!ModelState.IsValid)
     1196        return View(model);
     1197
     1198    var duplicateExists =
     1199        _context.Artists.Any(a =>
     1200            a.ArtistName.ToLower() ==
     1201            model.ArtistName.Trim().ToLower());
     1202
     1203    if (duplicateExists)
     1204    {
     1205        ModelState.AddModelError(
     1206            nameof(model.ArtistName),
     1207            "An artist with this name already exists.");
     1208
     1209        return View(model);
     1210    }
     1211
     1212    var artist = new Artist
     1213    {
     1214        ArtistId = GetNextArtistId(),
     1215
     1216        ArtistName =
     1217            model.ArtistName.Trim(),
     1218
     1219        ArtistDescription =
     1220            string.IsNullOrWhiteSpace(model.ArtistDescription)
     1221                ? null
     1222                : model.ArtistDescription.Trim(),
     1223
     1224        ArtistPhoto =
     1225            string.IsNullOrWhiteSpace(model.ArtistPhoto)
     1226                ? null
     1227                : model.ArtistPhoto.Trim()
     1228    };
     1229
     1230    _context.Artists.Add(artist);
     1231    _context.SaveChanges();
     1232
     1233    TempData["Success"] =
     1234        $"{artist.ArtistName} was created successfully.";
     1235
     1236    return RedirectToAction(nameof(Artists));
     1237}
     1238
     1239
     1240// =========================================================
     1241// EDIT ARTIST - GET
     1242// =========================================================
     1243
     1244[HttpGet]
     1245public IActionResult EditArtist(long id)
     1246{
     1247    if (!IsAdmin())
     1248        return Forbid();
     1249
     1250    var artist = _context.Artists
     1251        .FirstOrDefault(a =>
     1252            a.ArtistId == id);
     1253
     1254    if (artist == null)
     1255        return NotFound();
     1256
     1257    var model = new EditArtistViewModel
     1258    {
     1259        ArtistId =
     1260            artist.ArtistId,
     1261
     1262        ArtistName =
     1263            artist.ArtistName,
     1264
     1265        ArtistDescription =
     1266            artist.ArtistDescription,
     1267
     1268        ArtistPhoto =
     1269            artist.ArtistPhoto
     1270    };
     1271
     1272    return View(model);
     1273}
     1274
     1275
     1276// =========================================================
     1277// EDIT ARTIST - POST
     1278// =========================================================
     1279
     1280[HttpPost]
     1281[ValidateAntiForgeryToken]
     1282public IActionResult EditArtist(EditArtistViewModel model)
     1283{
     1284    if (!IsAdmin())
     1285        return Forbid();
     1286
     1287    var artist = _context.Artists
     1288        .FirstOrDefault(a =>
     1289            a.ArtistId == model.ArtistId);
     1290
     1291    if (artist == null)
     1292        return NotFound();
     1293
     1294    if (!ModelState.IsValid)
     1295        return View(model);
     1296
     1297    var duplicateExists =
     1298        _context.Artists.Any(a =>
     1299            a.ArtistId != model.ArtistId &&
     1300            a.ArtistName.ToLower() ==
     1301            model.ArtistName.Trim().ToLower());
     1302
     1303    if (duplicateExists)
     1304    {
     1305        ModelState.AddModelError(
     1306            nameof(model.ArtistName),
     1307            "Another artist already uses this name.");
     1308
     1309        return View(model);
     1310    }
     1311
     1312    artist.ArtistName =
     1313        model.ArtistName.Trim();
     1314
     1315    artist.ArtistDescription =
     1316        string.IsNullOrWhiteSpace(model.ArtistDescription)
     1317            ? null
     1318            : model.ArtistDescription.Trim();
     1319
     1320    artist.ArtistPhoto =
     1321        string.IsNullOrWhiteSpace(model.ArtistPhoto)
     1322            ? null
     1323            : model.ArtistPhoto.Trim();
     1324
     1325    _context.Artists.Update(artist);
     1326    _context.SaveChanges();
     1327
     1328    TempData["Success"] =
     1329        $"{artist.ArtistName} was updated successfully.";
     1330
     1331    return RedirectToAction(nameof(Artists));
     1332}
     1333private long GetNextArtistId()
     1334{
     1335    var maxId = _context.Artists
     1336        .Select(x => (long?)x.ArtistId)
     1337        .Max();
     1338
     1339    return (maxId ?? 0) + 1;
     1340}
     1341// =========================================================
     1342// RELEASES
     1343// =========================================================
     1344
     1345[HttpGet]
     1346public IActionResult Releases()
     1347{
     1348    if (!IsAdmin())
     1349        return Forbid();
     1350
     1351    var releases = _context.Releases
     1352        .Include(r => r.ReleaseArtists)
     1353            .ThenInclude(ra => ra.Artist)
     1354        .OrderBy(r => r.Title)
     1355        .ToList();
     1356
     1357    return View(releases);
     1358}
     1359
     1360
     1361// =========================================================
     1362// EDIT RELEASE - GET
     1363// =========================================================
     1364
     1365    [HttpGet]
     1366    public IActionResult EditRelease(long id)
     1367    {
     1368        if (!IsAdmin())
     1369            return Forbid();
     1370
     1371
     1372        var release = _context.Releases
     1373            .Include(r => r.ReleaseArtists)
     1374            .ThenInclude(ra => ra.Artist)
     1375            .FirstOrDefault(r =>
     1376                r.ReleaseId == id);
     1377
     1378
     1379        if (release == null)
     1380            return NotFound();
     1381
     1382
     1383        var mainArtist = release.ReleaseArtists
     1384            .FirstOrDefault(ra =>
     1385                ra.Type == ArtistReleaseType.MAIN);
     1386
     1387
     1388        var featuredArtists = release.ReleaseArtists
     1389            .Where(ra =>
     1390                ra.Type == ArtistReleaseType.FEATURE)
     1391            .OrderBy(ra => ra.ReleaseOrdinal)
     1392            .Select(ra => ra.ArtistId)
     1393            .ToList();
     1394
     1395
     1396        var model = new EditReleaseViewModel
     1397        {
     1398            ReleaseId =
     1399                release.ReleaseId,
     1400
     1401            Title =
     1402                release.Title,
     1403
     1404            RecordLabel =
     1405                release.RecordLabel,
     1406
     1407            Genre =
     1408                release.Genre,
     1409
     1410            ReleaseDate =
     1411                release.ReleaseDate,
     1412
     1413            CoverPhoto =
     1414                release.CoverPhoto,
     1415
     1416            MainArtistId =
     1417                mainArtist?.ArtistId ?? 0,
     1418
     1419            FeaturedArtistIds =
     1420                featuredArtists
     1421        };
     1422
     1423
     1424        LoadArtists();
     1425
     1426
     1427        return View(model);
     1428    }
     1429
     1430
     1431// =========================================================
     1432// EDIT RELEASE - POST
     1433// =========================================================
     1434
     1435[HttpPost]
     1436[ValidateAntiForgeryToken]
     1437public IActionResult EditRelease(
     1438    EditReleaseViewModel model)
     1439{
     1440    if (!IsAdmin())
     1441        return Forbid();
     1442
     1443
     1444    var release = _context.Releases
     1445        .Include(r => r.ReleaseArtists)
     1446        .FirstOrDefault(r =>
     1447            r.ReleaseId == model.ReleaseId);
     1448
     1449
     1450    if (release == null)
     1451        return NotFound();
     1452
     1453
     1454    // ==========================================
     1455    // ARTIST VALIDATION
     1456    // ==========================================
     1457
     1458    var mainArtistExists =
     1459        _context.Artists.Any(a =>
     1460            a.ArtistId == model.MainArtistId);
     1461
     1462
     1463    if (!mainArtistExists)
     1464    {
     1465        ModelState.AddModelError(
     1466            nameof(model.MainArtistId),
     1467            "Please select a valid main artist.");
     1468    }
     1469
     1470
     1471    model.FeaturedArtistIds ??=
     1472        new List<long>();
     1473
     1474
     1475    model.FeaturedArtistIds =
     1476        model.FeaturedArtistIds
     1477            .Distinct()
     1478            .Where(id =>
     1479                id != model.MainArtistId)
     1480            .ToList();
     1481
     1482
     1483    if (model.FeaturedArtistIds.Count > 0)
     1484    {
     1485        var validFeaturedCount =
     1486            _context.Artists.Count(a =>
     1487                model.FeaturedArtistIds
     1488                    .Contains(a.ArtistId));
     1489
     1490
     1491        if (validFeaturedCount !=
     1492            model.FeaturedArtistIds.Count)
     1493        {
     1494            ModelState.AddModelError(
     1495                nameof(model.FeaturedArtistIds),
     1496                "One or more featured artists are invalid.");
     1497        }
     1498    }
     1499
     1500
     1501    if (!ModelState.IsValid)
     1502    {
     1503        LoadArtists();
     1504
     1505        return View(model);
     1506    }
     1507
     1508
     1509    using var transaction =
     1510        _context.Database.BeginTransaction();
     1511
     1512
     1513    try
     1514    {
     1515        // ==========================================
     1516        // UPDATE RELEASE INFORMATION
     1517        // ==========================================
     1518
     1519        release.Title =
     1520            model.Title.Trim();
     1521
     1522        release.RecordLabel =
     1523            string.IsNullOrWhiteSpace(
     1524                model.RecordLabel)
     1525                ? null
     1526                : model.RecordLabel.Trim();
     1527
     1528        release.Genre =
     1529            model.Genre.Trim();
     1530
     1531        release.ReleaseDate =
     1532            model.ReleaseDate;
     1533
     1534        release.CoverPhoto =
     1535            model.CoverPhoto.Trim();
     1536
     1537
     1538        _context.Releases.Update(
     1539            release);
     1540
     1541
     1542        // ==========================================
     1543        // REMOVE OLD RELEASE ARTIST LINKS
     1544        // ==========================================
     1545
     1546        var existingArtistLinks =
     1547            release.ReleaseArtists.ToList();
     1548
     1549
     1550        _context.ReleaseArtists.RemoveRange(
     1551            existingArtistLinks);
     1552
     1553
     1554        _context.SaveChanges();
     1555
     1556
     1557        // ==========================================
     1558        // ADD MAIN ARTIST
     1559        // ==========================================
     1560
     1561        _context.ReleaseArtists.Add(
     1562            new ReleaseArtist
     1563            {
     1564                ReleaseId =
     1565                    release.ReleaseId,
     1566
     1567                ArtistId =
     1568                    model.MainArtistId,
     1569
     1570                ReleaseOrdinal =
     1571                    1,
     1572
     1573                Type =
     1574                    ArtistReleaseType.MAIN
     1575            });
     1576
     1577
     1578        // ==========================================
     1579        // ADD FEATURED ARTISTS
     1580        // ==========================================
     1581
     1582        long ordinal = 2;
     1583
     1584
     1585        foreach (var artistId
     1586                 in model.FeaturedArtistIds)
     1587        {
     1588            _context.ReleaseArtists.Add(
     1589                new ReleaseArtist
     1590                {
     1591                    ReleaseId =
     1592                        release.ReleaseId,
     1593
     1594                    ArtistId =
     1595                        artistId,
     1596
     1597                    ReleaseOrdinal =
     1598                        ordinal++,
     1599
     1600                    Type =
     1601                        ArtistReleaseType.FEATURE
     1602                });
     1603        }
     1604
     1605
     1606        _context.SaveChanges();
     1607
     1608
     1609        transaction.Commit();
     1610
     1611
     1612        TempData["Success"] =
     1613            $"{release.Title} was updated successfully.";
     1614
     1615
     1616        return RedirectToAction(
     1617            nameof(Releases));
     1618    }
     1619    catch
     1620    {
     1621        transaction.Rollback();
     1622
     1623        throw;
     1624    }
     1625}
     1626}
Note: See TracChangeset for help on using the changeset viewer.