public IActionResult GetPhotosForRover(long roverId, [FromQuery] string photoDate) { var rover = _context.Rover.Find(roverId); var photoDateEntity = _context.PhotoDate.AsNoTracking().Where(x => x.EarthDate == photoDate).SingleOrDefault(); if (rover != null) { if (photoDateEntity != null) { //Look in Db first var roverPhotos = _context.RoverPhoto.AsNoTracking().Where(x => x.RoverId == roverId && x.PhotoDateId == photoDateEntity.PhotoDateId).ToList(); if (roverPhotos.Count() > 0) { return(Ok(roverPhotos)); } else { DateTime date = DateTime.Parse(photoDate); List <Repository.EntityModels.RoverPhoto> addRoverPhotos = new List <Repository.EntityModels.RoverPhoto>(); RoverPhotoPage roverPhotoPage = Task.Run(() => _nasaClient.GetRoverPhotos(rover.Name, date)).Result; if (roverPhotoPage.Photos.Count > 0) { foreach (var photo in roverPhotoPage.Photos) { addRoverPhotos.Add(new Repository.EntityModels.RoverPhoto { RoverId = rover.RoverId, RoverCameraInfo = JsonConvert.SerializeObject(photo.Camera), PhotoUrl = photo.ImageUrl, PhotoDateId = photoDateEntity.PhotoDateId }); } _context.RoverPhoto.AddRange(addRoverPhotos); _context.SaveChanges(); } return(Ok(_context.RoverPhoto.AsNoTracking().Where(x => x.RoverId == roverId && x.PhotoDateId == photoDateEntity.PhotoDateId).ToList())); } } else { return(NotFound("Date not found, please upload date from file")); } } else { return(NotFound("Rover not found")); } }
public async Task <RoverPhotoPage> GetRoverPhotoPage(string rover, DateTime date, int page) { RoverPhotoPage photoPage = null; var response = await _client.GetAsync($"https://api.nasa.gov/mars-photos/api/v1/rovers/{rover}/photos?earth_date={date.ToString("yyyy-M-d")}page={page}&api_key={_apiKey}"); if (response.IsSuccessStatusCode) { var responseContent = await response.Content.ReadAsStringAsync(); photoPage = JsonConvert.DeserializeObject <RoverPhotoPage>(responseContent); } return(photoPage); //TODO: handle when request is not successful in a better way }
static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var configuration = builder.Build(); string inputFilePath = Path.Combine(Directory.GetCurrentDirectory(), configuration["inputFileName"]); Console.WriteLine($"Opening {inputFilePath}"); if (File.Exists(inputFilePath)) { FileStream file = new FileStream(inputFilePath, FileMode.Open); Console.WriteLine("Reading dates from input file."); List <DateTime> inputDates = FileHandler.ReadDatesFromFile(file); Console.WriteLine("Done.\n"); NasaClient nasaClient = new NasaClient(configuration["nasaApi:apiKey"]); int pagesToRequest = ParseNumOfPagesToRequest(configuration["numOfPagesToRequest"]); //defaults to 1 Console.WriteLine("Getting rover manifests."); Dictionary <string, RoverManifest> roverManifests = Task.Run(() => nasaClient.GetAllRoverManifests()).Result; Console.WriteLine("Done.\n"); Dictionary <string, Dictionary <DateTime, List <RoverPhotoPage> > > roverPhotoPages = InitializeRoverPhotoPages(roverManifests, inputDates); Console.WriteLine("Begin fetching photos"); foreach (var rover in roverManifests) { Console.WriteLine($"\tFetch photos for {rover.Key}"); foreach (var date in inputDates) { Console.WriteLine($"\t\t\tat {date.ToShortDateString()}"); if (date >= rover.Value.PhotoManifest.LandingDate && date <= rover.Value.PhotoManifest.RecentPhotoDate) { for (int i = 1; i <= pagesToRequest; i++) { Console.WriteLine($"\t\t\t\tPage {i}"); RoverPhotoPage photoPage = Task.Run(() => nasaClient.GetRoverPhotoPage(rover.Key, date, i)).Result; roverPhotoPages[rover.Key][date].Add(photoPage); } } } Console.WriteLine(); } Console.WriteLine("Download photos"); nasaClient.DownloadImagesForRovers(roverPhotoPages, Directory.GetCurrentDirectory()); Console.WriteLine("Done."); Console.WriteLine("Writing Rover Photo Pages to output.json"); FileHandler.WriteRoverPhotoPagesToJson(roverPhotoPages); Console.WriteLine("Done.\n"); } Console.WriteLine("Enter key to exit."); Console.ReadLine(); }