Changeset d89d25b for KernelRecordsMVC.Web/Controllers/AdminController.cs
- Timestamp:
- 09/01/26 07:17:16 (4 weeks ago)
- Branches:
- main
- Children:
- 595d2e5
- Parents:
- d2eccb3
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
KernelRecordsMVC.Web/Controllers/AdminController.cs
rd2eccb3 rd89d25b 1150 1150 _context.SaveChanges(); 1151 1151 } 1152 // ========================================================= 1153 // ARTISTS 1154 // ========================================================= 1155 1156 [HttpGet] 1157 public 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); 1152 1167 } 1168 1169 1170 // ========================================================= 1171 // CREATE ARTIST - GET 1172 // ========================================================= 1173 1174 [HttpGet] 1175 public 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] 1190 public 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] 1245 public 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] 1282 public 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 } 1333 private 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] 1346 public 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] 1437 public 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.
