diff --git a/.github/workflows/dotnet.yml b/.github/workflows/buildAndTest.yml
similarity index 97%
rename from .github/workflows/dotnet.yml
rename to .github/workflows/buildAndTest.yml
index c39ed77c..4be71514 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/buildAndTest.yml
@@ -44,7 +44,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
- dotnet-version: 8.0.x
+ dotnet-version: 9.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
deleted file mode 100644
index 0ef899a4..00000000
--- a/.github/workflows/main.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-on: workflow_call
-jobs:
- my_first_job:
- runs-on: ubuntu-latest
- steps:
- - name: Run my action
- uses: ./.github/worklflows/dotnet
diff --git a/.gitignore b/.gitignore
index c56cc0ea..19b51779 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@
.paket/
.vs/
.sass-cache/
+.private/
/out
bin
diff --git a/.vscode/launch.json b/.vscode/launch.json
index ed62f985..43c862cc 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -43,7 +43,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
- "program": "${workspaceFolder}/src/Yavsc/bin/Debug/net8.0/Yavsc.dll",
+ "program": "${workspaceFolder}/src/Yavsc/bin/Debug/net9.0/Yavsc.dll",
"args": [],
"cwd": "${workspaceFolder}/src/Yavsc",
"stopAtEntry": false,
diff --git a/README.md b/README.md
index 251ac1bc..ab9ae3a5 100644
--- a/README.md
+++ b/README.md
@@ -17,15 +17,15 @@ C'est une application mettant en oeuvre une prise de contact entre un demandeur
et, pour execution en environement de développement
-```
- ~/workspace/yavsc/Yavsc @ ASPNETCORE_ENV=Development dotnet run
+```bash
+~/workspace/yavsc/Yavsc @ ASPNETCORE_ENV=Development dotnet run
```
## Tests
Utilisez GNU/Makefile (et visitez le code, dans le dossier `test` ):
-[TOREDO] Depuis le répertoire racine:
+[TODO] Depuis le répertoire racine:
```bash
make test
@@ -33,13 +33,14 @@ make test
## Installation / Déploiment / Développement
-### les services kestrel et kestrel-pre
-
-[TODO]
+### les services et l'API
### La Prod
-Une fois sûr de vous, et une fois que Git dit propre votre copie de travail, depuis le répertoire `Yavsc`, lancez `make pushInProd`.
+`cd srv/Yavsc` : `make pushInProd CONFIGURATION=Release`.
+
+puis, pour une première installation
+`make install_service`.
## Fonctionalités (encore en cours de développement)
diff --git a/contrib/yavsc.service b/contrib/yavsc.service
new file mode 100644
index 00000000..21380320
--- /dev/null
+++ b/contrib/yavsc.service
@@ -0,0 +1,27 @@
+[Unit]
+Description=Yavsc
+After=syslog.target
+After=network.target
+
+Wants=postgresql.service
+After=postgresql.service
+
+[Service]
+RestartSec=5s
+Type=simple
+User=www-data
+Group=www-data
+WorkingDirectory=/srv/www/yavsc/
+ExecStart=/srv/www/yavsc/Yavsc
+Restart=always
+Environment="HOME=/srv/www/yavsc"
+Environment="ASPNETCORE_ENVIRONMENT=Production"
+Environment="ASPNETCORE_ConnectionStrings__DefaultConnection=YOUR Postgresql CONNECTION STRING"
+CapabilityBoundingSet=CAP_NET_BIND_SERVICE
+AmbientCapabilities=CAP_NET_BIND_SERVICE
+StandardOutput=syslog
+StandardError=syslog
+SyslogIdentifier=yavsc
+
+[Install]
+WantedBy=multi-user.target
diff --git a/src/Api/Api.csproj b/src/Api/Api.csproj
index 6e024e9b..aa256182 100644
--- a/src/Api/Api.csproj
+++ b/src/Api/Api.csproj
@@ -1,12 +1,12 @@
- net8.0
+ net9.0
enable
enable
1c73094f-959f-4211-b1a1-6a69b236c283
-
+
diff --git a/src/Yavsc.Abstract/Google/Messaging/MessageWithPayLoad.cs b/src/Yavsc.Abstract/Google/Messaging/MessageWithPayLoad.cs
index 62b61be4..ed683304 100644
--- a/src/Yavsc.Abstract/Google/Messaging/MessageWithPayLoad.cs
+++ b/src/Yavsc.Abstract/Google/Messaging/MessageWithPayLoad.cs
@@ -19,6 +19,7 @@
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see .
+using Yavsc.Abstract.Models.Messaging;
using Yavsc.Models.Messaging;
namespace Yavsc.Models.Google.Messaging
diff --git a/src/Yavsc.Abstract/Interfaces/IBaseTrackedEntity.cs b/src/Yavsc.Abstract/Interfaces/IBaseTrackedEntity.cs
index f544f654..f87d9ef4 100644
--- a/src/Yavsc.Abstract/Interfaces/IBaseTrackedEntity.cs
+++ b/src/Yavsc.Abstract/Interfaces/IBaseTrackedEntity.cs
@@ -5,8 +5,8 @@ namespace Yavsc
public interface ITrackedEntity
{
DateTime DateCreated { get; set; }
- string UserCreated { get; set; }
+ string? UserCreated { get; set; }
DateTime DateModified { get; set; }
- string UserModified { get; set; }
+ string? UserModified { get; set; }
}
}
diff --git a/src/Yavsc.Abstract/Messaging/Notification.cs b/src/Yavsc.Abstract/Messaging/Notification.cs
index 2fbcb852..8b79e2c8 100644
--- a/src/Yavsc.Abstract/Messaging/Notification.cs
+++ b/src/Yavsc.Abstract/Messaging/Notification.cs
@@ -2,7 +2,7 @@ using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-namespace Yavsc.Models.Messaging
+namespace Yavsc.Abstract.Models.Messaging
{
///
/// A Notification, that mocks the one sent to Google,
@@ -29,25 +29,25 @@ namespace Yavsc.Models.Messaging
///
[StringLength(512)]
[Display(Name = "Icône")]
- public string icon { get; set; }
+ public string? icon { get; set; }
///
/// The sound.
///
[StringLength(512)]
[Display(Name = "Son")]
- public string sound { get; set; }
+ public string? sound { get; set; }
///
/// The tag.
///
[StringLength(512)]
[Display(Name = "Tag")]
- public string tag { get; set; }
+ public string? tag { get; set; }
///
/// The color.
///
[StringLength(512)]
[Display(Name = "Couleur")]
- public string color { get; set; }
+ public string? color { get; set; }
///
/// The click action.
///
@@ -63,7 +63,7 @@ namespace Yavsc.Models.Messaging
///
///
[StringLength(512)]
- public string Target { get; set; }
+ public string? Target { get; set; }
public Notification()
{
diff --git a/src/Yavsc.Abstract/Yavsc.Abstract.csproj b/src/Yavsc.Abstract/Yavsc.Abstract.csproj
index cc74758f..2ade24d2 100644
--- a/src/Yavsc.Abstract/Yavsc.Abstract.csproj
+++ b/src/Yavsc.Abstract/Yavsc.Abstract.csproj
@@ -1,7 +1,7 @@
- net8.0
+ net9.0
enable
enable
A shared model for a little client/server app, dealing about establishing some contract, between some human client and provider.
diff --git a/src/Yavsc.Server/Migrations/20250613122253_notificationTarget.Designer.cs b/src/Yavsc.Server/Migrations/20250613122253_notificationTarget.Designer.cs
new file mode 100644
index 00000000..31454f2a
--- /dev/null
+++ b/src/Yavsc.Server/Migrations/20250613122253_notificationTarget.Designer.cs
@@ -0,0 +1,3509 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Yavsc.Models;
+
+#nullable disable
+
+namespace Yavsc.Migrations
+{
+ [DbContext(typeof(ApplicationDbContext))]
+ [Migration("20250613122253_notificationTarget")]
+ partial class notificationTarget
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "9.0.6")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("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", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClaimType")
+ .HasColumnType("text");
+
+ b.Property("ClaimValue")
+ .HasColumnType("text");
+
+ b.Property("RoleId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClaimType")
+ .HasColumnType("text");
+
+ b.Property("ClaimValue")
+ .HasColumnType("text");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasColumnType("text");
+
+ b.Property("ProviderKey")
+ .HasColumnType("text");
+
+ b.Property("ProviderDisplayName")
+ .HasColumnType("text");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("RoleId")
+ .HasColumnType("text");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("LoginProvider")
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasColumnType("text");
+
+ b.Property("Value")
+ .HasColumnType("text");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens", (string)null);
+ });
+
+ modelBuilder.Entity("Yavsc.Abstract.Identity.ClientProviderInfo", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("Avatar")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("BillingAddressId")
+ .HasColumnType("bigint");
+
+ b.Property("EMail")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Phone")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("UserId");
+
+ b.ToTable("ClientProviderInfo");
+ });
+
+ modelBuilder.Entity("Yavsc.Abstract.Models.Messaging.Notification", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Target")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("body")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("click_action")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("color")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("icon")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasDefaultValue("exclam");
+
+ b.Property("sound")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("tag")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("title")
+ .IsRequired()
+ .HasMaxLength(1024)
+ .HasColumnType("character varying(1024)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Notification");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Access.Ban", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Reason")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("TargetId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserCreated")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserModified")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TargetId");
+
+ b.ToTable("Ban");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Access.BlackListed", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("OwnerId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OwnerId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("BlackListed");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Access.CircleAuthorizationToBlogPost", b =>
+ {
+ b.Property("CircleId")
+ .HasColumnType("bigint");
+
+ b.Property("BlogPostId")
+ .HasColumnType("bigint");
+
+ b.HasKey("CircleId", "BlogPostId");
+
+ b.HasIndex("BlogPostId");
+
+ b.ToTable("CircleAuthorizationToBlogPost");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.AccountBalance", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("ContactCredits")
+ .HasColumnType("bigint");
+
+ b.Property("Credits")
+ .HasColumnType("numeric");
+
+ b.HasKey("UserId");
+
+ b.ToTable("BankStatus");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.ApplicationUser", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("AccessFailedCount")
+ .HasColumnType("integer");
+
+ b.Property("AllowMonthlyEmail")
+ .HasColumnType("boolean");
+
+ b.Property("Avatar")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasDefaultValue("/images/Users/icon_user.png");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("text");
+
+ b.Property("DedicatedGoogleCalendar")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("DiskQuota")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint")
+ .HasDefaultValue(524288000L);
+
+ b.Property("DiskUsage")
+ .HasColumnType("bigint");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("EmailConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property("FullName")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("LockoutEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("LockoutEnd")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("MaxFileSize")
+ .HasColumnType("bigint");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("PasswordHash")
+ .HasColumnType("text");
+
+ b.Property("PhoneNumber")
+ .HasColumnType("text");
+
+ b.Property("PhoneNumberConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property("PostalAddressId")
+ .HasColumnType("bigint");
+
+ b.Property("SecurityStamp")
+ .HasColumnType("text");
+
+ b.Property("TwoFactorEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.HasKey("Id");
+
+ b.HasAlternateKey("Email");
+
+ b.HasIndex("NormalizedEmail")
+ .HasDatabaseName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasDatabaseName("UserNameIndex");
+
+ b.HasIndex("PostalAddressId");
+
+ b.ToTable("AspNetUsers", (string)null);
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Auth.Client", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("AccessTokenLifetime")
+ .HasColumnType("integer");
+
+ b.Property("Active")
+ .HasColumnType("boolean");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)");
+
+ b.Property("LogoutRedirectUri")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("RedirectUri")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("RefreshTokenLifeTime")
+ .HasColumnType("integer");
+
+ b.Property("Secret")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("Applications");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Auth.OAuth2Tokens", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("AccessToken")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Expiration")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ExpiresIn")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("RefreshToken")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("TokenType")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("UserId");
+
+ b.ToTable("OAuth2Tokens");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Auth.RefreshToken", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("ClientId")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("ExpiresUtc")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IssuedUtc")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ProtectedTicket")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Subject")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.HasKey("Id");
+
+ b.ToTable("RefreshTokens");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Auth.Scope", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasMaxLength(1024)
+ .HasColumnType("character varying(1024)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Scopes");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.BalanceImpact", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("BalanceId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ExecDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Impact")
+ .HasColumnType("numeric");
+
+ b.Property("Reason")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BalanceId");
+
+ b.ToTable("BankBook");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Bank.BankIdentity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("AccountNumber")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("BIC")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("BankCode")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("BankedKey")
+ .HasColumnType("integer");
+
+ b.Property("IBAN")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("WicketCode")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("BankIdentity");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Billing.CommandLine", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Count")
+ .HasColumnType("integer");
+
+ b.Property("Currency")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)");
+
+ b.Property("EstimateId")
+ .HasColumnType("bigint");
+
+ b.Property("EstimateTemplateId")
+ .HasColumnType("bigint");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("UnitaryCost")
+ .HasColumnType("numeric");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EstimateId");
+
+ b.HasIndex("EstimateTemplateId");
+
+ b.ToTable("CommandLine");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Billing.Estimate", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("AttachedFilesString")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("AttachedGraphicsString")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ClientId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ClientValidationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CommandId")
+ .HasColumnType("bigint");
+
+ b.Property("CommandType")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("OwnerId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ProviderValidationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClientId");
+
+ b.HasIndex("CommandId");
+
+ b.HasIndex("OwnerId");
+
+ b.ToTable("Estimates");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Billing.EstimateTemplate", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("OwnerId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("EstimateTemplates");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Billing.ExceptionSIREN", b =>
+ {
+ b.Property("SIREN")
+ .HasColumnType("text");
+
+ b.HasKey("SIREN");
+
+ b.ToTable("ExceptionsSIREN");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Blog.BlogPost", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("AuthorId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasMaxLength(56224)
+ .HasColumnType("character varying(56224)");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Photo")
+ .HasMaxLength(1024)
+ .HasColumnType("character varying(1024)");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(1024)
+ .HasColumnType("character varying(1024)");
+
+ b.Property("UserCreated")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserModified")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.ToTable("BlogSpot");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Blog.BlogTag", b =>
+ {
+ b.Property("PostId")
+ .HasColumnType("bigint");
+
+ b.Property("TagId")
+ .HasColumnType("bigint");
+
+ b.HasKey("PostId", "TagId");
+
+ b.HasIndex("TagId");
+
+ b.ToTable("BlogTag");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Blog.Comment", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("AuthorId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ParentId")
+ .HasColumnType("bigint");
+
+ b.Property("ReceiverId")
+ .HasColumnType("bigint");
+
+ b.Property("UserCreated")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserModified")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Visible")
+ .HasColumnType("boolean");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.HasIndex("ParentId");
+
+ b.HasIndex("ReceiverId");
+
+ b.ToTable("Comment");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Calendar.Schedule", b =>
+ {
+ b.Property("OwnerId")
+ .HasColumnType("text");
+
+ b.HasKey("OwnerId");
+
+ b.ToTable("Schedule");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Calendar.ScheduledEvent", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("PeriodEnd")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("PeriodStart")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Reccurence")
+ .HasColumnType("integer");
+
+ b.Property("ScheduleOwnerId")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ScheduleOwnerId");
+
+ b.HasIndex("PeriodStart", "PeriodEnd");
+
+ b.ToTable("ScheduledEvent");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Chat.ChatConnection", b =>
+ {
+ b.Property("ConnectionId")
+ .HasColumnType("text");
+
+ b.Property("ApplicationUserId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Connected")
+ .HasColumnType("boolean");
+
+ b.Property("UserAgent")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("ConnectionId");
+
+ b.HasIndex("ApplicationUserId");
+
+ b.ToTable("ChatConnection");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Chat.ChatRoom", b =>
+ {
+ b.Property("Name")
+ .HasColumnType("text");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("LatestJoinPart")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("OwnerId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Topic")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserCreated")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserModified")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Name");
+
+ b.HasIndex("OwnerId");
+
+ b.ToTable("ChatRoom");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Chat.ChatRoomAccess", b =>
+ {
+ b.Property("ChannelName")
+ .HasColumnType("text");
+
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Level")
+ .HasColumnType("integer");
+
+ b.HasKey("ChannelName", "UserId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("ChatRoomAccess");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Cratie.Option", b =>
+ {
+ b.Property("Code")
+ .HasColumnType("text");
+
+ b.Property("CodeScrutin")
+ .HasColumnType("text");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserCreated")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UserModified")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Code", "CodeScrutin");
+
+ b.ToTable("Option");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Drawing.Color", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Blue")
+ .HasColumnType("smallint");
+
+ b.Property("Green")
+ .HasColumnType("smallint");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Red")
+ .HasColumnType("smallint");
+
+ b.HasKey("Id");
+
+ b.ToTable("Color");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Forms.Form", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("Summary")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Form");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Haircut.BrusherProfile", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("ActionDistance")
+ .HasColumnType("integer");
+
+ b.Property("CarePrice")
+ .HasColumnType("numeric");
+
+ b.Property("FlatFeeDiscount")
+ .HasColumnType("numeric");
+
+ b.Property("HalfBalayagePrice")
+ .HasColumnType("numeric");
+
+ b.Property("HalfBrushingPrice")
+ .HasColumnType("numeric");
+
+ b.Property("HalfColorPrice")
+ .HasColumnType("numeric");
+
+ b.Property("HalfDefrisPrice")
+ .HasColumnType("numeric");
+
+ b.Property("HalfFoldingPrice")
+ .HasColumnType("numeric");
+
+ b.Property("HalfMechPrice")
+ .HasColumnType("numeric");
+
+ b.Property("HalfMultiColorPrice")
+ .HasColumnType("numeric");
+
+ b.Property("HalfPermanentPrice")
+ .HasColumnType("numeric");
+
+ b.Property("KidCutPrice")
+ .HasColumnType("numeric");
+
+ b.Property("LongBalayagePrice")
+ .HasColumnType("numeric");
+
+ b.Property("LongBrushingPrice")
+ .HasColumnType("numeric");
+
+ b.Property("LongColorPrice")
+ .HasColumnType("numeric");
+
+ b.Property("LongDefrisPrice")
+ .HasColumnType("numeric");
+
+ b.Property("LongFoldingPrice")
+ .HasColumnType("numeric");
+
+ b.Property("LongMechPrice")
+ .HasColumnType("numeric");
+
+ b.Property("LongMultiColorPrice")
+ .HasColumnType("numeric");
+
+ b.Property("LongPermanentPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ManBrushPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ManCutPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ScheduleOwnerId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ShampooPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ShortBalayagePrice")
+ .HasColumnType("numeric");
+
+ b.Property("ShortBrushingPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ShortColorPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ShortDefrisPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ShortFoldingPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ShortMechPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ShortMultiColorPrice")
+ .HasColumnType("numeric");
+
+ b.Property("ShortPermanentPrice")
+ .HasColumnType("numeric");
+
+ b.Property("WomenHalfCutPrice")
+ .HasColumnType("numeric");
+
+ b.Property("WomenLongCutPrice")
+ .HasColumnType("numeric");
+
+ b.Property("WomenShortCutPrice")
+ .HasColumnType("numeric");
+
+ b.HasKey("UserId");
+
+ b.HasIndex("ScheduleOwnerId");
+
+ b.ToTable("BrusherProfile");
+ });
+
+ modelBuilder.Entity("Yavsc.Models.Haircut.HairCutQuery", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Accepted")
+ .HasColumnType("boolean");
+
+ b.Property