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
            }
        }
Exemplo n.º 2
0
        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}"
                });
            }
        }