trying with isn.abst

main
Paul Schneider 5 months ago
parent 3af05fc034
commit 9c9ee6cc4c
10 changed files with 610 additions and 39 deletions

@ -20,21 +20,22 @@ wget http://localhost:5000/package/index.json?q=your&prerelease=true&semVerLevel
### Compilation
Depuis le dossier de la solution, compiler la solution :
Dans le dossier de la solution, compiler la solution :
````bash
dotnet build /restore -c Release
dotnet publish -c Release
dotnet publish -c Release src/isnd
````
### Déploiement du serveur
Commençont par la livraison initiale, aujourd'hui :
La livraison initiale, aujourd'hui :
````bash
sudo mkdir -p /srv/www/isnd
sudo cp -a src/isnd/bin/Release/net7.0/publish/* /srv/www/isnd
sudo cp -a src/isnd/bin/Release/net8.0/publish/* /srv/www/isnd
sudo cp contrib/isnd.service /etc/systemd/system
chown -R isn:isn /srv/www/isnd/
sudo systemctl daemon-reload
````
@ -43,13 +44,13 @@ son utilisateur, et le droit de créer des tables (ce dernier droit pourrait exp
Il faudra éditer la configuration pour indiquer :
* la connextion à une base de donnée Postresgql, sous la forme :
* dans /etc/systemd/system/isnd.service , la connextion à une base de donnée Postresgql, sous la forme :
`"Server=<pgserver>;Port=<pgport>;Database=<dbname>;Username=<dbusername>;Password=<dbpass>;"`
* la connection au serveur de messagerie,
* l'URL du ou des sites à propulser,
* Les autres détails.
* dans /srv/www/isnd/appsettings.Production.json, la connection au serveur de messagerie,
* l'URL externe du ou des sites à propulser, et à utiliser dans la description de service,
* et les autres détails.
Pour faire ceci, vous pourrez éditer une copie du fichier `appsettings.json` vers `appsettings.Production.json`,
Pour faire ceci, vous pourrez éditer une copie du fichier `appsettings.json` vers `appsettings.Production.json`,
pour renseigner toutes les valeurs spécifiées.
* Démarrer le serveur :

@ -12,17 +12,17 @@ Type=simple
User=isn
Group=isn
WorkingDirectory=/srv/www/isnd/
# If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file
# (manually creating /run/gitea doesn't work, because it would not persist across reboots)
#RuntimeDirectory=gitea
ExecStart=/srv/www/isnd/isnd
Restart=always
Environment=HOME=/srv/www/isnd
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
Environment="HOME=/srv/www/isnd"
Environment="ASPNETCORE_ENVIRONMENT=Production"
Environment="ASPNETCORE_ConnectionStrings__DefaultConnection=Server=localhost;Port=5432;Database=isnd;Username=paul;Password=RvJa=y#b/tfg;"
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=isnd
[Install]
WantedBy=multi-user.target

@ -27,13 +27,9 @@ namespace isnd.Data
_ = builder.Entity<PackageVersion>()
.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 } );
_ = builder.Entity<Dependency>().HasOne(d=>d.Group)
.WithMany(g=>g.Dependencies);
}

@ -8,12 +8,13 @@ namespace isnd.Data
{
public class Dependency
{
[Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { get;set;}
/// <summary>
/// Dependency Package Identifier
/// </summary>
/// <value></value>
[Key]
public string Id { get;set;}
public string PackageId { get;set;}
/// <summary>
/// Dependency Group Id

@ -19,7 +19,7 @@ namespace isnd.Data
{
return groups.Select(group => new NuGet.Packaging.PackageDependencyGroup(
new NuGetFramework(group.TargetFramework),
group.Dependencies.Select(dep => new PackageDependency(dep.Id))
group.Dependencies.Select(dep => new PackageDependency(dep.PackageId))
)).ToArray();
}
}

@ -0,0 +1,535 @@
// <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("20240422204649_dependenciesReloaded")]
partial class dependenciesReloaded
{
/// <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>("PackageId")
.HasColumnType("text");
b.Property<string>("Version")
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("DependencyGroupId");
b.ToTable("Dependencies");
});
modelBuilder.Entity("isnd.Data.PackageDependencyGroup", b =>
{
b.Property<string>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("text");
b.Property<string>("PackageId")
.IsRequired()
.HasColumnType("character varying(1024)");
b.Property<string>("PackageVersionFullString")
.IsRequired()
.HasColumnType("character varying(256)");
b.Property<string>("TargetFramework")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("PackageId", "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", "PackageVersion")
.WithMany("DependencyGroups")
.HasForeignKey("PackageId", "PackageVersionFullString")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("PackageVersion");
});
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
}
}
}

@ -0,0 +1,28 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace isnd.Migrations
{
/// <inheritdoc />
public partial class dependenciesReloaded : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "PackageId",
table: "Dependencies",
type: "text",
nullable: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "PackageId",
table: "Dependencies");
}
}
}

@ -177,7 +177,7 @@ namespace isnd.Migrations
b.HasIndex("UserId");
b.ToTable("ApiKeys", (string)null);
b.ToTable("ApiKeys");
});
modelBuilder.Entity("isnd.Data.ApplicationUser", b =>
@ -260,6 +260,9 @@ namespace isnd.Migrations
b.Property<string>("Exclude")
.HasColumnType("text");
b.Property<string>("PackageId")
.HasColumnType("text");
b.Property<string>("Version")
.HasColumnType("text");
@ -267,7 +270,7 @@ namespace isnd.Migrations
b.HasIndex("DependencyGroupId");
b.ToTable("Dependencies", (string)null);
b.ToTable("Dependencies");
});
modelBuilder.Entity("isnd.Data.PackageDependencyGroup", b =>
@ -292,7 +295,7 @@ namespace isnd.Migrations
b.HasIndex("PackageId", "PackageVersionFullString");
b.ToTable("PackageDependencyGroups", (string)null);
b.ToTable("PackageDependencyGroups");
});
modelBuilder.Entity("isnd.Data.PackageVersion", b =>
@ -331,7 +334,7 @@ namespace isnd.Migrations
b.HasIndex("CommitNId");
b.ToTable("PackageVersions", (string)null);
b.ToTable("PackageVersions");
});
modelBuilder.Entity("isnd.Data.Packages.Commit", b =>
@ -350,7 +353,7 @@ namespace isnd.Migrations
b.HasKey("Id");
b.ToTable("Commits", (string)null);
b.ToTable("Commits");
});
modelBuilder.Entity("isnd.Data.Packages.Package", b =>
@ -379,7 +382,7 @@ namespace isnd.Migrations
b.HasIndex("OwnerId");
b.ToTable("Packages", (string)null);
b.ToTable("Packages");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>

@ -362,8 +362,12 @@ namespace isnd.Services
string packageDescription = xMeta.Descendants().FirstOrDefault(x => x.Name.LocalName == "description")?.Value;
var frameWorks = xMeta
.Descendants().FirstOrDefault(x => x.Name.LocalName == "frameworkReferences")
var dependencies = xMeta
.Descendants().FirstOrDefault(x => x.Name.LocalName == "dependencies");
var frameworkReferences= xMeta
.Descendants().FirstOrDefault(x => x.Name.LocalName == "frameworkReferences");
var frameWorks = (dependencies ?? frameworkReferences)
.Descendants().Where(x => x.Name.LocalName == "group")
.Select(x => NewFrameworkDependencyGroup(x)).ToArray();
var types = "Package";
@ -467,10 +471,11 @@ namespace isnd.Services
Dependencies = framework.Dependencies.Select(
d => new Dependency
{
Id = d.PackageId,
PackageId = d.PackageId,
Version = d.PackageVersion,
}).ToList()
};
version.DependencyGroups.Add(group);
dbContext.PackageDependencyGroups.Add(group);
@ -510,14 +515,16 @@ namespace isnd.Services
var view = x.ToJson();
var frameworkReferences = x.Descendants();
var framework = x.Attribute("targetFramework").Value;
var deps = frameworkReferences.Select(r => new ShortDependencyInfo
{
PackageId = (r.Attribute("name") ?? r.Attribute("id")).Value,
PackageVersion = r.Attribute("version")?.Value
});
return new FrameworkDependencyGroup
{
FrameworkName = framework,
Dependencies = frameworkReferences.Select(r => new ShortDependencyInfo
{
PackageId = r.Attribute("name").Value,
PackageVersion = r.Attribute("version")?.Value
}).ToList()
Dependencies = deps.ToList()
};
}

@ -159,7 +159,7 @@ namespace isnd.host.tests
SearchFilter searchFilter = new SearchFilter(includePrerelease: true);
IEnumerable<IPackageSearchMetadata> results = await resource.SearchAsync(
"isnd",
"isn.abst",
searchFilter,
skip: 0,
take: 20,
@ -181,7 +181,7 @@ namespace isnd.host.tests
PackageUpdateResource pushRes = await repository.GetResourceAsync<PackageUpdateResource>();
SymbolPackageUpdateResourceV3 symbolPackageResource = await repository.GetResourceAsync<SymbolPackageUpdateResourceV3>();
await pushRes.Push(new List<string>{ "../../../../../src/isnd/bin/Release/isnd.1.1.4.nupkg" }, null,
await pushRes.Push(new List<string>{ "../../../../../src/isn.abst/bin/Release/isn.abst.1.0.1.nupkg" }, null,
5000, false, GetApiKey, GetSymbolsApiKey, false, false, symbolPackageResource, logger);
}

Loading…