public async Task <IActionResult> StartAsync([FromBody] MissionStartRequest request) // JSON Body'den request nesnesini alsın { if (!ModelState.IsValid) { return(BadRequest()); // Model validasyon kurallarında ihlal olursa } // Servis metodunu çağıralım var startResult = await _missionService.StartMissionAsync(request); if (startResult.Success) // Sonuç başarılı ise HTTP OK { return(Ok(startResult.Message)); } else { return(BadRequest(startResult.Message)); // Değilse HTTP Bad Request } }
public async Task <MissionStartResponse> StartMissionAsync(MissionStartRequest request) { using var transaction = await _dbContext.Database.BeginTransactionAsync(); // Transaction başlatalım try { // Mürettebat sayısı uygun olup aktif görevde olmayan bir gemi bulmalıyız. Aday havuzunu çekelim. var crewCount = request.Voyagers.Count; var candidates = _dbContext.Spaceships.Where(s => s.MaxCrewCount >= crewCount && s.OnMission == false).ToList(); if (candidates.Count > 0) { Random rnd = new(); var candidateId = rnd.Next(0, candidates.Count); var ship = candidates[candidateId]; // Index değerine göre rastgele bir tanesini alalım ship.OnMission = true; await _dbContext.SaveChangesAsync(); // Gemiyi görevde durumuna alalım // Görev nesnesini oluşturalım Mission mission = new() { Name = request.Name, PlannedDuration = request.PlannedDuration, SpaceshipId = ship.SpaceshipId, // Gemi ile ilişkilendirdik StartDate = DateTime.Now }; await _dbContext.Missions.AddAsync(mission); await _dbContext.SaveChangesAsync(); // Görev nesnesini db'ye yollayalım // Gelen gezginlerin listesini dolaşıp var voyagers = new List <Voyager>(); foreach (var v in request.Voyagers) { Voyager voyager = new() { Name = v.Name, Grade = v.Grade, OnMission = true, MissionId = mission.MissionId // Görevle ilişkilendirdik }; voyagers.Add(voyager); } await _dbContext.Voyagers.AddRangeAsync(voyagers); // Bunları topluca Voyagers listesine ekleyelim await _dbContext.SaveChangesAsync(); // Değişiklikleri kaydedelim. await transaction.CommitAsync(); // Transaction'ı commit edelim return(new MissionStartResponse { Success = true, Message = "Görev başlatıldı." }); } else // Müsait veya uygun gemi yoksa burda durmamızın anlamı yok { await transaction.RollbackAsync(); return(new MissionStartResponse { Success = false, Message = "Şu anda görev için müsait gemi yok" }); } } catch (Exception exp) { await transaction.RollbackAsync(); return(new MissionStartResponse { Success = false, Message = $"Sistem Hatası:{exp.Message}" }); } }