WIP /search
This commit is contained in:
39
.vscode/tasks.json
vendored
39
.vscode/tasks.json
vendored
@ -1,19 +1,6 @@
|
|||||||
{
|
{
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"tasks": [
|
"tasks": [
|
||||||
{
|
|
||||||
"label": "restore",
|
|
||||||
"command": "dotnet",
|
|
||||||
"type": "process",
|
|
||||||
"args": [
|
|
||||||
"restore",
|
|
||||||
"/property:GenerateFullPaths=true",
|
|
||||||
"/consoleloggerparameters:NoSummary",
|
|
||||||
"--ignore-failed-sources"
|
|
||||||
],
|
|
||||||
"problemMatcher": "$msCompile",
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "build",
|
"label": "build",
|
||||||
"command": "dotnet",
|
"command": "dotnet",
|
||||||
@ -46,21 +33,6 @@
|
|||||||
"dependsOn":["build"],
|
"dependsOn":["build"],
|
||||||
"group": "test"
|
"group": "test"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
|
||||||
"label": "buildcli",
|
|
||||||
"command": "msbuild",
|
|
||||||
"type": "process",
|
|
||||||
"args": [
|
|
||||||
"src/isn",
|
|
||||||
"/p:Configuration=Debug",
|
|
||||||
"/property:GenerateFullPaths=true",
|
|
||||||
"/consoleloggerparameters:NoSummary",
|
|
||||||
"/restore"
|
|
||||||
],
|
|
||||||
"problemMatcher": "$msCompile",
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "publish",
|
"label": "publish",
|
||||||
"command": "dotnet",
|
"command": "dotnet",
|
||||||
@ -79,17 +51,6 @@
|
|||||||
},
|
},
|
||||||
"group": "none"
|
"group": "none"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"label": "monopublish",
|
|
||||||
"command": "msbuild",
|
|
||||||
"type": "process",
|
|
||||||
"args": [
|
|
||||||
"/t:publish",
|
|
||||||
"/p:TargetFramework=netcoreapp2.1;PublishDir=${workspaceFolder}/artiffacts;RuntimeIdentifier=linux-x64",
|
|
||||||
|
|
||||||
],
|
|
||||||
"problemMatcher": "$msCompile"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "test",
|
"label": "test",
|
||||||
"command": "dotnet",
|
"command": "dotnet",
|
||||||
|
14
Makefile
14
Makefile
@ -24,9 +24,21 @@ packs: pack-isn pack-isnd pack-isn.abst
|
|||||||
clean: clean-isnd clean-isn clean-isn.abst
|
clean: clean-isnd clean-isn clean-isn.abst
|
||||||
|
|
||||||
server-update:
|
server-update:
|
||||||
dotnet build -c Release
|
dotnet build -c Release src/isnd
|
||||||
dotnet publish -c Release -f net7.0 src/isnd
|
dotnet publish -c Release -f net7.0 src/isnd
|
||||||
sudo systemctl stop isnd
|
sudo systemctl stop isnd
|
||||||
sudo cp -a src/isnd/bin/Release/net7.0/publish/* /srv/www/isnd
|
sudo cp -a src/isnd/bin/Release/net7.0/publish/* /srv/www/isnd
|
||||||
sudo systemctl start isnd
|
sudo systemctl start isnd
|
||||||
|
|
||||||
|
client-update:
|
||||||
|
dotnet build -c Release src/isn
|
||||||
|
# MAJ du client
|
||||||
|
sudo cp -a src/isn/bin/Release/net7.0/* /usr/local/lib/isn
|
||||||
|
sudo chown -R root:root /usr/local/lib/isn
|
||||||
|
|
||||||
|
src/isn.abst/bin/Release/isn.abst.1.0.24.nupkg:
|
||||||
|
dotnet pack src/isn.abst -c Release
|
||||||
|
|
||||||
|
push-test: src/isn.abst/bin/Release/isn.abst.1.0.24.nupkg
|
||||||
|
isn push -s "http://localhost:3002/v3/index.json" src/isn.abst/bin/Release/isn.abst.1.0.24.nupkg
|
||||||
|
|
||||||
|
10
README.md
10
README.md
@ -75,6 +75,8 @@ sudo ln -s /usr/local/lib/isn/isn /usr/local/bin/isn
|
|||||||
|
|
||||||
### Mises à jour
|
### Mises à jour
|
||||||
|
|
||||||
|
Dans le détail, la séquence serait du style :
|
||||||
|
|
||||||
````bash
|
````bash
|
||||||
# compiler tout
|
# compiler tout
|
||||||
dotnet build -c Release
|
dotnet build -c Release
|
||||||
@ -87,3 +89,11 @@ sudo systemctl start isnd
|
|||||||
sudo cp -a src/isn/bin/Release/net7.0/* /usr/local/lib/isn
|
sudo cp -a src/isn/bin/Release/net7.0/* /usr/local/lib/isn
|
||||||
sudo chown -R root:root /usr/local/lib/isn
|
sudo chown -R root:root /usr/local/lib/isn
|
||||||
````
|
````
|
||||||
|
|
||||||
|
On pourra cibler "client-update" ou "server-update", à la construction :
|
||||||
|
|
||||||
|
|
||||||
|
````bash
|
||||||
|
make server-update
|
||||||
|
make client-update
|
||||||
|
````
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using isn.abst;
|
using isn.abst;
|
||||||
|
|
||||||
namespace isnd.Entities
|
namespace isnd.Entities
|
||||||
@ -15,6 +16,8 @@ namespace isnd.Entities
|
|||||||
public const string Content = "/content";
|
public const string Content = "/content";
|
||||||
public const string Nuget = "/nuget";
|
public const string Nuget = "/nuget";
|
||||||
|
|
||||||
public const string Find = "/index/FindPackagesById()"; // /FindPackagesById()?id='isn.abst'&semVerLevel=2.0.0
|
[Obsolete("use the V3 search")]
|
||||||
|
|
||||||
|
public const string V2Find = "/v2/FindPackagesById()"; // /FindPackagesById()??$filter=IsLatestVersion&$orderby=Version desc&$top=1&id='isn.abst'
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,6 +4,11 @@ namespace isnd.Data.Catalog
|
|||||||
{
|
{
|
||||||
public abstract class Permalink
|
public abstract class Permalink
|
||||||
{
|
{
|
||||||
|
public Permalink(string id)
|
||||||
|
{
|
||||||
|
Type = GetType().Name;
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
public Permalink(string id, string type)
|
public Permalink(string id, string type)
|
||||||
{
|
{
|
||||||
@ -11,11 +16,6 @@ namespace isnd.Data.Catalog
|
|||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Permalink(string id)
|
|
||||||
{
|
|
||||||
Type = GetType().Name;
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty("@type")]
|
[JsonProperty("@type")]
|
||||||
public virtual string Type { get; set; }
|
public virtual string Type { get; set; }
|
||||||
@ -23,7 +23,7 @@ namespace isnd.Data.Catalog
|
|||||||
|
|
||||||
[JsonProperty("@id")]
|
[JsonProperty("@id")]
|
||||||
public string Id { get => id; }
|
public string Id { get => id; }
|
||||||
private readonly string id;
|
protected string id;
|
||||||
|
|
||||||
public string GetId() { return id; }
|
public string GetId() { return id; }
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PackageVersion>1.0.1</PackageVersion>
|
<PackageVersion>1.0.1</PackageVersion>
|
||||||
<Version>1.0.7</Version>
|
<Version>1.0.7</Version>
|
||||||
<TargetFrameworks>net7.0</TargetFrameworks>
|
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
||||||
<NoWarn>NETSDK1138</NoWarn>
|
<NoWarn>NETSDK1138</NoWarn>
|
||||||
<AssemblyVersion>1.0.7.0</AssemblyVersion>
|
<AssemblyVersion>1.0.7.0</AssemblyVersion>
|
||||||
<FileVersion>1.0.7.0</FileVersion>
|
<FileVersion>1.0.7.0</FileVersion>
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
using Mono.Options;
|
using Mono.Options;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
@ -16,12 +18,18 @@ namespace isn
|
|||||||
if (cfgSettingIf.Exists)
|
if (cfgSettingIf.Exists)
|
||||||
{
|
{
|
||||||
var json = File.ReadAllText(cfgSettingIf.FullName);
|
var json = File.ReadAllText(cfgSettingIf.FullName);
|
||||||
settings = JsonConvert.DeserializeObject<Settings>(json);
|
Settings = JsonConvert.DeserializeObject<Settings>(json);
|
||||||
CurrentSource = settings.DefaultSourceKey;
|
CurrentSource = Settings.DefaultSourceKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Settings==null)
|
||||||
|
{
|
||||||
|
Settings= Settings.Create();
|
||||||
|
}
|
||||||
|
rsa = RSA.Create(Settings.RSAParameters);
|
||||||
}
|
}
|
||||||
static readonly OptionSet storeoptions = new OptionSet {
|
static readonly OptionSet storeoptions = new OptionSet {
|
||||||
{ "s|source=", "use source", val => CurrentSource ??= val },
|
{ "s|source=", "use source", val => Settings.CurrentSourceKey ??= val },
|
||||||
{ "h|help", "show this message and exit", h => shouldShowPushHelp = h != null },
|
{ "h|help", "show this message and exit", h => shouldShowPushHelp = h != null },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -38,11 +46,9 @@ namespace isn
|
|||||||
{ "v|version", "show soft version info and exit", h => shouldShowVersion = h != null }
|
{ "v|version", "show soft version info and exit", h => shouldShowVersion = h != null }
|
||||||
};
|
};
|
||||||
|
|
||||||
static string apiKey;
|
|
||||||
|
|
||||||
static readonly OptionSet pushoptions = new OptionSet {
|
static readonly OptionSet pushoptions = new OptionSet {
|
||||||
{ "k|api-key=", "use api key", val => apiKey = apiKey ?? val },
|
{ "k|api-key=", "use api key", val => Settings.CurrentSource.SetApiKey(rsa, val)},
|
||||||
{ "s|source=", "use source", val => CurrentSource = CurrentSource ?? val },
|
{ "s|source=", "use source", val => Settings.CurrentSourceKey = val },
|
||||||
{ "h|help", "show this message and exit", h => shouldShowPushHelp = h != null },
|
{ "h|help", "show this message and exit", h => shouldShowPushHelp = h != null },
|
||||||
};
|
};
|
||||||
static readonly OptionSet sourceoptions = new OptionSet {
|
static readonly OptionSet sourceoptions = new OptionSet {
|
||||||
@ -57,31 +63,21 @@ namespace isn
|
|||||||
private static bool shouldShowVersion;
|
private static bool shouldShowVersion;
|
||||||
private static bool shouldShowSourceHelp;
|
private static bool shouldShowSourceHelp;
|
||||||
private static bool shouldShowPushHelp;
|
private static bool shouldShowPushHelp;
|
||||||
|
public static RSA rsa;
|
||||||
static Settings settings = null;
|
|
||||||
|
|
||||||
public static Settings Settings
|
public static Settings Settings
|
||||||
{
|
{
|
||||||
get
|
get; set;
|
||||||
{
|
|
||||||
if (settings == null)
|
|
||||||
LoadConfig();
|
|
||||||
if (settings == null)
|
|
||||||
{
|
|
||||||
settings = new Settings
|
|
||||||
{
|
|
||||||
DataProtectionTitle = "isn",
|
|
||||||
Sources = new Dictionary<string, SourceSettings>()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return settings;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static string CurrentSource { get => Settings.CurrentSourceKey; set => Settings.CurrentSourceKey = value; }
|
public static string CurrentSource { get => Settings.CurrentSourceKey; set => Settings.CurrentSourceKey = value; }
|
||||||
|
|
||||||
static int Main(string[] args)
|
static int Main(string[] args)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
LoadConfig();
|
||||||
|
|
||||||
var commandSet = new CommandSet("isn");
|
var commandSet = new CommandSet("isn");
|
||||||
var srclst = new Command("list")
|
var srclst = new Command("list")
|
||||||
{
|
{
|
||||||
@ -213,7 +209,6 @@ namespace isn
|
|||||||
Console.WriteLine("isn version " + GitVersionInformation.AssemblySemFileVer);
|
Console.WriteLine("isn version " + GitVersionInformation.AssemblySemFileVer);
|
||||||
}
|
}
|
||||||
return commandSet.Run(args);
|
return commandSet.Run(args);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ namespace isn
|
|||||||
{
|
{
|
||||||
public class SourceSettings
|
public class SourceSettings
|
||||||
{
|
{
|
||||||
private RSA rsa;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Protected API Key
|
/// Protected API Key
|
||||||
@ -25,26 +24,38 @@ namespace isn
|
|||||||
|
|
||||||
public SourceSettings()
|
public SourceSettings()
|
||||||
{
|
{
|
||||||
rsa = RSA.Create();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetClearApiKey()
|
public string GetClearApiKey(RSA rsa)
|
||||||
{
|
{
|
||||||
var base64EncodedBytes = System.Convert.FromBase64String(ProtectedApiKey);
|
var decrypted = rsa.Decrypt(System.Convert.FromBase64String(ProtectedApiKey), RSAEncryptionPadding.Pkcs1);
|
||||||
var decrypted = rsa.Decrypt(base64EncodedBytes, RSAEncryptionPadding.Pkcs1);
|
return Encoding.Default.GetString(decrypted);
|
||||||
return Encoding.UTF8.GetString(decrypted);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetApiKey(string key)
|
public void SetApiKey(RSA rsa, string key)
|
||||||
{
|
{
|
||||||
var crypted =rsa.Encrypt(Encoding.UTF8.GetBytes(key), RSAEncryptionPadding.Pkcs1);
|
var ciphered =rsa.Encrypt(Encoding.Default.GetBytes(key), RSAEncryptionPadding.Pkcs1);
|
||||||
ProtectedApiKey = System.Convert.ToBase64String(crypted);
|
ProtectedApiKey = System.Convert.ToBase64String(ciphered);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Settings
|
public class Settings
|
||||||
{
|
{
|
||||||
public string DataProtectionTitle { get; set; }
|
private Settings()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Settings Create()
|
||||||
|
{
|
||||||
|
var rsaParams = CreateCipheringParameters();
|
||||||
|
return new Settings {
|
||||||
|
RSAParameters = rsaParams,
|
||||||
|
Sources = new Dictionary<string, SourceSettings>()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public RSAParameters RSAParameters { get; set; }
|
||||||
public Dictionary<string, SourceSettings> Sources { get; set; }
|
public Dictionary<string, SourceSettings> Sources { get; set; }
|
||||||
|
|
||||||
private string defSourceKey;
|
private string defSourceKey;
|
||||||
@ -58,30 +69,24 @@ namespace isn
|
|||||||
get => defSourceKey;
|
get => defSourceKey;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (!Sources.ContainsKey(value))
|
|
||||||
{
|
|
||||||
Sources[value]=new SourceSettings
|
|
||||||
{
|
|
||||||
Url = defSourceKey
|
|
||||||
};
|
|
||||||
}
|
|
||||||
defSourceKey = value;
|
defSourceKey = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string currentSourceKey;
|
|
||||||
|
|
||||||
[JsonIgnore, NotMapped]
|
[JsonIgnore, NotMapped]
|
||||||
public string CurrentSourceKey
|
public string CurrentSourceKey {get; set;}
|
||||||
|
|
||||||
|
private static RSAParameters CreateCipheringParameters()
|
||||||
{
|
{
|
||||||
get {
|
var provider = new RSACryptoServiceProvider(2048);
|
||||||
return currentSourceKey;
|
return provider.ExportParameters(true);
|
||||||
}
|
}
|
||||||
set{
|
|
||||||
if (!Sources.ContainsKey(value))
|
[JsonIgnore, NotMapped]
|
||||||
throw new InvalidOperationException($"source is invalid ({value})");
|
public SourceSettings CurrentSource
|
||||||
currentSourceKey = value;
|
{
|
||||||
}
|
get => this.Sources[CurrentSourceKey];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ namespace isn
|
|||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PushReport Run(string pkg, string source, string apikey)
|
public PushReport Run(string pkg, string source, string apiKey)
|
||||||
{
|
{
|
||||||
|
|
||||||
var resources = SourceHelpers.GetServerResources(source);
|
var resources = SourceHelpers.GetServerResources(source);
|
||||||
@ -33,25 +33,30 @@ namespace isn
|
|||||||
var report = new PushReport
|
var report = new PushReport
|
||||||
{
|
{
|
||||||
PkgName = fi.Name,
|
PkgName = fi.Name,
|
||||||
Message = "Le fichier n'existe pas : " + fi.FullName
|
Message = "The package does not exist : " + fi.FullName
|
||||||
};
|
};
|
||||||
return report;
|
return report;
|
||||||
}
|
}
|
||||||
using (var client = new HttpClient())
|
using (var client = new HttpClient(
|
||||||
|
new HttpClientHandler
|
||||||
|
{
|
||||||
|
AllowAutoRedirect = false
|
||||||
|
}
|
||||||
|
))
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return client.UploadFilesToServer(new Uri(pubRes.Id), fi, settings.Sources[source].GetClearApiKey());
|
return client.UploadFilesToServer(new Uri(pubRes.Id), fi, settings.Sources[source].GetClearApiKey(Program.rsa));
|
||||||
}
|
}
|
||||||
catch (HttpRequestException hrex)
|
catch (HttpRequestException httpEx)
|
||||||
{
|
{
|
||||||
var report = new PushReport
|
var report = new PushReport
|
||||||
{
|
{
|
||||||
PkgName = fi.Name,
|
PkgName = fi.Name,
|
||||||
Message = "HttpRequest: " + hrex.Message,
|
Message = "HttpRequest: " + httpEx.Message,
|
||||||
StackTrace = hrex.StackTrace,
|
StackTrace = httpEx.StackTrace,
|
||||||
StatusCode = hrex.HResult.ToString()
|
StatusCode = httpEx.HResult.ToString()
|
||||||
};
|
};
|
||||||
Console.Error.WriteLine(hrex.Message);
|
Console.Error.WriteLine(httpEx.Message);
|
||||||
return report;
|
return report;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -14,11 +14,11 @@ namespace isn
|
|||||||
List<PushReport> pushReports = new List<PushReport>();
|
List<PushReport> pushReports = new List<PushReport>();
|
||||||
var cmd = new PushCommand(Settings);
|
var cmd = new PushCommand(Settings);
|
||||||
|
|
||||||
if (CurrentSource == null) throw new InvalidOperationException("source is null");
|
if (Settings.CurrentSource == null) throw new InvalidOperationException("source is null");
|
||||||
|
var source = Settings.CurrentSource;
|
||||||
foreach (string pkg in pkgs)
|
foreach (string pkg in pkgs)
|
||||||
{
|
{
|
||||||
var report = cmd.Run(pkg, CurrentSource, apiKey);
|
var report = cmd.Run(pkg, source.Url, source.GetClearApiKey(rsa));
|
||||||
pushReports.Add(report);
|
pushReports.Add(report);
|
||||||
}
|
}
|
||||||
return pushReports;
|
return pushReports;
|
||||||
|
@ -14,7 +14,7 @@ namespace isn
|
|||||||
var args = storeoptions.Parse(storeArgs);
|
var args = storeoptions.Parse(storeArgs);
|
||||||
if (args.Count != 1)
|
if (args.Count != 1)
|
||||||
{
|
{
|
||||||
Console.Error.WriteLine("StoreApiKey command takse one and only one argument, the key.");
|
Console.Error.WriteLine("StoreApiKey command takes only one argument, the key.");
|
||||||
shouldShowPushHelp=true;
|
shouldShowPushHelp=true;
|
||||||
}
|
}
|
||||||
if (shouldShowPushHelp)
|
if (shouldShowPushHelp)
|
||||||
@ -25,7 +25,7 @@ namespace isn
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Settings.Sources[Settings.CurrentSourceKey].SetApiKey(args[0]);
|
Settings.Sources[Settings.CurrentSourceKey].SetApiKey(Program.rsa, args[0]);
|
||||||
SaveConfig();
|
SaveConfig();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,6 @@
|
|||||||
using System.Data.Common;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using isnd.Services;
|
|
||||||
using isnd.Entities;
|
using isnd.Entities;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using System.Collections.Generic;
|
|
||||||
using NuGet.Versioning;
|
|
||||||
using isnd.Data.Packages.Catalog;
|
|
||||||
using isnd.Data.Catalog;
|
|
||||||
using isn.abst;
|
using isn.abst;
|
||||||
|
|
||||||
namespace isnd.Controllers
|
namespace isnd.Controllers
|
||||||
@ -23,6 +16,7 @@ namespace isnd.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Content + "/{id}/{version}.json")]
|
||||||
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Registration + "/{id}/{version}.json")]
|
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Registration + "/{id}/{version}.json")]
|
||||||
public async Task<IActionResult> CatalogRegistration(string id, string version)
|
public async Task<IActionResult> CatalogRegistration(string id, string version)
|
||||||
{
|
{
|
||||||
|
@ -7,52 +7,51 @@ using isn.abst;
|
|||||||
|
|
||||||
namespace isnd.Controllers
|
namespace isnd.Controllers
|
||||||
{
|
{
|
||||||
// TODO /search GET {@id}?q={QUERY}&skip={SKIP}&take={TAKE}&prerelease={PRERELEASE}&semVerLevel={SEMVERLEVEL}&packageType={PACKAGETYPE}
|
|
||||||
|
|
||||||
public partial class PackagesController
|
public partial class PackagesController
|
||||||
{
|
{
|
||||||
// Web get the paquet
|
// Web get the paquet
|
||||||
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Nuget + "/{id}/{lower}/{idf}-{lowerf}."
|
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Nuget + "/{id}/{lower}/{idf}-{lowerFromName}."
|
||||||
+ Constants.PacketFileExtension)]
|
+ Constants.PacketFileExtension)]
|
||||||
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Content + "/{id}/{lower}/{idf}-{lowerf}."
|
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Content + "/{id}/{lower}/{idf}-{lowerFromName}."
|
||||||
+ Constants.PacketFileExtension)]
|
+ Constants.PacketFileExtension)]
|
||||||
public IActionResult GetPackage(
|
public IActionResult GetPackage(
|
||||||
[FromRoute][SafeName][Required] string id,
|
[FromRoute][SafeName][Required] string id,
|
||||||
[FromRoute][SafeName][Required] string lower,
|
[FromRoute][SafeName][Required] string lower,
|
||||||
[FromRoute] string idf, [FromRoute] string lowerf)
|
[FromRoute] string idf, [FromRoute] string lowerFromName)
|
||||||
{
|
{
|
||||||
var pkgpath = Path.Combine(isndSettings.PackagesRootDir,
|
var pkgPath = Path.Combine(isndSettings.PackagesRootDir,
|
||||||
id, lower, $"{id}-{lower}." + Constants.PacketFileExtension
|
id, lower, $"{id}-{lower}." + Constants.PacketFileExtension
|
||||||
);
|
);
|
||||||
|
|
||||||
FileInfo pkgfi = new FileInfo(pkgpath);
|
FileInfo pkgFileInfo = new FileInfo(pkgPath);
|
||||||
|
|
||||||
if (!pkgfi.Exists)
|
if (!pkgFileInfo.Exists)
|
||||||
{
|
{
|
||||||
return BadRequest("!pkgfi.Exists");
|
return BadRequest("!pkgFileInfo.Exists");
|
||||||
}
|
}
|
||||||
return File(pkgfi.OpenRead(), "application/zip; charset=binary");
|
return File(pkgFileInfo.OpenRead(), "application/zip; charset=binary");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Web get spec
|
// Web get spec
|
||||||
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Nuspec + "/{id}/{lower}/{idf}-{lowerf}."
|
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Nuspec + "/{id}/{lower}/{idf}-{lowerFromName}."
|
||||||
+ Constants.SpecFileExtension)]
|
+ Constants.SpecFileExtension)]
|
||||||
public IActionResult GetNuspec(
|
public IActionResult GetNuspec(
|
||||||
[FromRoute][SafeName][Required] string id,
|
[FromRoute][SafeName][Required] string id,
|
||||||
[FromRoute][SafeName][Required] string lower,
|
[FromRoute][SafeName][Required] string lower,
|
||||||
[FromRoute][SafeName][Required] string idf,
|
[FromRoute][SafeName][Required] string idf,
|
||||||
[FromRoute][SafeName][Required] string lowerf)
|
[FromRoute][SafeName][Required] string lowerFromName)
|
||||||
{
|
{
|
||||||
var pkgpath = Path.Combine(isndSettings.PackagesRootDir,
|
var pkgPath = Path.Combine(isndSettings.PackagesRootDir,
|
||||||
id, lower, $"{id}." + Constants.SpecFileExtension);
|
id, lower, $"{id}." + Constants.SpecFileExtension);
|
||||||
|
|
||||||
FileInfo pkgfi = new FileInfo(pkgpath);
|
FileInfo pkgFileInfo = new FileInfo(pkgPath);
|
||||||
if (!pkgfi.Exists)
|
if (!pkgFileInfo.Exists)
|
||||||
{
|
{
|
||||||
return BadRequest("!pkgfi.Exists");
|
return BadRequest("!pkgFileInfo.Exists");
|
||||||
}
|
}
|
||||||
|
|
||||||
return File(pkgfi.OpenRead(), "text/xml; charset=utf-8");
|
return File(pkgFileInfo.OpenRead(), "text/xml; charset=utf-8");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,13 +1,12 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NuGet.Versioning;
|
using NuGet.Versioning;
|
||||||
using isnd.Entities;
|
using isnd.Entities;
|
||||||
using isn.abst;
|
|
||||||
|
|
||||||
namespace isnd.Controllers
|
namespace isnd.Controllers
|
||||||
{
|
{
|
||||||
public partial class PackagesController
|
public partial class PackagesController
|
||||||
{
|
{
|
||||||
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Find)]
|
[HttpGet("~" + ApiConfig.V2Find)]
|
||||||
public IActionResult GetVersions(
|
public IActionResult GetVersions(
|
||||||
string id,
|
string id,
|
||||||
string lower,
|
string lower,
|
||||||
|
@ -1,25 +1,13 @@
|
|||||||
using Microsoft.VisualBasic.CompilerServices;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.IO.Compression;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
using Microsoft.AspNetCore.DataProtection;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using NuGet.Packaging.Core;
|
|
||||||
using NuGet.Versioning;
|
|
||||||
using isnd.Data;
|
|
||||||
using isnd.Helpers;
|
|
||||||
using isnd.Entities;
|
using isnd.Entities;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using isn.abst;
|
using isn.abst;
|
||||||
using isnd.Data.Packages;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace isnd.Controllers
|
namespace isnd.Controllers
|
||||||
{
|
{
|
||||||
@ -38,184 +26,26 @@ namespace isnd.Controllers
|
|||||||
var files = new List<string>();
|
var files = new List<string>();
|
||||||
ViewData["files"] = files;
|
ViewData["files"] = files;
|
||||||
|
|
||||||
var clearkey = protector.Unprotect(apiKey);
|
var clearKey = protector.Unprotect(apiKey);
|
||||||
var apikey = dbContext.ApiKeys.SingleOrDefault(k => k.Id == clearkey);
|
var dbApiKey = dbContext.ApiKeys.SingleOrDefault(k => k.Id == clearKey);
|
||||||
if (apikey == null)
|
if (dbApiKey == null)
|
||||||
{
|
{
|
||||||
logger.LogError("403 : no api-key");
|
logger.LogError("403 : no api-key");
|
||||||
return Unauthorized();
|
return Unauthorized();
|
||||||
}
|
}
|
||||||
Commit commit = new Commit
|
|
||||||
{
|
|
||||||
Action = PackageAction.PublishPackage,
|
|
||||||
TimeStamp = DateTimeOffset.Now.ToUniversalTime()
|
|
||||||
};
|
|
||||||
|
|
||||||
foreach (IFormFile file in Request.Form.Files)
|
foreach (IFormFile file in Request.Form.Files)
|
||||||
{
|
{
|
||||||
string initpath = Path.Combine(Environment.GetEnvironmentVariable("TEMP") ??
|
var version = await packageManager.PutPackageAsync(file.OpenReadStream(), dbApiKey.UserId);
|
||||||
Environment.GetEnvironmentVariable("TMP") ?? "/tmp",
|
logger.LogInformation($"new package : {version.PackageId} {version.NugetLink}");
|
||||||
$"isn-{Guid.NewGuid()}."+Constants.PacketFileExtension);
|
|
||||||
|
|
||||||
using (FileStream fw = new FileStream(initpath, FileMode.Create))
|
|
||||||
{
|
|
||||||
file.CopyTo(fw);
|
|
||||||
}
|
|
||||||
|
|
||||||
using (FileStream fw = new FileStream(initpath, FileMode.Open))
|
|
||||||
{
|
|
||||||
var archive = new ZipArchive(fw);
|
|
||||||
|
|
||||||
var spec = archive.Entries.FirstOrDefault(e => e.FullName.EndsWith("." + Constants.SpecFileExtension));
|
|
||||||
if (spec == null) return BadRequest(new { error = "no " + Constants.SpecFileExtension + " from archive" });
|
|
||||||
string pkgpath;
|
|
||||||
NuGetVersion version;
|
|
||||||
string pkgid;
|
|
||||||
string fullpath;
|
|
||||||
|
|
||||||
using (var specstr = spec.Open())
|
|
||||||
{
|
|
||||||
NuspecCoreReader reader = new NuspecCoreReader(specstr);
|
|
||||||
|
|
||||||
string pkgdesc = reader.GetDescription();
|
|
||||||
var types = reader.GetPackageTypes();
|
|
||||||
pkgid = reader.GetId();
|
|
||||||
version = reader.GetVersion();
|
|
||||||
|
|
||||||
string pkgidpath = Path.Combine(isndSettings.PackagesRootDir,
|
|
||||||
pkgid);
|
|
||||||
pkgpath = Path.Combine(pkgidpath, version.ToFullString());
|
|
||||||
string name = $"{pkgid}-{version}."+Constants.PacketFileExtension;
|
|
||||||
fullpath = Path.Combine(pkgpath, name);
|
|
||||||
|
|
||||||
var destpkgiddir = new DirectoryInfo(pkgidpath);
|
|
||||||
Package pkg = dbContext.Packages.SingleOrDefault(p => p.Id == pkgid);
|
|
||||||
if (pkg != null)
|
|
||||||
{
|
|
||||||
if (pkg.OwnerId != apikey.UserId)
|
|
||||||
{
|
|
||||||
return new ForbidResult();
|
|
||||||
}
|
|
||||||
pkg.Description = pkgdesc;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pkg = new Package
|
|
||||||
{
|
|
||||||
Id = pkgid,
|
|
||||||
Description = pkgdesc,
|
|
||||||
OwnerId = apikey.UserId,
|
|
||||||
LatestCommit = commit
|
|
||||||
};
|
|
||||||
dbContext.Packages.Add(pkg);
|
|
||||||
}
|
|
||||||
if (!destpkgiddir.Exists) destpkgiddir.Create();
|
|
||||||
|
|
||||||
var source = new FileInfo(initpath);
|
|
||||||
var dest = new FileInfo(fullpath);
|
|
||||||
var destdir = new DirectoryInfo(dest.DirectoryName);
|
|
||||||
if (dest.Exists)
|
|
||||||
{
|
|
||||||
logger.LogWarning($"Existant package on disk : '{dest.FullName}'");
|
|
||||||
// La version existe sur le disque,
|
|
||||||
// mais si elle ne l'est pas en base de donnéés,
|
|
||||||
// on remplace la version sur disque.
|
|
||||||
string exFullString = version.ToFullString();
|
|
||||||
var pkgv = dbContext.PackageVersions.
|
|
||||||
Include(v=>v.LatestCommit)
|
|
||||||
.SingleOrDefault(
|
|
||||||
v => v.PackageId == pkg.Id && v.FullString == exFullString
|
|
||||||
);
|
|
||||||
if (pkgv!=null && ! pkgv.IsDeleted)
|
|
||||||
{
|
|
||||||
string msg = $"existant : {pkg.Id}-{exFullString}";
|
|
||||||
logger.LogWarning("400 : {msg}", msg);
|
|
||||||
ModelState.AddModelError("pkgversion", msg);
|
|
||||||
return BadRequest(this.CreateAPIKO("existant"));
|
|
||||||
} else dest.Delete();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
if (!destdir.Exists) destdir.Create();
|
|
||||||
source.MoveTo(fullpath);
|
|
||||||
files.Add(name);
|
|
||||||
string fullstringversion = version.ToFullString();
|
|
||||||
var pkgvers = dbContext.PackageVersions.Where
|
|
||||||
(v => v.PackageId == pkg.Id && v.FullString == fullstringversion);
|
|
||||||
if (pkgvers.Count() > 0)
|
|
||||||
{
|
|
||||||
foreach (var v in pkgvers.ToArray())
|
|
||||||
dbContext.PackageVersions.Remove(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME default type or null
|
|
||||||
if (types==null || types.Count==0)
|
|
||||||
dbContext.PackageVersions.Add
|
|
||||||
(new PackageVersion{
|
|
||||||
|
|
||||||
Package = pkg,
|
|
||||||
Major = version.Major,
|
|
||||||
Minor = version.Minor,
|
|
||||||
Patch = version.Patch,
|
|
||||||
Revision = version.Revision,
|
|
||||||
IsPrerelease = version.IsPrerelease,
|
|
||||||
FullString = version.ToFullString(),
|
|
||||||
Type = null,
|
|
||||||
LatestCommit = commit
|
|
||||||
});
|
|
||||||
else
|
|
||||||
foreach (var type in types)
|
|
||||||
{
|
|
||||||
var pkgver = new PackageVersion
|
|
||||||
{
|
|
||||||
Package = pkg,
|
|
||||||
Major = version.Major,
|
|
||||||
Minor = version.Minor,
|
|
||||||
Patch = version.Patch,
|
|
||||||
IsPrerelease = version.IsPrerelease,
|
|
||||||
FullString = version.ToFullString(),
|
|
||||||
Type = type.Name,
|
|
||||||
LatestCommit = commit
|
|
||||||
};
|
|
||||||
dbContext.PackageVersions.Add(pkgver);
|
|
||||||
}
|
|
||||||
|
|
||||||
dbContext.Commits.Add(commit);
|
|
||||||
await dbContext.SaveChangesAsync();
|
|
||||||
await packageManager.ÛpdateCatalogForAsync(commit);
|
|
||||||
|
|
||||||
logger.LogInformation($"new paquet : {spec.Name}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
using (var shacrypto = System.Security.Cryptography.SHA512.Create())
|
|
||||||
{
|
|
||||||
using (var stream = System.IO.File.OpenRead(fullpath))
|
|
||||||
{
|
|
||||||
var hash = shacrypto.ComputeHash(stream);
|
|
||||||
var shafullname = fullpath + ".sha512";
|
|
||||||
var hashtext = Convert.ToBase64String(hash);
|
|
||||||
var hashtextbytes = Encoding.ASCII.GetBytes(hashtext);
|
|
||||||
|
|
||||||
using (var shafile = System.IO.File.OpenWrite(shafullname))
|
|
||||||
{
|
|
||||||
shafile.Write(hashtextbytes, 0, hashtextbytes.Length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
string nuspecfullpath = Path.Combine(pkgpath, pkgid + "." + Constants.SpecFileExtension);
|
|
||||||
FileInfo nfpi = new(nuspecfullpath);
|
|
||||||
|
|
||||||
if (nfpi.Exists)
|
|
||||||
nfpi.Delete();
|
|
||||||
spec.ExtractToFile(nuspecfullpath);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
logger.LogError("PUT exception : " + ex.Message);
|
var message = $"PUT exception : {ex.Message} ({ex.GetType().Name})";
|
||||||
|
logger.LogError(message);
|
||||||
logger.LogError("Stack Trace : " + ex.StackTrace);
|
logger.LogError("Stack Trace : " + ex.StackTrace);
|
||||||
return new ObjectResult(new { ViewData, ex.Message })
|
return new ObjectResult(new { ViewData, message })
|
||||||
{ StatusCode = 500 };
|
{ StatusCode = 500 };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ namespace isnd.Controllers
|
|||||||
// Web get the paquet
|
// Web get the paquet
|
||||||
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Search)]
|
[HttpGet("~" + Constants.ApiVersionPrefix + ApiConfig.Search)]
|
||||||
[HttpHead("~" + Constants.ApiVersionPrefix + ApiConfig.Search)]
|
[HttpHead("~" + Constants.ApiVersionPrefix + ApiConfig.Search)]
|
||||||
|
[HttpHead("~" + ApiConfig.V2Find)]
|
||||||
public async Task<IActionResult> Search(
|
public async Task<IActionResult> Search(
|
||||||
string q=null,
|
string q=null,
|
||||||
int skip=0,
|
int skip=0,
|
||||||
|
@ -24,6 +24,11 @@ namespace isnd.Data
|
|||||||
.HasKey( v => new { v.PackageId, v.FullString } );
|
.HasKey( v => new { v.PackageId, v.FullString } );
|
||||||
_ = builder.Entity<PackageVersion>()
|
_ = builder.Entity<PackageVersion>()
|
||||||
.HasOne(v => v.Package).WithMany(p => p.Versions).HasForeignKey(x => x.PackageId);
|
.HasOne(v => v.Package).WithMany(p => p.Versions).HasForeignKey(x => x.PackageId);
|
||||||
|
|
||||||
|
|
||||||
|
_ = builder.Entity<PackageDependencyGroup>().HasOne(g=>g.PackageVersion)
|
||||||
|
.WithMany(v => v.DependencyGroups).HasForeignKey(x => new { x.PackageId, x.PackageVersionFullString } );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -50,5 +55,8 @@ namespace isnd.Data
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value></value>
|
/// <value></value>
|
||||||
public DbSet<Commit> Commits { get; set; }
|
public DbSet<Commit> Commits { get; set; }
|
||||||
|
public DbSet<Dependency> Dependencies { get; set; }
|
||||||
|
|
||||||
|
public DbSet<PackageDependencyGroup> PackageDependencyGroups { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
namespace isnd.Data.Catalog
|
|
||||||
{
|
|
||||||
public class DependencyGroup
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
@ -33,6 +33,14 @@ namespace isnd.Data.Catalog
|
|||||||
CommitId = pkg.CommitId;
|
CommitId = pkg.CommitId;
|
||||||
CommitTimeStamp = pkg.LatestCommit.CommitTimeStamp;
|
CommitTimeStamp = pkg.LatestCommit.CommitTimeStamp;
|
||||||
IsListed = !pkg.IsDeleted && pkg.Package.Public;
|
IsListed = !pkg.IsDeleted && pkg.Package.Public;
|
||||||
|
if (pkg.DependencyGroups!=null)
|
||||||
|
{
|
||||||
|
if (pkg.DependencyGroups.Count>0)
|
||||||
|
{
|
||||||
|
dependencyGroups = pkg.DependencyGroups.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO Licence Project Urls, Summary, Title, etc ...
|
// TODO Licence Project Urls, Summary, Title, etc ...
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,7 +64,7 @@ namespace isnd.Data.Catalog
|
|||||||
/// The dependencies of the package, grouped by target framework
|
/// The dependencies of the package, grouped by target framework
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>array of objects</value>
|
/// <value>array of objects</value>
|
||||||
public DependencyGroup[] dependencyGroups { get; set; } = Array.Empty<DependencyGroup>();
|
public PackageDependencyGroup[] dependencyGroups { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The deprecation associated with the package
|
/// The deprecation associated with the package
|
||||||
@ -127,8 +135,8 @@ namespace isnd.Data.Catalog
|
|||||||
[JsonProperty("id")]
|
[JsonProperty("id")]
|
||||||
public string PackageId { get; set; }
|
public string PackageId { get; set; }
|
||||||
|
|
||||||
public IEnumerable<PackageDependencyGroup> DependencySets { get; set; }
|
public IEnumerable<NuGet.Packaging.PackageDependencyGroup> DependencySets { get; set; }
|
||||||
= Array.Empty<PackageDependencyGroup>();
|
= Array.Empty<NuGet.Packaging.PackageDependencyGroup>();
|
||||||
|
|
||||||
public long? DownloadCount { get; set; }
|
public long? DownloadCount { get; set; }
|
||||||
|
|
||||||
|
31
src/isnd/Data/Packages/Dependency.cs
Normal file
31
src/isnd/Data/Packages/Dependency.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using isnd.Data.Packages;
|
||||||
|
|
||||||
|
namespace isnd.Data
|
||||||
|
{
|
||||||
|
public class Dependency
|
||||||
|
{
|
||||||
|
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
|
public string Id { get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Package Id
|
||||||
|
/// </summary> <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <value></value>
|
||||||
|
[Required]
|
||||||
|
[ForeignKey("Group")]
|
||||||
|
public string DependencyGroupId { set ; get ; }
|
||||||
|
|
||||||
|
|
||||||
|
public virtual PackageDependencyGroup Group{ get; set; }
|
||||||
|
|
||||||
|
public string Version { get; set; }
|
||||||
|
public string Exclude { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
35
src/isnd/Data/Packages/PackageDependencyGroup.cs
Normal file
35
src/isnd/Data/Packages/PackageDependencyGroup.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.DotNet.Scaffolding.Shared.ProjectModel;
|
||||||
|
using Microsoft.Identity.Client;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using NuGet.Frameworks;
|
||||||
|
using NuGet.Packaging;
|
||||||
|
using NuGet.Packaging.Core;
|
||||||
|
using NuGet.Versioning;
|
||||||
|
|
||||||
|
namespace isnd.Data
|
||||||
|
{
|
||||||
|
public class PackageDependencyGroup
|
||||||
|
{
|
||||||
|
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
|
public string Id { get ; set;}
|
||||||
|
|
||||||
|
[Required]
|
||||||
|
public string PackageId { get ; set;}
|
||||||
|
|
||||||
|
[Required]
|
||||||
|
public string PackageVersionFullString { get ; set;}
|
||||||
|
|
||||||
|
[JsonProperty("targetFramework")]
|
||||||
|
public string TargetFramework { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("dependencies")]
|
||||||
|
[ForeignKey("DependencyGroupId")]
|
||||||
|
public virtual List<Dependency> Dependencies { get; set; }
|
||||||
|
|
||||||
|
public virtual PackageVersion PackageVersion { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -11,6 +11,10 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NuGet.Versioning;
|
using NuGet.Versioning;
|
||||||
using System;
|
using System;
|
||||||
|
using NuGet.Packaging;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Package = isnd.Data.Packages.Package;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
||||||
|
|
||||||
namespace isnd.Data
|
namespace isnd.Data
|
||||||
{
|
{
|
||||||
@ -60,6 +64,8 @@ namespace isnd.Data
|
|||||||
public string CommitId { get => CommitNId.ToString(); }
|
public string CommitId { get => CommitNId.ToString(); }
|
||||||
|
|
||||||
public virtual Commit LatestCommit { get; set; }
|
public virtual Commit LatestCommit { get; set; }
|
||||||
|
|
||||||
|
public virtual List<PackageDependencyGroup> DependencyGroups { get; set; }
|
||||||
public string NugetLink => $"{ApiConfig.Nuget}/{PackageId}/{FullString}/{PackageId}-{FullString}."
|
public string NugetLink => $"{ApiConfig.Nuget}/{PackageId}/{FullString}/{PackageId}-{FullString}."
|
||||||
+ Constants.PacketFileExtension;
|
+ Constants.PacketFileExtension;
|
||||||
public string NuspecLink => $"{ApiConfig.Nuspec}/{PackageId}/{FullString}/{PackageId}-{FullString}."
|
public string NuspecLink => $"{ApiConfig.Nuspec}/{PackageId}/{FullString}/{PackageId}-{FullString}."
|
||||||
@ -73,6 +79,7 @@ namespace isnd.Data
|
|||||||
return new Catalog.Package(apiBase, this.PackageId , FullString,
|
return new Catalog.Package(apiBase, this.PackageId , FullString,
|
||||||
new Catalog.PackageDetails(this, apiBase, apiBase + ApiConfig.Registration + "/" + this.PackageId + "/" + FullString + ".json"));
|
new Catalog.PackageDetails(this, apiBase, apiBase + ApiConfig.Registration + "/" + this.PackageId + "/" + FullString + ".json"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsDeleted => LatestCommit?.Action == PackageAction.DeletePackage;
|
public bool IsDeleted => LatestCommit?.Action == PackageAction.DeletePackage;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using isn.Abstract;
|
using isn.Abstract;
|
||||||
using isnd.Data;
|
using isnd.Data;
|
||||||
@ -13,11 +14,11 @@ namespace isnd.Interfaces
|
|||||||
public interface IPackageManager
|
public interface IPackageManager
|
||||||
{
|
{
|
||||||
string CatalogBaseUrl { get; }
|
string CatalogBaseUrl { get; }
|
||||||
AutoCompleteResult AutoComplete(string pkgid, int skip, int take, bool prerelease = false, string packageType = null);
|
AutoCompleteResult AutoComplete(string pkgid, int skip=0, int take=25, bool prerelease = false, string packageType = null);
|
||||||
|
|
||||||
string[] GetVersions(string pkgid, NuGetVersion parsedVersion, bool prerelease = false, string packageType = null, int skip = 0, int take = 25);
|
string[] GetVersions(string pkgid, NuGetVersion parsedVersion, bool prerelease = false, string packageType = null, int skip = 0, int take = 25);
|
||||||
IEnumerable<Resource> GetResources();
|
IEnumerable<Resource> GetResources();
|
||||||
Task<PackageRegistration> ÛpdateCatalogForAsync(Commit commit);
|
Task<PackageRegistration> UpdateCatalogForAsync(Commit commit);
|
||||||
Task<PackageDeletionReport> DeletePackageAsync(string pkgid, string version, string type);
|
Task<PackageDeletionReport> DeletePackageAsync(string pkgid, string version, string type);
|
||||||
Task<PackageDeletionReport> UserAskForPackageDeletionAsync(string userid, string pkgId, string lower, string type);
|
Task<PackageDeletionReport> UserAskForPackageDeletionAsync(string userid, string pkgId, string lower, string type);
|
||||||
Task<PackageVersion> GetPackageAsync(string pkgid, string version, string type);
|
Task<PackageVersion> GetPackageAsync(string pkgid, string version, string type);
|
||||||
@ -28,6 +29,8 @@ namespace isnd.Interfaces
|
|||||||
Task<PackageRegistration> GetPackageRegistrationIndexAsync(PackageRegistrationQuery query);
|
Task<PackageRegistration> GetPackageRegistrationIndexAsync(PackageRegistrationQuery query);
|
||||||
|
|
||||||
Task<PackageSearchResult> SearchPackageAsync(PackageRegistrationQuery query);
|
Task<PackageSearchResult> SearchPackageAsync(PackageRegistrationQuery query);
|
||||||
|
|
||||||
|
Task<PackageVersion> PutPackageAsync(Stream packageStream, string ownerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
529
src/isnd/Migrations/20240318003218_dependencies.Designer.cs
generated
Normal file
529
src/isnd/Migrations/20240318003218_dependencies.Designer.cs
generated
Normal file
@ -0,0 +1,529 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
using isnd.Data;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace isnd.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(ApplicationDbContext))]
|
||||||
|
[Migration("20240318003218_dependencies")]
|
||||||
|
partial class dependencies
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "8.0.3")
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("ConcurrencyStamp")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("NormalizedName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("NormalizedName")
|
||||||
|
.IsUnique()
|
||||||
|
.HasDatabaseName("RoleNameIndex");
|
||||||
|
|
||||||
|
b.ToTable("AspNetRoles", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ClaimType")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("ClaimValue")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("RoleId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("RoleId");
|
||||||
|
|
||||||
|
b.ToTable("AspNetRoleClaims", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ClaimType")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("ClaimValue")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("UserId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUserClaims", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("LoginProvider")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("ProviderKey")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("ProviderDisplayName")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("UserId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("LoginProvider", "ProviderKey");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUserLogins", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("UserId")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("RoleId")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("UserId", "RoleId");
|
||||||
|
|
||||||
|
b.HasIndex("RoleId");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUserRoles", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("UserId")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("LoginProvider")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("UserId", "LoginProvider", "Name");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUserTokens", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.ApiKeys.ApiKey", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<DateTimeOffset>("CreationDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("UserId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("ValidityPeriodInDays")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("ApiKeys");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.ApplicationUser", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("AccessFailedCount")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("ConcurrencyStamp")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Email")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<bool>("EmailConfirmed")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<string>("FullName")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("LockoutEnabled")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTimeOffset?>("LockoutEnd")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("NormalizedEmail")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("NormalizedUserName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("PasswordHash")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("PhoneNumber")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("PhoneNumberConfirmed")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<string>("SecurityStamp")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("TwoFactorEnabled")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<string>("UserName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("NormalizedEmail")
|
||||||
|
.HasDatabaseName("EmailIndex");
|
||||||
|
|
||||||
|
b.HasIndex("NormalizedUserName")
|
||||||
|
.IsUnique()
|
||||||
|
.HasDatabaseName("UserNameIndex");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUsers", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.Dependency", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("DependencyGroupId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Exclude")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Version")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("DependencyGroupId");
|
||||||
|
|
||||||
|
b.ToTable("Depedencies");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageDependencyGroup", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("PackageVersionFullString")
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("PackageVersionId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("PackageVersionPackageId")
|
||||||
|
.HasColumnType("character varying(1024)");
|
||||||
|
|
||||||
|
b.Property<string>("TargetFramework")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("PackageVersionPackageId", "PackageVersionFullString");
|
||||||
|
|
||||||
|
b.ToTable("PackageDependencyGroups");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageVersion", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("PackageId")
|
||||||
|
.HasMaxLength(1024)
|
||||||
|
.HasColumnType("character varying(1024)");
|
||||||
|
|
||||||
|
b.Property<string>("FullString")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<long>("CommitNId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<bool>("IsPrerelease")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<int>("Major")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<int>("Minor")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<int>("Patch")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<int>("Revision")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("Type")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.HasKey("PackageId", "FullString");
|
||||||
|
|
||||||
|
b.HasIndex("CommitNId");
|
||||||
|
|
||||||
|
b.ToTable("PackageVersions");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.Packages.Commit", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("Action")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<DateTimeOffset>("TimeStamp")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Commits");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.Packages.Package", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.HasMaxLength(1024)
|
||||||
|
.HasColumnType("character varying(1024)");
|
||||||
|
|
||||||
|
b.Property<long>("CommitNId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.HasMaxLength(1024)
|
||||||
|
.HasColumnType("character varying(1024)");
|
||||||
|
|
||||||
|
b.Property<string>("OwnerId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("Public")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("CommitNId");
|
||||||
|
|
||||||
|
b.HasIndex("OwnerId");
|
||||||
|
|
||||||
|
b.ToTable("Packages");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("RoleId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.ApplicationUser", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.ApplicationUser", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("RoleId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("isnd.Data.ApplicationUser", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.ApplicationUser", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.ApiKeys.ApiKey", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.ApplicationUser", "User")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("User");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.Dependency", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.PackageDependencyGroup", "Group")
|
||||||
|
.WithMany("Dependencies")
|
||||||
|
.HasForeignKey("DependencyGroupId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Group");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageDependencyGroup", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.PackageVersion", null)
|
||||||
|
.WithMany("DependencyGroups")
|
||||||
|
.HasForeignKey("PackageVersionPackageId", "PackageVersionFullString");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageVersion", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.Packages.Commit", "LatestCommit")
|
||||||
|
.WithMany("Versions")
|
||||||
|
.HasForeignKey("CommitNId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("isnd.Data.Packages.Package", "Package")
|
||||||
|
.WithMany("Versions")
|
||||||
|
.HasForeignKey("PackageId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("LatestCommit");
|
||||||
|
|
||||||
|
b.Navigation("Package");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.Packages.Package", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.Packages.Commit", "LatestCommit")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("CommitNId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("isnd.Data.ApplicationUser", "Owner")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("OwnerId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("LatestCommit");
|
||||||
|
|
||||||
|
b.Navigation("Owner");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageDependencyGroup", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Dependencies");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageVersion", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("DependencyGroups");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.Packages.Commit", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Versions");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.Packages.Package", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Versions");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
74
src/isnd/Migrations/20240318003218_dependencies.cs
Normal file
74
src/isnd/Migrations/20240318003218_dependencies.cs
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace isnd.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class dependencies : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "PackageDependencyGroups",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<string>(type: "text", nullable: false),
|
||||||
|
PackageVersionId = table.Column<string>(type: "text", nullable: false),
|
||||||
|
TargetFramework = table.Column<string>(type: "text", nullable: true),
|
||||||
|
PackageVersionFullString = table.Column<string>(type: "character varying(256)", nullable: true),
|
||||||
|
PackageVersionPackageId = table.Column<string>(type: "character varying(1024)", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_PackageDependencyGroups", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_PackageDependencyGroups_PackageVersions_PackageVersionPacka~",
|
||||||
|
columns: x => new { x.PackageVersionPackageId, x.PackageVersionFullString },
|
||||||
|
principalTable: "PackageVersions",
|
||||||
|
principalColumns: new[] { "PackageId", "FullString" });
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Depedencies",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<string>(type: "text", nullable: false),
|
||||||
|
DependencyGroupId = table.Column<string>(type: "text", nullable: false),
|
||||||
|
Version = table.Column<string>(type: "text", nullable: true),
|
||||||
|
Exclude = table.Column<string>(type: "text", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Depedencies", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Depedencies_PackageDependencyGroups_DependencyGroupId",
|
||||||
|
column: x => x.DependencyGroupId,
|
||||||
|
principalTable: "PackageDependencyGroups",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Depedencies_DependencyGroupId",
|
||||||
|
table: "Depedencies",
|
||||||
|
column: "DependencyGroupId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_PackageDependencyGroups_PackageVersionPackageId_PackageVers~",
|
||||||
|
table: "PackageDependencyGroups",
|
||||||
|
columns: new[] { "PackageVersionPackageId", "PackageVersionFullString" });
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Depedencies");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "PackageDependencyGroups");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -17,7 +17,7 @@ namespace isnd.Migrations
|
|||||||
{
|
{
|
||||||
#pragma warning disable 612, 618
|
#pragma warning disable 612, 618
|
||||||
modelBuilder
|
modelBuilder
|
||||||
.HasAnnotation("ProductVersion", "7.0.4")
|
.HasAnnotation("ProductVersion", "8.0.3")
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
@ -247,6 +247,55 @@ namespace isnd.Migrations
|
|||||||
b.ToTable("AspNetUsers", (string)null);
|
b.ToTable("AspNetUsers", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.Dependency", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("DependencyGroupId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Exclude")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Version")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("DependencyGroupId");
|
||||||
|
|
||||||
|
b.ToTable("Depedencies");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageDependencyGroup", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("PackageVersionFullString")
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("PackageVersionId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("PackageVersionPackageId")
|
||||||
|
.HasColumnType("character varying(1024)");
|
||||||
|
|
||||||
|
b.Property<string>("TargetFramework")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("PackageVersionPackageId", "PackageVersionFullString");
|
||||||
|
|
||||||
|
b.ToTable("PackageDependencyGroups");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("isnd.Data.PackageVersion", b =>
|
modelBuilder.Entity("isnd.Data.PackageVersion", b =>
|
||||||
{
|
{
|
||||||
b.Property<string>("PackageId")
|
b.Property<string>("PackageId")
|
||||||
@ -396,6 +445,24 @@ namespace isnd.Migrations
|
|||||||
b.Navigation("User");
|
b.Navigation("User");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.Dependency", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.PackageDependencyGroup", "Group")
|
||||||
|
.WithMany("Dependencies")
|
||||||
|
.HasForeignKey("DependencyGroupId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Group");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageDependencyGroup", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("isnd.Data.PackageVersion", null)
|
||||||
|
.WithMany("DependencyGroups")
|
||||||
|
.HasForeignKey("PackageVersionPackageId", "PackageVersionFullString");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("isnd.Data.PackageVersion", b =>
|
modelBuilder.Entity("isnd.Data.PackageVersion", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("isnd.Data.Packages.Commit", "LatestCommit")
|
b.HasOne("isnd.Data.Packages.Commit", "LatestCommit")
|
||||||
@ -434,6 +501,16 @@ namespace isnd.Migrations
|
|||||||
b.Navigation("Owner");
|
b.Navigation("Owner");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageDependencyGroup", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Dependencies");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("isnd.Data.PackageVersion", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("DependencyGroups");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("isnd.Data.Packages.Commit", b =>
|
modelBuilder.Entity("isnd.Data.Packages.Commit", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("Versions");
|
b.Navigation("Versions");
|
||||||
|
25
src/isnd/Services/InvalidPackageException.cs
Normal file
25
src/isnd/Services/InvalidPackageException.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
|
||||||
|
namespace isnd.Services
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
internal class InvalidPackageException : InvalidOperationException
|
||||||
|
{
|
||||||
|
public InvalidPackageException()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public InvalidPackageException(string message) : base(message)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public InvalidPackageException(string message, Exception innerException) : base(message, innerException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected InvalidPackageException(SerializationInfo info, StreamingContext context) : base(info, context)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,18 +1,26 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.IO.Compression;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
using isn.abst;
|
using isn.abst;
|
||||||
using isn.Abstract;
|
using isn.Abstract;
|
||||||
using isnd.Data;
|
using isnd.Data;
|
||||||
using isnd.Data.Catalog;
|
using isnd.Data.Catalog;
|
||||||
using isnd.Data.Packages;
|
using isnd.Data.Packages;
|
||||||
using isnd.Entities;
|
using isnd.Entities;
|
||||||
|
using isnd.Helpers;
|
||||||
using isnd.Interfaces;
|
using isnd.Interfaces;
|
||||||
using isnd.ViewModels;
|
using isnd.ViewModels;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using NuGet.Packaging.Core;
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
using NuGet.Versioning;
|
using NuGet.Versioning;
|
||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace isnd.Services
|
namespace isnd.Services
|
||||||
{
|
{
|
||||||
@ -31,7 +39,7 @@ namespace isnd.Services
|
|||||||
|
|
||||||
public IEnumerable<Resource> GetResources()
|
public IEnumerable<Resource> GetResources()
|
||||||
{
|
{
|
||||||
|
|
||||||
var res = new List<Resource>
|
var res = new List<Resource>
|
||||||
{
|
{
|
||||||
new Resource(apiBase + ApiConfig.Package,
|
new Resource(apiBase + ApiConfig.Package,
|
||||||
@ -46,7 +54,7 @@ namespace isnd.Services
|
|||||||
{
|
{
|
||||||
Comment = "URI template used by NuGet Client to construct details URL for packages"
|
Comment = "URI template used by NuGet Client to construct details URL for packages"
|
||||||
},
|
},
|
||||||
|
|
||||||
new Resource(apiBase + ApiConfig.Content,
|
new Resource(apiBase + ApiConfig.Content,
|
||||||
"PackageBaseAddress/3.0.0")
|
"PackageBaseAddress/3.0.0")
|
||||||
{
|
{
|
||||||
@ -61,11 +69,26 @@ namespace isnd.Services
|
|||||||
Comment = "Auto complete service"
|
Comment = "Auto complete service"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
new Resource(apiBase + ApiConfig.Search,
|
||||||
|
"SearchQueryService")
|
||||||
|
{
|
||||||
|
Comment = "Query endpoint of NuGet Search service (primary) used by RC clients"
|
||||||
|
},
|
||||||
|
new Resource(apiBase + ApiConfig.Search,
|
||||||
|
"SearchQueryService/3.0.0-beta")
|
||||||
|
{
|
||||||
|
Comment = "Query endpoint of NuGet Search service (primary) used by RC clients"
|
||||||
|
},
|
||||||
new Resource(apiBase + ApiConfig.Search,
|
new Resource(apiBase + ApiConfig.Search,
|
||||||
"SearchQueryService/3.0.0-rc")
|
"SearchQueryService/3.0.0-rc")
|
||||||
{
|
{
|
||||||
Comment = "Query endpoint of NuGet Search service (primary) used by RC clients"
|
Comment = "Query endpoint of NuGet Search service (primary) used by RC clients"
|
||||||
},
|
},
|
||||||
|
new Resource(apiBase + ApiConfig.Search,
|
||||||
|
"SearchQueryService/3.5.0")
|
||||||
|
{
|
||||||
|
Comment = "Query endpoint of NuGet Search service (primary) used by RC clients"
|
||||||
|
},
|
||||||
|
|
||||||
new Resource(apiBase + ApiConfig.Registration,
|
new Resource(apiBase + ApiConfig.Registration,
|
||||||
"RegistrationsBaseUrl/Versioned")
|
"RegistrationsBaseUrl/Versioned")
|
||||||
@ -107,7 +130,7 @@ namespace isnd.Services
|
|||||||
v => v.PackageId == id
|
v => v.PackageId == id
|
||||||
&& (prerelease || !v.IsPrerelease)
|
&& (prerelease || !v.IsPrerelease)
|
||||||
&& (packageType == null || v.Type == packageType)
|
&& (packageType == null || v.Type == packageType)
|
||||||
&& (parsedVersion==null || parsedVersion.CompareTo
|
&& (parsedVersion == null || parsedVersion.CompareTo
|
||||||
(new SemanticVersion(v.Major, v.Minor, v.Patch)) < 0)
|
(new SemanticVersion(v.Major, v.Minor, v.Patch)) < 0)
|
||||||
)
|
)
|
||||||
.OrderBy(v => v.NugetVersion)
|
.OrderBy(v => v.NugetVersion)
|
||||||
@ -115,8 +138,6 @@ namespace isnd.Services
|
|||||||
.Skip(skip).Take(take).ToArray();
|
.Skip(skip).Take(take).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public string CatalogBaseUrl => apiBase;
|
public string CatalogBaseUrl => apiBase;
|
||||||
|
|
||||||
private IsndSettings isndSettings;
|
private IsndSettings isndSettings;
|
||||||
@ -124,17 +145,17 @@ namespace isnd.Services
|
|||||||
|
|
||||||
public virtual async Task<PackageRegistration> GetCatalogIndexAsync()
|
public virtual async Task<PackageRegistration> GetCatalogIndexAsync()
|
||||||
{
|
{
|
||||||
return await ÛpdateCatalogForAsync(null);
|
return await UpdateCatalogForAsync(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PackageRegistration> ÛpdateCatalogForAsync
|
public async Task<PackageRegistration> UpdateCatalogForAsync
|
||||||
(Commit reason = null)
|
(Commit reason = null)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
string baseid = apiBase + ApiConfig.Catalog;
|
string baseId = apiBase + ApiConfig.Catalog;
|
||||||
string bidreg = $"{apiBase}{ApiConfig.Registration}";
|
string baseRegistrationId = $"{apiBase}{ApiConfig.Registration}";
|
||||||
PackageRegistration index = new PackageRegistration(baseid);
|
PackageRegistration index = new PackageRegistration(baseId);
|
||||||
|
|
||||||
var scope = await dbContext.Commits.OrderBy(c => c.TimeStamp).ToArrayAsync();
|
var scope = await dbContext.Commits.OrderBy(c => c.TimeStamp).ToArrayAsync();
|
||||||
|
|
||||||
@ -149,21 +170,21 @@ namespace isnd.Services
|
|||||||
.Include(pkg => pkg.LatestCommit)
|
.Include(pkg => pkg.LatestCommit)
|
||||||
.ToArrayAsync())
|
.ToArrayAsync())
|
||||||
.GroupBy((q) => q.Id);
|
.GroupBy((q) => q.Id);
|
||||||
|
|
||||||
foreach (var pkgid in validPkgs)
|
foreach (var pkgIdGroup in validPkgs)
|
||||||
{
|
{
|
||||||
|
|
||||||
CatalogPage page = index.Items.FirstOrDefault
|
CatalogPage page = index.Items.FirstOrDefault
|
||||||
(p => p.GetPackageId() == pkgid.Key);
|
(p => p.GetPackageId() == pkgIdGroup.Key);
|
||||||
if (page == null)
|
if (page == null)
|
||||||
{
|
{
|
||||||
page = new CatalogPage(pkgid.Key, apiBase);
|
page = new CatalogPage(pkgIdGroup.Key, apiBase);
|
||||||
index.Items.Add(page);
|
index.Items.Add(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var pkgv in pkgid)
|
foreach (var package in pkgIdGroup)
|
||||||
{
|
{
|
||||||
page.AddVersionRange(pkgv.Versions);
|
page.AddVersionRange(package.Versions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
reason = commit;
|
reason = commit;
|
||||||
@ -173,7 +194,7 @@ namespace isnd.Services
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PackageDeletionReport> DeletePackageAsync
|
public async Task<PackageDeletionReport> DeletePackageAsync
|
||||||
(string pkgid, string version, string type)
|
(string pkgId, string version, string type)
|
||||||
{
|
{
|
||||||
// TODO deletion on disk
|
// TODO deletion on disk
|
||||||
var commit = new Commit
|
var commit = new Commit
|
||||||
@ -183,7 +204,7 @@ namespace isnd.Services
|
|||||||
};
|
};
|
||||||
dbContext.Commits.Add(commit);
|
dbContext.Commits.Add(commit);
|
||||||
var pkg = await dbContext.PackageVersions.SingleOrDefaultAsync(
|
var pkg = await dbContext.PackageVersions.SingleOrDefaultAsync(
|
||||||
v => v.PackageId == pkgid &&
|
v => v.PackageId == pkgId &&
|
||||||
v.FullString == version &&
|
v.FullString == version &&
|
||||||
v.Type == type
|
v.Type == type
|
||||||
);
|
);
|
||||||
@ -193,15 +214,15 @@ namespace isnd.Services
|
|||||||
}
|
}
|
||||||
dbContext.PackageVersions.Remove(pkg);
|
dbContext.PackageVersions.Remove(pkg);
|
||||||
await dbContext.SaveChangesAsync();
|
await dbContext.SaveChangesAsync();
|
||||||
await ÛpdateCatalogForAsync(commit);
|
await UpdateCatalogForAsync(commit);
|
||||||
return new PackageDeletionReport { Deleted = true, DeletedVersion = pkg };
|
return new PackageDeletionReport { Deleted = true, DeletedVersion = pkg };
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PackageVersion> GetPackageAsync
|
public async Task<PackageVersion> GetPackageAsync
|
||||||
(string pkgid, string version, string type)
|
(string pkgId, string version, string type)
|
||||||
{
|
{
|
||||||
return await dbContext.PackageVersions.SingleOrDefaultAsync(
|
return await dbContext.PackageVersions.SingleOrDefaultAsync(
|
||||||
v => v.PackageId == pkgid &&
|
v => v.PackageId == pkgId &&
|
||||||
v.FullString == version &&
|
v.FullString == version &&
|
||||||
v.Type == type
|
v.Type == type
|
||||||
);
|
);
|
||||||
@ -215,9 +236,9 @@ namespace isnd.Services
|
|||||||
.Include(v => v.Package.LatestCommit)
|
.Include(v => v.Package.LatestCommit)
|
||||||
.Include(v => v.Package.Owner)
|
.Include(v => v.Package.Owner)
|
||||||
.Include(v => v.LatestCommit)
|
.Include(v => v.LatestCommit)
|
||||||
.Where(v => v.PackageId == pkgId
|
.Where(v => v.PackageId == pkgId
|
||||||
&& v.FullString == semver
|
&& v.FullString == semver
|
||||||
&& v.LatestCommit !=null
|
&& v.LatestCommit != null
|
||||||
).SingleOrDefaultAsync()).ToPackage(
|
).SingleOrDefaultAsync()).ToPackage(
|
||||||
apiBase);
|
apiBase);
|
||||||
}
|
}
|
||||||
@ -238,12 +259,13 @@ namespace isnd.Services
|
|||||||
public IEnumerable<Data.Catalog.Package> SearchCatalogEntriesById
|
public IEnumerable<Data.Catalog.Package> SearchCatalogEntriesById
|
||||||
(string pkgId, string semver, string pkgType, bool preRelease)
|
(string pkgId, string semver, string pkgType, bool preRelease)
|
||||||
{
|
{
|
||||||
|
// PackageDependency
|
||||||
return dbContext.PackageVersions
|
return dbContext.PackageVersions
|
||||||
.Include(v => v.Package)
|
.Include(v => v.Package)
|
||||||
.Include(v => v.Package.Owner)
|
.Include(v => v.Package.Owner)
|
||||||
.Include(v => v.Package.LatestCommit)
|
.Include(v => v.Package.LatestCommit)
|
||||||
.Include(v => v.LatestCommit)
|
.Include(v => v.LatestCommit)
|
||||||
|
.Include(v => v.DependencyGroups)
|
||||||
.Where(v => v.PackageId == pkgId && semver == v.FullString
|
.Where(v => v.PackageId == pkgId && semver == v.FullString
|
||||||
&& (pkgType == null || pkgType == v.Type)
|
&& (pkgType == null || pkgType == v.Type)
|
||||||
&& (preRelease || !v.IsPrerelease))
|
&& (preRelease || !v.IsPrerelease))
|
||||||
@ -271,21 +293,21 @@ namespace isnd.Services
|
|||||||
.Include(p => p.Owner)
|
.Include(p => p.Owner)
|
||||||
.Include(p => p.LatestCommit)
|
.Include(p => p.LatestCommit)
|
||||||
.SingleOrDefaultAsync(p => p.Id.ToLower() == query.Query);
|
.SingleOrDefaultAsync(p => p.Id.ToLower() == query.Query);
|
||||||
if (scope==null) return null;
|
if (scope == null) return null;
|
||||||
if (scope.Versions.Count==0) return null;
|
if (scope.Versions.Count == 0) return null;
|
||||||
string bid = $"{apiBase}{ApiConfig.Registration}";
|
string bid = $"{apiBase}{ApiConfig.Registration}";
|
||||||
foreach (var version in scope.Versions)
|
foreach (var version in scope.Versions)
|
||||||
version.LatestCommit = dbContext.Commits.Single(c=>c.Id == version.CommitNId);
|
version.LatestCommit = dbContext.Commits.Single(c => c.Id == version.CommitNId);
|
||||||
return
|
return
|
||||||
new PackageRegistration(apiBase, scope);
|
new PackageRegistration(apiBase, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PackageSearchResult> SearchPackageAsync(PackageRegistrationQuery query)
|
public async Task<PackageSearchResult> SearchPackageAsync(PackageRegistrationQuery query)
|
||||||
{
|
{
|
||||||
string bid = $"{apiBase}{ApiConfig.Registration}";
|
string bid = $"{apiBase}{ApiConfig.Registration}";
|
||||||
if (string.IsNullOrWhiteSpace(query.Query))
|
if (string.IsNullOrWhiteSpace(query.Query))
|
||||||
query.Query="";
|
query.Query = "";
|
||||||
var scope = dbContext.Packages
|
var scope = dbContext.Packages
|
||||||
.Include(p => p.Owner)
|
.Include(p => p.Owner)
|
||||||
.Include(p => p.Versions)
|
.Include(p => p.Versions)
|
||||||
.Include(p => p.LatestCommit)
|
.Include(p => p.LatestCommit)
|
||||||
@ -293,11 +315,155 @@ namespace isnd.Services
|
|||||||
.Where(p => p.Id.StartsWith(query.Query)
|
.Where(p => p.Id.StartsWith(query.Query)
|
||||||
&& p.LatestCommit != null
|
&& p.LatestCommit != null
|
||||||
&& (query.Prerelease || p.Versions.Any(p => !p.IsPrerelease))
|
&& (query.Prerelease || p.Versions.Any(p => !p.IsPrerelease))
|
||||||
&& p.Versions.Count()>0)
|
&& p.Versions.Count() > 0)
|
||||||
.OrderBy(p => p.CommitNId);
|
.OrderBy(p => p.CommitNId);
|
||||||
|
|
||||||
return new PackageSearchResult(await scope.Skip(query.Skip).Take(query.Take)
|
return new PackageSearchResult(await scope.Skip(query.Skip).Take(query.Take)
|
||||||
.ToListAsync(), apiBase, scope.Count());
|
.ToListAsync(), apiBase, scope.Count());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<PackageVersion> PutPackageAsync(Stream packageStream, string ownerId)
|
||||||
|
{
|
||||||
|
PackageVersion version = null;
|
||||||
|
using (packageStream)
|
||||||
|
{
|
||||||
|
using (var archive = new ZipArchive(packageStream))
|
||||||
|
{
|
||||||
|
var spec = archive.Entries.FirstOrDefault(e => e.FullName.EndsWith("." + Constants.SpecFileExtension));
|
||||||
|
if (spec == null) throw new InvalidPackageException("no " + Constants.SpecFileExtension + " from archive");
|
||||||
|
string pkgPath;
|
||||||
|
NuGetVersion nugetVersion;
|
||||||
|
string pkgId;
|
||||||
|
string fullPath;
|
||||||
|
|
||||||
|
using var specificationStream = spec.Open();
|
||||||
|
|
||||||
|
using XmlReader xmlReader = XmlReader.Create(specificationStream);
|
||||||
|
|
||||||
|
var xMeta = XElement.Load(xmlReader, LoadOptions.None).Descendants().First();
|
||||||
|
|
||||||
|
string packageDescription = xMeta.Descendants().FirstOrDefault(x => x.Name.LocalName == "description")?.Value;
|
||||||
|
|
||||||
|
var frameWorks = xMeta
|
||||||
|
.Descendants().FirstOrDefault(x => x.Name.LocalName =="frameworkReferences")
|
||||||
|
.Descendants().Where(x => x.Name.LocalName =="group")
|
||||||
|
.Select(x=> x.Attribute("targetFramework").Value).ToArray();
|
||||||
|
var types = "Package";
|
||||||
|
|
||||||
|
pkgId = xMeta.Descendants().FirstOrDefault(x => x.Name.LocalName =="id")?.Value;
|
||||||
|
string pkgVersion = xMeta.Descendants().FirstOrDefault(x => x.Name.LocalName =="version")?.Value;
|
||||||
|
|
||||||
|
if (!NuGetVersion.TryParse(pkgVersion, out nugetVersion))
|
||||||
|
throw new InvalidPackageException("metadata/version");
|
||||||
|
|
||||||
|
var frameworkReferences = frameWorks.Select(g => new PackageDependencyGroup
|
||||||
|
{
|
||||||
|
TargetFramework = g
|
||||||
|
}
|
||||||
|
).ToList();
|
||||||
|
|
||||||
|
string packageIdPath = Path.Combine(isndSettings.PackagesRootDir,
|
||||||
|
pkgId);
|
||||||
|
pkgPath = Path.Combine(packageIdPath, nugetVersion.ToFullString());
|
||||||
|
string name = $"{pkgId}-{nugetVersion}." + Constants.PacketFileExtension;
|
||||||
|
fullPath = Path.Combine(pkgPath, name);
|
||||||
|
|
||||||
|
var packageIdPathInfo = new DirectoryInfo(packageIdPath);
|
||||||
|
Data.Packages.Package pkg = dbContext.Packages.SingleOrDefault(p => p.Id == pkgId);
|
||||||
|
Commit commit = new Commit
|
||||||
|
{
|
||||||
|
Action = PackageAction.PublishPackage,
|
||||||
|
TimeStamp = DateTimeOffset.Now.ToUniversalTime()
|
||||||
|
};
|
||||||
|
if (pkg != null)
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
pkg.Description = packageDescription;
|
||||||
|
pkg.LatestCommit = commit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// First version
|
||||||
|
pkg = new Data.Packages.Package
|
||||||
|
{
|
||||||
|
Id = pkgId,
|
||||||
|
Description = packageDescription,
|
||||||
|
OwnerId = ownerId,
|
||||||
|
LatestCommit = commit
|
||||||
|
};
|
||||||
|
dbContext.Packages.Add(pkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// here, the package is or new, or owned by the key owner
|
||||||
|
if (!packageIdPathInfo.Exists) packageIdPathInfo.Create();
|
||||||
|
|
||||||
|
var dest = new FileInfo(fullPath);
|
||||||
|
var destDir = new DirectoryInfo(dest.DirectoryName);
|
||||||
|
if (dest.Exists) dest.Delete();
|
||||||
|
if (!destDir.Exists) destDir.Create();
|
||||||
|
|
||||||
|
packageStream.Seek(0, SeekOrigin.Begin);
|
||||||
|
using (var fileStream = File.Create(fullPath))
|
||||||
|
{
|
||||||
|
await packageStream.CopyToAsync(fileStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
string fullStringVersion = nugetVersion.ToFullString();
|
||||||
|
var pkgVersions = dbContext.PackageVersions.Where
|
||||||
|
(v => v.PackageId == pkg.Id && v.FullString == fullStringVersion);
|
||||||
|
if (pkgVersions.Count() > 0)
|
||||||
|
{
|
||||||
|
foreach (var v in pkgVersions.ToArray())
|
||||||
|
dbContext.PackageVersions.Remove(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME default type or null
|
||||||
|
dbContext.PackageVersions.Add
|
||||||
|
(version = new PackageVersion
|
||||||
|
{
|
||||||
|
|
||||||
|
Package = pkg,
|
||||||
|
Major = nugetVersion.Major,
|
||||||
|
Minor = nugetVersion.Minor,
|
||||||
|
Patch = nugetVersion.Patch,
|
||||||
|
Revision = nugetVersion.Revision,
|
||||||
|
IsPrerelease = nugetVersion.IsPrerelease,
|
||||||
|
FullString = nugetVersion.ToFullString(),
|
||||||
|
Type =types,
|
||||||
|
LatestCommit = commit
|
||||||
|
});
|
||||||
|
|
||||||
|
dbContext.Commits.Add(commit);
|
||||||
|
|
||||||
|
await dbContext.SaveChangesAsync();
|
||||||
|
version.DependencyGroups = frameworkReferences;
|
||||||
|
await UpdateCatalogForAsync(commit);
|
||||||
|
|
||||||
|
|
||||||
|
using (var shaCrypto = System.Security.Cryptography.SHA512.Create())
|
||||||
|
{
|
||||||
|
using (var stream = System.IO.File.OpenRead(fullPath))
|
||||||
|
{
|
||||||
|
var hash = shaCrypto.ComputeHash(stream);
|
||||||
|
var shaFullName = fullPath + ".sha512";
|
||||||
|
var hashText = Convert.ToBase64String(hash);
|
||||||
|
var hashTextBytes = Encoding.ASCII.GetBytes(hashText);
|
||||||
|
|
||||||
|
using (var shaFile = System.IO.File.OpenWrite(shaFullName))
|
||||||
|
{
|
||||||
|
shaFile.Write(hashTextBytes, 0, hashTextBytes.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
string nugetSpecificationFullPath = Path.Combine(pkgPath, pkgId + "." + Constants.SpecFileExtension);
|
||||||
|
FileInfo nugetSpecificationFullPathInfo = new(nugetSpecificationFullPath);
|
||||||
|
|
||||||
|
if (nugetSpecificationFullPathInfo.Exists)
|
||||||
|
nugetSpecificationFullPathInfo.Delete();
|
||||||
|
spec.ExtractToFile(nugetSpecificationFullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return version;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,6 +1,6 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net7.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<UserSecretsId>85fd766d-5d23-4476-aed1-463b2942e86a</UserSecretsId>
|
<UserSecretsId>85fd766d-5d23-4476-aed1-463b2942e86a</UserSecretsId>
|
||||||
<IsPackable>true</IsPackable>
|
<IsPackable>true</IsPackable>
|
||||||
<PackageLicenseExpression>WTFPL</PackageLicenseExpression>
|
<PackageLicenseExpression>WTFPL</PackageLicenseExpression>
|
||||||
@ -13,31 +13,30 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="7.0.15" />
|
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.3" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="7.0.15" />
|
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="8.0.3" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.15">
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.3">
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.15" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.3" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="7.0.11" />
|
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="7.0.15" />
|
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="8.0.3" />
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.11" IncludeAssets="All" />
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" IncludeAssets="All" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.15" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.3" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.15" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.3" />
|
||||||
|
|
||||||
<PackageReference Include="NuGet.Packaging.Core" Version="6.8.0" />
|
<PackageReference Include="NuGet.Packaging.Core" Version="6.9.1" />
|
||||||
<PackageReference Include="MailKit" Version="4.3.0" />
|
<PackageReference Include="MailKit" Version="4.4.0" />
|
||||||
<PackageReference Include="unleash.client" Version="4.1.6" />
|
|
||||||
<PackageReference Include="GitVersion.MsBuild" Version="5.12.0">
|
<PackageReference Include="GitVersion.MsBuild" Version="5.12.0">
|
||||||
<PrivateAssets>All</PrivateAssets>
|
<PrivateAssets>All</PrivateAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="System.Security.Cryptography.Pkcs" Version="8.0.0" />
|
<PackageReference Include="System.Security.Cryptography.Pkcs" Version="8.0.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Antiforgery" Version="2.2.0" />
|
<PackageReference Include="Microsoft.AspNetCore.Antiforgery" Version="2.2.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.15" />
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="../isn.abst/isn.abst.csproj" />
|
<ProjectReference Include="../isn.abst/isn.abst.csproj" />
|
||||||
|
@ -2,3 +2,9 @@ https://api.nuget.org/v3/registration5-gz-semver2/yavsc.abstract/index.json
|
|||||||
https://api.nuget.org/v3/catalog0/data/2019.09.17.10.18.17/yavsc.abstract.1.0.6-rc07.json
|
https://api.nuget.org/v3/catalog0/data/2019.09.17.10.18.17/yavsc.abstract.1.0.6-rc07.json
|
||||||
http://localhost:5000/v3/index
|
http://localhost:5000/v3/index
|
||||||
http://localhost:5000/v3/registration/isn.abst/index.json
|
http://localhost:5000/v3/registration/isn.abst/index.json
|
||||||
|
https://isn.pschneider.fr/v3/registration5-gz-semver2/isn.abst/index.json
|
||||||
|
https://isn.pschneider.fr/v3/content/isn.abst/index.json
|
||||||
|
http://localhost:5000/v3/registration5-gz-semver2/isn.abst/index.json
|
||||||
|
http://localhost:5000/v3/registration/isn.abst/index.json
|
||||||
|
http://localhost:5000/v3/content/isn.abst/index.json
|
||||||
|
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using isn.Abstract;
|
using isn.Abstract;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using isn.abst;
|
using isn.abst;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
namespace isn.tests
|
namespace isn.tests
|
||||||
{
|
{
|
||||||
@ -42,6 +42,18 @@ namespace isn.tests
|
|||||||
var pub = model.Resources.FirstOrDefault((r) => r.Type.StartsWith("PackagePublish/"));
|
var pub = model.Resources.FirstOrDefault((r) => r.Type.StartsWith("PackagePublish/"));
|
||||||
Assert.True(pub != null);
|
Assert.True(pub != null);
|
||||||
}
|
}
|
||||||
|
[Fact]
|
||||||
|
public void TestSetApiKey()
|
||||||
|
{
|
||||||
|
string source = "http://localhost:3002/v3/index.json";
|
||||||
|
|
||||||
|
var setting = Settings.Create();
|
||||||
|
setting.Sources[source] = new SourceSettings{ Url=source };
|
||||||
|
string testingKey = "CfDJ8LF3SbIJ4FJAgs7uIQKhdCAYCNVXRwU6TEoaXOo1_ZpG2u8TCGFP2z13hw9xR0LC0gdbr1QGwNndiXUl4DI74nxyBi-T1oC33PWtE-5vgiJWeCH223PYtoSEdzDiWovwJZWJbQON0WqoG8vSfbrBXTmicD6oxF4ghwXXexY0RiRR";
|
||||||
|
var rsa = RSA.Create(setting.RSAParameters);
|
||||||
|
setting.Sources[source].SetApiKey(rsa,testingKey);
|
||||||
|
Assert.Equal(testingKey, setting.Sources[source].GetClearApiKey(rsa));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,6 +1,6 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net7.0</TargetFrameworks>
|
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||||
<IsPackable>false</IsPackable>
|
<IsPackable>false</IsPackable>
|
||||||
<NoWarn>NETSDK1138</NoWarn>
|
<NoWarn>NETSDK1138</NoWarn>
|
||||||
<AssemblyVersion>1.0.7.0</AssemblyVersion>
|
<AssemblyVersion>1.0.7.0</AssemblyVersion>
|
||||||
@ -9,12 +9,13 @@
|
|||||||
<Version>1.0.7</Version>
|
<Version>1.0.7</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
||||||
<PackageReference Include="xunit" Version="2.4.2" />
|
<PackageReference Include="xunit" Version="2.7.0" />
|
||||||
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
|
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
|
||||||
<PackageReference Include="xunit.runner.reporters" Version="2.4.2" />
|
<PackageReference Include="xunit.runner.reporters" Version="2.7.0" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.2" />
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7" />
|
||||||
<PackageToolReference Include="xunit.runner.console" Version="2.4.2" PrivateAssets="All" />
|
|
||||||
|
<PackageToolReference Include="xunit.runner.console" Version="2.5.7" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\isn\isn.csproj" />
|
<ProjectReference Include="..\..\src\isn\isn.csproj" />
|
||||||
|
@ -151,10 +151,9 @@ namespace isnd.host.tests
|
|||||||
{
|
{
|
||||||
ILogger logger = new TestLogger();
|
ILogger logger = new TestLogger();
|
||||||
CancellationToken cancellationToken = CancellationToken.None;
|
CancellationToken cancellationToken = CancellationToken.None;
|
||||||
|
|
||||||
SourceRepository repository = Repository.Factory.GetCoreV3(SPIIndexURI);
|
SourceRepository repository = Repository.Factory.GetCoreV3(SPIIndexURI);
|
||||||
repository.PackageSource.AllowInsecureConnections=true;
|
repository.PackageSource.AllowInsecureConnections=true;
|
||||||
|
|
||||||
PackageSearchResource resource = await repository.GetResourceAsync<PackageSearchResource>();
|
PackageSearchResource resource = await repository.GetResourceAsync<PackageSearchResource>();
|
||||||
SearchFilter searchFilter = new SearchFilter(includePrerelease: true);
|
SearchFilter searchFilter = new SearchFilter(includePrerelease: true);
|
||||||
|
|
||||||
@ -184,6 +183,15 @@ namespace isnd.host.tests
|
|||||||
await pushRes.Push(new List<string>{ "../../../../../src/isnd/bin/Release/isnd.1.1.4.nupkg" }, null,
|
await pushRes.Push(new List<string>{ "../../../../../src/isnd/bin/Release/isnd.1.1.4.nupkg" }, null,
|
||||||
5000, false, GetApiKey, GetSymbolsApiKey, false, false, symbolPackageResource, logger);
|
5000, false, GetApiKey, GetSymbolsApiKey, false, false, symbolPackageResource, logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestDepedency()
|
||||||
|
{
|
||||||
|
PackageDependencyGroup g = new PackageDependencyGroup
|
||||||
|
{
|
||||||
|
TargetFramework="net7.0"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private string GetSymbolsApiKey(string apiUrl)
|
private string GetSymbolsApiKey(string apiUrl)
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net7.0</TargetFrameworks>
|
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||||
<IsPackable>false</IsPackable>
|
<IsPackable>false</IsPackable>
|
||||||
<UserSecretsId>d7144e46-4e63-4391-ba86-64b61f6e7be4</UserSecretsId>
|
<UserSecretsId>d7144e46-4e63-4391-ba86-64b61f6e7be4</UserSecretsId>
|
||||||
<NoWarn>NETSDK1138</NoWarn>
|
<NoWarn>NETSDK1138</NoWarn>
|
||||||
@ -12,10 +12,10 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
||||||
<PackageReference Include="XunitXml.TestLogger" Version="3.1.20" />
|
<PackageReference Include="XunitXml.TestLogger" Version="3.1.20" />
|
||||||
<PackageReference Include="xunit" Version="2.6.6" />
|
<PackageReference Include="xunit" Version="2.7.0" />
|
||||||
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
|
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
|
||||||
<PackageReference Include="xunit.runner.reporters" Version="2.6.6" />
|
<PackageReference Include="xunit.runner.reporters" Version="2.7.0" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6" />
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7" />
|
||||||
<PackageToolReference Include="xunit.runner.console" Version="2.4.2" PrivateAssets="All" />
|
<PackageToolReference Include="xunit.runner.console" Version="2.4.2" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
Reference in New Issue
Block a user