forked from FarmMaps/FarmMapsApiClient
		
	refactored program
This commit is contained in:
		@@ -1,38 +1,11 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Net.Http;
 | 
					 | 
				
			||||||
using System.Threading;
 | 
					using System.Threading;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
using FarmmapsApi.HttpMessageHandlers;
 | 
					 | 
				
			||||||
using FarmmapsApi.Models;
 | 
					 | 
				
			||||||
using FarmmapsApi.Services;
 | 
					 | 
				
			||||||
using IdentityModel.Client;
 | 
					 | 
				
			||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace FarmmapsApi
 | 
					namespace FarmmapsApi
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public static class Extensions
 | 
					    public static class Extensions
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public static IServiceCollection AddFarmmapsServices(this IServiceCollection serviceCollection,
 | 
					 | 
				
			||||||
            Configuration configuration)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return serviceCollection
 | 
					 | 
				
			||||||
                .AddSingleton(configuration)
 | 
					 | 
				
			||||||
                .AddSingleton<IDiscoveryCache>(sp =>
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    var httpFactory = sp.GetRequiredService<IHttpClientFactory>();
 | 
					 | 
				
			||||||
                    return new DiscoveryCache(configuration.DiscoveryEndpointUrl,
 | 
					 | 
				
			||||||
                        () => httpFactory.CreateClient());
 | 
					 | 
				
			||||||
                })
 | 
					 | 
				
			||||||
                .AddSingleton<HttpClientSettings>()
 | 
					 | 
				
			||||||
                .AddSingleton<FarmmapsEventHub>()
 | 
					 | 
				
			||||||
                .AddTransient<OpenIdConnectService>()
 | 
					 | 
				
			||||||
                .AddTransient<FarmmapsAuthenticationHandler>()
 | 
					 | 
				
			||||||
                .AddTransient<GeneralService>()
 | 
					 | 
				
			||||||
                .AddHttpClient<FarmmapsApiService>()
 | 
					 | 
				
			||||||
                .AddHttpMessageHandler<FarmmapsAuthenticationHandler>()
 | 
					 | 
				
			||||||
                .Services;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public static async Task PollTask(TimeSpan retryTime, Func<CancellationTokenSource, Task> callback)
 | 
					        public static async Task PollTask(TimeSpan retryTime, Func<CancellationTokenSource, Task> callback)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var tokenSource = new CancellationTokenSource();
 | 
					            var tokenSource = new CancellationTokenSource();
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										52
									
								
								FarmmapsApi/FarmmapsProgram.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								FarmmapsApi/FarmmapsProgram.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					using System.Net.Http;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using FarmmapsApi.HttpMessageHandlers;
 | 
				
			||||||
 | 
					using FarmmapsApi.Models;
 | 
				
			||||||
 | 
					using FarmmapsApi.Services;
 | 
				
			||||||
 | 
					using IdentityModel.Client;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Configuration;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsApi
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public abstract class FarmmapsProgram<T> where T : class, IApplication
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public async Task Start(string[] args)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            IConfiguration config = new ConfigurationBuilder()
 | 
				
			||||||
 | 
					                .AddJsonFile("appsettings.json", false, true)
 | 
				
			||||||
 | 
					                .Build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var configuration = config.Get<Configuration>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var serviceCollection = new ServiceCollection()
 | 
				
			||||||
 | 
					                .AddSingleton(configuration)
 | 
				
			||||||
 | 
					                .AddSingleton<IDiscoveryCache>(sp =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var httpFactory = sp.GetRequiredService<IHttpClientFactory>();
 | 
				
			||||||
 | 
					                    return new DiscoveryCache(configuration.DiscoveryEndpointUrl,
 | 
				
			||||||
 | 
					                        () => httpFactory.CreateClient());
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					                .AddSingleton<HttpClientSettings>()
 | 
				
			||||||
 | 
					                .AddSingleton<FarmmapsEventHub>()
 | 
				
			||||||
 | 
					                .AddSingleton<T>()
 | 
				
			||||||
 | 
					                .AddTransient<OpenIdConnectService>()
 | 
				
			||||||
 | 
					                .AddTransient<FarmmapsAuthenticationHandler>()
 | 
				
			||||||
 | 
					                .AddTransient<GeneralService>()
 | 
				
			||||||
 | 
					                .AddHttpClient<FarmmapsApiService>()
 | 
				
			||||||
 | 
					                .AddHttpMessageHandler<FarmmapsAuthenticationHandler>()
 | 
				
			||||||
 | 
					                .Services;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Configure(serviceCollection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var serviceProvider = serviceCollection.BuildServiceProvider();
 | 
				
			||||||
 | 
					            await serviceProvider.GetService<FarmmapsApiService>().AuthenticateAsync();
 | 
				
			||||||
 | 
					//            await serviceProvider.GetService<FarmmapsEventHub>().StartEventHub();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            await serviceProvider.GetRequiredService<T>().RunAsync();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected abstract void Configure(IServiceCollection serviceCollection);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								FarmmapsApi/IApplication.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								FarmmapsApi/IApplication.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsApi
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public interface IApplication
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Task RunAsync();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -6,6 +6,7 @@ using System.Threading.Tasks;
 | 
				
			|||||||
using FarmmapsApi.Models;
 | 
					using FarmmapsApi.Models;
 | 
				
			||||||
using Google.Apis.Upload;
 | 
					using Google.Apis.Upload;
 | 
				
			||||||
using Microsoft.Extensions.Logging;
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
 | 
					using Newtonsoft.Json.Linq;
 | 
				
			||||||
using static FarmmapsApi.Extensions;
 | 
					using static FarmmapsApi.Extensions;
 | 
				
			||||||
using static FarmmapsApiSamples.Constants;
 | 
					using static FarmmapsApiSamples.Constants;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -24,6 +25,23 @@ namespace FarmmapsApi.Services
 | 
				
			|||||||
            _farmmapsApiService = farmmapsApiService;
 | 
					            _farmmapsApiService = farmmapsApiService;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        public async Task<Item> CreateCropfieldItemAsync(string parentItemCode, string name, int year, string fieldGeomJson)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var currentYear = new DateTime(year, 1, 1);
 | 
				
			||||||
 | 
					            var cropfieldItemRequest = new ItemRequest()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                ParentCode = parentItemCode,
 | 
				
			||||||
 | 
					                ItemType = CROPFIELD_ITEMTYPE,
 | 
				
			||||||
 | 
					                Name = name,
 | 
				
			||||||
 | 
					                DataDate = currentYear,
 | 
				
			||||||
 | 
					                DataEndDate = currentYear.AddYears(1).AddDays(-1),
 | 
				
			||||||
 | 
					                Data = JObject.Parse("{}"),
 | 
				
			||||||
 | 
					                Geometry = JObject.Parse(fieldGeomJson)
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return await _farmmapsApiService.CreateItemAsync(cropfieldItemRequest);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        public async Task<Item> UploadDataAsync(UserRoot root, string itemType, string filePath, string itemName)
 | 
					        public async Task<Item> UploadDataAsync(UserRoot root, string itemType, string filePath, string itemName)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var startUpload = DateTime.UtcNow;
 | 
					            var startUpload = DateTime.UtcNow;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Microsoft Visual Studio Solution File, Format Version 12.00
 | 
					Microsoft Visual Studio Solution File, Format Version 12.00
 | 
				
			||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FarmmapsApiSamples", "FarmmapsApiSamples\FarmmapsApiSamples.csproj", "{E08EF7E9-F09E-42D8-825C-164E458C78F4}"
 | 
					Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FarmmapsNbs", "FarmmapsNbs\FarmmapsNbs.csproj", "{E08EF7E9-F09E-42D8-825C-164E458C78F4}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FarmmapsApi", "FarmmapsApi\FarmmapsApi.csproj", "{1FA9E50B-F45E-4534-953A-37C783D03C74}"
 | 
					Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FarmmapsApi", "FarmmapsApi\FarmmapsApi.csproj", "{1FA9E50B-F45E-4534-953A-37C783D03C74}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +0,0 @@
 | 
				
			|||||||
using System.Collections.Generic;
 | 
					 | 
				
			||||||
using System.Threading.Tasks;
 | 
					 | 
				
			||||||
using FarmmapsApi.Models;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace FarmmapsApiSamples
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    public interface ITestFlow
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        Task TestFlow(List<UserRoot> roots);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,78 +0,0 @@
 | 
				
			|||||||
using System;
 | 
					 | 
				
			||||||
using System.Threading.Tasks;
 | 
					 | 
				
			||||||
using FarmmapsApi;
 | 
					 | 
				
			||||||
using FarmmapsApi.Models;
 | 
					 | 
				
			||||||
using FarmmapsApi.Services;
 | 
					 | 
				
			||||||
using Microsoft.Extensions.Configuration;
 | 
					 | 
				
			||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					 | 
				
			||||||
using Microsoft.Extensions.Logging;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace FarmmapsApiSamples
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    class Program
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        private readonly ILogger<Program> _logger;
 | 
					 | 
				
			||||||
        private readonly FarmmapsApiService _farmmapsApiService;
 | 
					 | 
				
			||||||
        private readonly FarmmapsEventHub _farmmapsEventHub;
 | 
					 | 
				
			||||||
        private readonly NitrogenService _nitrogenService;
 | 
					 | 
				
			||||||
        private readonly HerbicideService _herbicideService;
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        private static async Task Main(string[] args)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            IConfiguration config = new ConfigurationBuilder()
 | 
					 | 
				
			||||||
                .AddJsonFile("appsettings.json", false, true)
 | 
					 | 
				
			||||||
                .Build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            var configuration = config.Get<Configuration>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            var serviceProvider = new ServiceCollection()
 | 
					 | 
				
			||||||
                .AddLogging(opts => opts
 | 
					 | 
				
			||||||
                    .AddConsole()
 | 
					 | 
				
			||||||
                    .AddFilter("System.Net.Http", LogLevel.Warning))
 | 
					 | 
				
			||||||
                .AddFarmmapsServices(configuration)
 | 
					 | 
				
			||||||
                .AddTransient<NitrogenService>()
 | 
					 | 
				
			||||||
                .AddTransient<HerbicideService>()
 | 
					 | 
				
			||||||
                .AddSingleton<Program>()
 | 
					 | 
				
			||||||
                .BuildServiceProvider();
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            await serviceProvider.GetService<FarmmapsApiService>().AuthenticateAsync();
 | 
					 | 
				
			||||||
//            await serviceProvider.GetService<FarmmapsEventHub>().StartEventHub();
 | 
					 | 
				
			||||||
            await serviceProvider.GetService<Program>().RunAsync();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public Program(ILogger<Program> logger, FarmmapsApiService farmmapsApiService,
 | 
					 | 
				
			||||||
            FarmmapsEventHub farmmapsEventHub, NitrogenService nitrogenService,
 | 
					 | 
				
			||||||
            HerbicideService herbicideService)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            _logger = logger;
 | 
					 | 
				
			||||||
            _farmmapsApiService = farmmapsApiService;
 | 
					 | 
				
			||||||
            _farmmapsEventHub = farmmapsEventHub;
 | 
					 | 
				
			||||||
            _nitrogenService = nitrogenService;
 | 
					 | 
				
			||||||
            _herbicideService = herbicideService;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            _farmmapsEventHub.EventCallback += OnEvent;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        private void OnEvent(EventMessage @event)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
//            _logger.LogInformation(@event.EventType);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public async Task RunAsync()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            try
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                // !! this call is needed the first time an api is called with a fresh clientid and secret !!
 | 
					 | 
				
			||||||
                await _farmmapsApiService.GetCurrentUserCodeAsync();
 | 
					 | 
				
			||||||
                var roots = await _farmmapsApiService.GetCurrentUserRootsAsync();
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
                await _nitrogenService.TestFlow(roots);
 | 
					 | 
				
			||||||
//                await _herbicideService.TestFlow(roots);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            catch (Exception ex)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _logger.LogError(ex.Message);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -14,7 +14,7 @@ using static FarmmapsApiSamples.Constants;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace FarmmapsApiSamples
 | 
					namespace FarmmapsApiSamples
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public class HerbicideService : ITestFlow
 | 
					    public class HerbicideService
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        private readonly ILogger<HerbicideService> _logger;
 | 
					        private readonly ILogger<HerbicideService> _logger;
 | 
				
			||||||
        private readonly FarmmapsApiService _farmmapsApiService;
 | 
					        private readonly FarmmapsApiService _farmmapsApiService;
 | 
				
			||||||
							
								
								
									
										107
									
								
								FarmmapsNbs/NbsApplication.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								FarmmapsNbs/NbsApplication.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.IO;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using FarmmapsApi;
 | 
				
			||||||
 | 
					using FarmmapsApi.Services;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsApiSamples
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class NbsApplication : IApplication
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private const string DownloadFolder = "Downloads";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private readonly ILogger<NbsApplication> _logger;
 | 
				
			||||||
 | 
					        private readonly FarmmapsApiService _farmmapsApiService;
 | 
				
			||||||
 | 
					        private readonly FarmmapsEventHub _farmmapsEventHub;
 | 
				
			||||||
 | 
					        private readonly NitrogenService _nitrogenService;
 | 
				
			||||||
 | 
					        private readonly GeneralService _generalService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public NbsApplication(ILogger<NbsApplication> logger, FarmmapsApiService farmmapsApiService,
 | 
				
			||||||
 | 
					            GeneralService generalService, NitrogenService nitrogenService)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _logger = logger;
 | 
				
			||||||
 | 
					            _farmmapsApiService = farmmapsApiService;
 | 
				
			||||||
 | 
					            _generalService = generalService;
 | 
				
			||||||
 | 
					            _nitrogenService = nitrogenService;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public async Task RunAsync()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                // !! this call is needed the first time an api is called with a fresh clientid and secret !!
 | 
				
			||||||
 | 
					                await _farmmapsApiService.GetCurrentUserCodeAsync();
 | 
				
			||||||
 | 
					                var roots = await _farmmapsApiService.GetCurrentUserRootsAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!Directory.Exists(DownloadFolder))
 | 
				
			||||||
 | 
					                    Directory.CreateDirectory(DownloadFolder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var plantingDate = new DateTime(DateTime.UtcNow.Year, 2, 1);
 | 
				
			||||||
 | 
					                var measurementDate = plantingDate.AddMonths(5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var uploadedRoot = roots.SingleOrDefault(r => r.Name == "Uploaded");
 | 
				
			||||||
 | 
					                if (uploadedRoot == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _logger.LogError("Could not find a needed root item");
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var myDriveRoot = roots.SingleOrDefault(r => r.Name == "My drive");
 | 
				
			||||||
 | 
					                if (myDriveRoot == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _logger.LogError("Could not find a needed root item");
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var cropfieldItem = await _generalService.CreateCropfieldItemAsync(myDriveRoot.Code, "VRA NBS cropfield", 2020,
 | 
				
			||||||
 | 
					                    @"{ ""type"": ""Polygon"", ""coordinates"": [ [ [ 3.40843828875524, 50.638966444680605 ], [ 3.408953272886064, 50.639197789621612 ], [ 3.409242951459603, 50.639469958681836 ], [ 3.409328782148028, 50.639612846807708 ], [ 3.409457528180712, 50.639789755314411 ], [ 3.409639918393741, 50.640014292074966 ], [ 3.409833037442765, 50.640211611372706 ], [ 3.410069071836049, 50.640395321698435 ], [ 3.410380208081761, 50.640572227259661 ], [ 3.410605513638958, 50.640715112034222 ], [ 3.411925160474145, 50.641177783561204 ], [ 3.411935889310142, 50.640728720085136 ], [ 3.412590348309737, 50.63948356709389 ], [ 3.413244807309242, 50.638224772339846 ], [ 3.413400375432099, 50.637901562841307 ], [ 3.413539850300779, 50.637449065809889 ], [ 3.413475477284437, 50.637418445552932 ], [ 3.40999396998362, 50.637449065810451 ], [ 3.409940325803365, 50.638102293212661 ], [ 3.409575545377398, 50.638483338338325 ], [ 3.409060561246574, 50.638707881340494 ], [ 3.40843828875524, 50.638966444680605 ] ] ] }");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var dataPath = Path.Combine("Data", "Nbs", "Scan_1_20190605.zip");
 | 
				
			||||||
 | 
					                var isariaShapeItem =
 | 
				
			||||||
 | 
					                    await _generalService.UploadZipWithShapeAsync(uploadedRoot, dataPath, "Scan_1_20190605");
 | 
				
			||||||
 | 
					                if (isariaShapeItem == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _logger.LogError("Could not find isaria shape item");
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                _logger.LogInformation($"Converting shape to geotiff");
 | 
				
			||||||
 | 
					                var isariaGeotiffItem = await _generalService.ShapeToGeotiff(isariaShapeItem);
 | 
				
			||||||
 | 
					                if (isariaGeotiffItem == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _logger.LogError("Something went wrong with isaria shape to geotiff transformation");
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                _logger.LogInformation($"Calculating targetN with targetYield: {60}");
 | 
				
			||||||
 | 
					                var targetNItem = await _nitrogenService.CreateTargetNItem(cropfieldItem);
 | 
				
			||||||
 | 
					                var targetN = await _nitrogenService.CalculateTargetN(cropfieldItem, targetNItem, plantingDate, measurementDate,
 | 
				
			||||||
 | 
					                    "consumption", "irmi", 60);
 | 
				
			||||||
 | 
					                _logger.LogInformation($"TargetN: {targetN}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                _logger.LogInformation("Calculating uptake map");
 | 
				
			||||||
 | 
					                var uptakeMapItem =
 | 
				
			||||||
 | 
					                    await _nitrogenService.CalculateUptakeMap(cropfieldItem, isariaGeotiffItem, plantingDate, measurementDate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                _logger.LogInformation("Downloading uptake map");
 | 
				
			||||||
 | 
					                await _farmmapsApiService.DownloadItemAsync(uptakeMapItem.Code,
 | 
				
			||||||
 | 
					                    Path.Combine(DownloadFolder, $"{uptakeMapItem.Name}.zip"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                _logger.LogInformation("Calculating appliance map");
 | 
				
			||||||
 | 
					                var applianceMapItem =
 | 
				
			||||||
 | 
					                    await _nitrogenService.CalculateApplicationMap(cropfieldItem, isariaGeotiffItem, plantingDate, measurementDate,
 | 
				
			||||||
 | 
					                        "irmi", targetN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                _logger.LogInformation("Downloading appliance map");
 | 
				
			||||||
 | 
					                await _farmmapsApiService.DownloadItemAsync(applianceMapItem.Code,
 | 
				
			||||||
 | 
					                    Path.Combine(DownloadFolder, $"{applianceMapItem.Name}.zip"));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _logger.LogError(ex.Message);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -13,7 +13,7 @@ using static FarmmapsApiSamples.Constants;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace FarmmapsApiSamples
 | 
					namespace FarmmapsApiSamples
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public class NitrogenService : ITestFlow
 | 
					    public class NitrogenService
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        private readonly ILogger<NitrogenService> _logger;
 | 
					        private readonly ILogger<NitrogenService> _logger;
 | 
				
			||||||
        private readonly FarmmapsApiService _farmmapsApiService;
 | 
					        private readonly FarmmapsApiService _farmmapsApiService;
 | 
				
			||||||
@@ -27,85 +27,6 @@ namespace FarmmapsApiSamples
 | 
				
			|||||||
            _generalService = generalService;
 | 
					            _generalService = generalService;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public async Task TestFlow(List<UserRoot> roots)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            var downloadFolder = "Downloads";
 | 
					 | 
				
			||||||
            if (!Directory.Exists(downloadFolder))
 | 
					 | 
				
			||||||
                Directory.CreateDirectory(downloadFolder);
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            var plantingDate = new DateTime(DateTime.UtcNow.Year, 2, 1);
 | 
					 | 
				
			||||||
            var measurementDate = plantingDate.AddMonths(5);
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            var uploadedRoot = roots.SingleOrDefault(r => r.Name == "Uploaded");
 | 
					 | 
				
			||||||
            if (uploadedRoot == null)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _logger.LogError("Could not find a needed root item");
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            var myDriveRoot = roots.SingleOrDefault(r => r.Name == "My drive");
 | 
					 | 
				
			||||||
            if (myDriveRoot == null)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _logger.LogError("Could not find a needed root item");
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            var cropfieldItem = await CreateCropfieldItemAsync(myDriveRoot.Code, "VRA NBS cropfield", 2020, 
 | 
					 | 
				
			||||||
                @"{ ""type"": ""Polygon"", ""coordinates"": [ [ [ 3.40843828875524, 50.638966444680605 ], [ 3.408953272886064, 50.639197789621612 ], [ 3.409242951459603, 50.639469958681836 ], [ 3.409328782148028, 50.639612846807708 ], [ 3.409457528180712, 50.639789755314411 ], [ 3.409639918393741, 50.640014292074966 ], [ 3.409833037442765, 50.640211611372706 ], [ 3.410069071836049, 50.640395321698435 ], [ 3.410380208081761, 50.640572227259661 ], [ 3.410605513638958, 50.640715112034222 ], [ 3.411925160474145, 50.641177783561204 ], [ 3.411935889310142, 50.640728720085136 ], [ 3.412590348309737, 50.63948356709389 ], [ 3.413244807309242, 50.638224772339846 ], [ 3.413400375432099, 50.637901562841307 ], [ 3.413539850300779, 50.637449065809889 ], [ 3.413475477284437, 50.637418445552932 ], [ 3.40999396998362, 50.637449065810451 ], [ 3.409940325803365, 50.638102293212661 ], [ 3.409575545377398, 50.638483338338325 ], [ 3.409060561246574, 50.638707881340494 ], [ 3.40843828875524, 50.638966444680605 ] ] ] }");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            var dataPath = Path.Combine("Data", "Nbs", "Scan_1_20190605.zip");
 | 
					 | 
				
			||||||
            var isariaShapeItem = await _generalService.UploadZipWithShapeAsync(uploadedRoot, dataPath, "Scan_1_20190605");
 | 
					 | 
				
			||||||
            if (isariaShapeItem == null)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _logger.LogError("Could not find isaria shape item");
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            _logger.LogInformation($"Converting shape to geotiff");
 | 
					 | 
				
			||||||
            var isariaGeotiffItem = await _generalService.ShapeToGeotiff(isariaShapeItem);
 | 
					 | 
				
			||||||
            if (isariaGeotiffItem == null)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _logger.LogError("Something went wrong with isaria shape to geotiff transformation");
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            _logger.LogInformation($"Calculating targetN with targetYield: {60}");
 | 
					 | 
				
			||||||
            var targetNItem = await CreateTargetNItem(cropfieldItem);
 | 
					 | 
				
			||||||
            var targetN = await CalculateTargetN(cropfieldItem, targetNItem, plantingDate, measurementDate, "consumption", "irmi", 60);
 | 
					 | 
				
			||||||
            _logger.LogInformation($"TargetN: {targetN}");
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            _logger.LogInformation("Calculating uptake map");
 | 
					 | 
				
			||||||
            var uptakeMapItem =
 | 
					 | 
				
			||||||
                await CalculateUptakeMap(cropfieldItem, isariaGeotiffItem, plantingDate, measurementDate);
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            _logger.LogInformation("Downloading uptake map");
 | 
					 | 
				
			||||||
            await _farmmapsApiService.DownloadItemAsync(uptakeMapItem.Code, Path.Combine(downloadFolder, $"{uptakeMapItem.Name}.zip"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            _logger.LogInformation("Calculating appliance map");
 | 
					 | 
				
			||||||
            var applianceMapItem =
 | 
					 | 
				
			||||||
                await CalculateApplicationMap(cropfieldItem, isariaGeotiffItem, plantingDate, measurementDate, "irmi", targetN);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            _logger.LogInformation("Downloading appliance map");
 | 
					 | 
				
			||||||
            await _farmmapsApiService.DownloadItemAsync(applianceMapItem.Code, Path.Combine(downloadFolder, $"{applianceMapItem.Name}.zip"));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        private async Task<Item> CreateCropfieldItemAsync(string parentItemCode, string name, int year, string fieldGeomJson)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            var currentYear = new DateTime(year, 1, 1);
 | 
					 | 
				
			||||||
            var cropfieldItemRequest = new ItemRequest()
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                ParentCode = parentItemCode,
 | 
					 | 
				
			||||||
                ItemType = CROPFIELD_ITEMTYPE,
 | 
					 | 
				
			||||||
                Name = name,
 | 
					 | 
				
			||||||
                DataDate = currentYear,
 | 
					 | 
				
			||||||
                DataEndDate = currentYear.AddYears(1).AddDays(-1),
 | 
					 | 
				
			||||||
                Data = JObject.Parse("{}"),
 | 
					 | 
				
			||||||
                Geometry = JObject.Parse(fieldGeomJson)
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return await _farmmapsApiService.CreateItemAsync(cropfieldItemRequest);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public async Task<Item> CreateTargetNItem(Item cropfieldItem)
 | 
					        public async Task<Item> CreateTargetNItem(Item cropfieldItem)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var itemRequest = new ItemRequest()
 | 
					            var itemRequest = new ItemRequest()
 | 
				
			||||||
							
								
								
									
										23
									
								
								FarmmapsNbs/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								FarmmapsNbs/Program.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using FarmmapsApi;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsApiSamples
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    class Program : FarmmapsProgram<NbsApplication>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private static async Task Main(string[] args)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await new Program().Start(args);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void Configure(IServiceCollection serviceCollection)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            serviceCollection.AddLogging(opts => opts
 | 
				
			||||||
 | 
					                    .AddConsole()
 | 
				
			||||||
 | 
					                    .AddFilter("System.Net.Http", LogLevel.Warning))
 | 
				
			||||||
 | 
					                .AddTransient<NitrogenService>();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "Authority": "https://accounts.farmmaps.awtest.nl/",
 | 
					  "Authority": "https://accounts.farmmaps.awtest.nl/",
 | 
				
			||||||
  "Endpoint": "https://farmmaps.awtest.nl/",
 | 
					  "Endpoint": "https://farmmaps.awtest.nl/",
 | 
				
			||||||
  "BasePath": "api/v1",
 | 
					  "BasePath": "api/v1",
 | 
				
			||||||
		Reference in New Issue
	
	Block a user