Skip to content
Snippets Groups Projects
Select Git revision
  • main
1 result

USAGE.md

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Program.cs 5.88 KiB
    using Coscine.Configuration;
    using System;
    using System.Net;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Diagnostics;
    using System.IO;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    
    namespace Coscine.CodeGen
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                GenerateCode().Wait();
            }
    
            public static async Task GenerateCode()
            {
                var configuration = new ConsulConfiguration();
    
                var jarDownloadLink = await configuration.GetStringAsync("coscine/local/codegen/jarlink",
                    //"https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.27/swagger-codegen-cli-3.0.27.jar"
                    "https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/5.2.1/openapi-generator-cli-5.2.1.jar"
                );
    
                var webClient = new WebClient();
    
                var jarFileName = await configuration.GetStringAsync("coscine/local/codegen/jarpath", "codegen.jar");
    
                await webClient.DownloadFileTaskAsync(new Uri(jarDownloadLink), jarFileName);
    
                var apiPrefix = "coscine/apis/";
    
                var keys = await configuration.KeysAsync(apiPrefix);
    
                var domainName = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
                var hostName = Dns.GetHostName();
    
                var outputPath = await configuration.GetStringAsync("coscine/local/codegen/outputpath", "Output");
    
                if (!Directory.Exists(outputPath))
                {
                    Directory.CreateDirectory(outputPath);
                }
    
                foreach (var key in keys.Select((entry) => entry.Split('/')[2]).Distinct())
                {
                    Console.WriteLine(key);
    
                    var swaggerUrl = $"https://{hostName}.{domainName}/coscine/api/{key}/swagger/v1/swagger.json";
    
                    var command = $"java \"-Dio.swagger.parser.util.RemoteUrl.trustAll=true\" \"-Dio.swagger.v3.parser.util.RemoteUrl.trustAll=true\" -jar \"{jarFileName}\" generate -i \"{swaggerUrl}\" -g typescript-axios -o \"{outputPath}/{key}\" --skip-validate-spec";
    
                    await ExecuteCommand(command);
                }
    
                var combinationFile = outputPath + "/apis.ts";
    
                var combinationFileImports = new List<string>();
                var combinationFileExports = new List<string>();
    
                var first = true;
    
                var apiRegex = new Regex("(?<= )(.*?)(?= extends BaseAPI)");
    
                foreach (var directory in Directory.GetDirectories(outputPath))
                {
                    var apiName = directory[(directory.LastIndexOf(".") + 1)..];
                    var directoryName = directory[(directory.LastIndexOf("\\") + 1)..];
    
                    apiName = apiName.Replace("Resources", "Resource");
                    apiName = apiName.Replace("Notices", "Notice");
    
                    var apiContent = File.ReadAllText($"./{outputPath}/{directoryName}/api.ts");
    
                    var apiImplementations = apiRegex.Matches(apiContent);
    
                    foreach (var apiImplementation in apiImplementations)
                    {
                        var concreteApiName = apiImplementation.ToString().Replace("class ", "");
                        combinationFileImports.Add($"import {{ {concreteApiName}Factory }} from './{directoryName}/api';");
                        if (first)
                        {
                            first = false;
                            combinationFileImports.Add($"import {{ Configuration }} from './{directoryName}/configuration';");
                        }
                        combinationFileExports.Add($"{concreteApiName}: {concreteApiName}Factory(new Configuration({{ 'accessToken': accessToken }}), 'https://' + getHostName() + '/coscine/api/{directoryName}', axios)");
                    }
                }
    
                combinationFileExports.Sort();
    
                var combinationFileText = "import { AxiosInstance } from 'axios';\n\n";
                combinationFileText += string.Join('\n', combinationFileImports);
                combinationFileText += "\n\n";
    
                combinationFileText += "let accessToken = '';";
                    
                combinationFileText += @"
    if (typeof coscine !== 'undefined') {
      accessToken = coscine.authorization.bearer;
    }
    
    const getHostName = () => {
      let hostName = typeof window !== 'undefined' ? window.location.hostname : 'coscine.rwth-aachen.de';
      if (hostName.indexOf(':') !== -1) {
        if (hostName.indexOf('https://') !== -1) {
          hostName = hostName.replace('https://', '');
        }
        hostName = hostName.substr(0, hostName.indexOf(':'));
      }
      return hostName;
    };
    
    ";
    
    
    
                combinationFileText += @"function implementations(axios?: AxiosInstance) {
      return {
        ";
                combinationFileText += string.Join(",\n    ", combinationFileExports);
                combinationFileText += "\n  };\n};\n\nexport default implementations;\n";
    
                await File.WriteAllTextAsync(combinationFile, combinationFileText);
            }
    
            private static Task ExecuteCommand(string command)
            {
                var startInfo = new ProcessStartInfo
                {
                    FileName = @"C:\Windows\System32\cmd.exe",
                    Arguments = "/c " + command,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                    CreateNoWindow = true,
                };
                using (var process = new Process
                {
                    StartInfo = startInfo
                })
                {
                    process.Start();
    
                    var outputTask = process.StandardOutput.ReadToEndAsync();
    
                    var errorTask = process.StandardError.ReadToEndAsync();
    
                    Task.WaitAll(outputTask, errorTask);
    
                    Console.WriteLine(outputTask.Result);
                    Console.WriteLine(errorTask.Result);
    
                    return process.WaitForExitAsync();
                }
            }
    
        }
    }