Compare commits

...

8 commits

Author SHA1 Message Date
3824a928fe
Bad test, fix the test
Some checks failed
Dotnet build and test / build (push) Failing after 7m26s
2026-09-11 13:42:29 +01:00
77e521b96d
Test the release, don't ignore test return code
Some checks failed
Dotnet build and test / build (push) Failing after 3m7s
2026-09-11 13:25:32 +01:00
38bc659a58
CircleAuthorizationToFile EF migration
All checks were successful
Dotnet build and test / build (pull_request) Successful in 6m15s
2026-09-07 11:02:41 +01:00
10fdcb288c
unique email handling 2026-09-07 10:58:20 +01:00
229971783a
code reorg 2026-09-07 10:30:45 +01:00
d0c79e449d chore: ignore tmp dirs and remove accidental temp service file
All checks were successful
Dotnet build and test / build (push) Successful in 5m5s
2026-09-06 21:27:14 +01:00
ff9c6c7209 Merge pull request 'postit: persist settings save and apply ApiUrl changes without restart' (#51) from feat/estimate into main
Reviewed-on: #51
2026-09-06 21:05:57 +01:00
a9233f8842 Merge pull request 'feat/estimate' (#50) from feat/estimate into main
Reviewed-on: #50
2026-09-04 22:06:49 +01:00
60 changed files with 10674 additions and 21 deletions

View file

@ -48,4 +48,4 @@ jobs:
--verbosity normal \ --verbosity normal \
--filter="Category!=Platform-Android" \ --filter="Category!=Platform-Android" \
--logger "xunit;LogFileName=test-results.xml" \ --logger "xunit;LogFileName=test-results.xml" \
&& echo "✅ Success !" || echo "❌ Fail ($?)!" && echo "✅ Success !" || { echo "❌ Fail ($?)!"; exit 1; }

View file

@ -175,6 +175,12 @@ jobs:
run: | run: |
cd /src/_src cd /src/_src
dotnet restore dotnet restore
- name: Test
run: |
cd /src/_src && dotnet test \
--verbosity normal \
--filter="Category!=Platform-Android" \
--logger "xunit;LogFileName=test-results.xml"
- name: Build de PostIt.Android ARM64 - name: Build de PostIt.Android ARM64
run: | run: |
@ -200,6 +206,7 @@ jobs:
RELEASE_BODY: ${{ env.RELEASE_BODY }} RELEASE_BODY: ${{ env.RELEASE_BODY }}
IS_PRERELEASE: ${{ env.IS_PRERELEASE }} IS_PRERELEASE: ${{ env.IS_PRERELEASE }}
run: | run: |
set -e
if [[ -z "$TAG" ]]; then if [[ -z "$TAG" ]]; then
echo "::error::No tag resolved for the API call." echo "::error::No tag resolved for the API call."
exit 1 exit 1

1
.gitignore vendored
View file

@ -35,6 +35,7 @@ appsettings-*.*.json
generated/ generated/
*.tmp *.tmp
tmp/
DataDir/ DataDir/
*.tests.trx *.tests.trx

View file

@ -45,10 +45,8 @@ public class BillingQueriesPageViewModelTests
Assert.Equal(2, vm.Queries.Count); Assert.Equal(2, vm.Queries.Count);
Assert.All(vm.Queries, q => Assert.DoesNotContain("Rejected", q.StatusLabel, StringComparison.OrdinalIgnoreCase)); Assert.All(vm.Queries, q => Assert.DoesNotContain("Rejected", q.StatusLabel, StringComparison.OrdinalIgnoreCase));
Assert.Contains("lecture seule", vm.StatusMessage, StringComparison.OrdinalIgnoreCase); Assert.Contains("lecture seule", vm.StatusMessage, StringComparison.OrdinalIgnoreCase);
Assert.False(vm.CanOpenDetails);
vm.SelectedQuery = vm.Queries[0]; Assert.True(vm.Queries.Count > 0);
Assert.False(vm.OpenSelectedQueryCommand.CanExecute(null));
} }
private sealed class StubBillingApi : IYavscApiClient private sealed class StubBillingApi : IYavscApiClient

View file

@ -0,0 +1,12 @@
namespace Yavsc.Models.Access
{
using Yavsc.Abstract.Identity.Security;
public class FileAccessControlRulePayload : CircleAuthorization
{
public virtual string Path { get; set; }
}
}

View file

@ -370,8 +370,6 @@ public sealed class BlogsWebServerFixture : WebHostFixture
} }
} }
/// <summary>Create a circle owned by <paramref name="ownerId"/> /// <summary>Create a circle owned by <paramref name="ownerId"/>
/// directly in the SQLite store and return its server-assigned /// directly in the SQLite store and return its server-assigned
/// id.</summary> /// id.</summary>
@ -415,5 +413,4 @@ public sealed class BlogsWebServerFixture : WebHostFixture
db.SaveChanges(); db.SaveChanges();
return post.Id; return post.Id;
} }
} }

View file

@ -25,6 +25,7 @@ using IdentityModel;
using Yavsc.Server.Helpers; using Yavsc.Server.Helpers;
using Microsoft.AspNetCore.Mvc.Localization; using Microsoft.AspNetCore.Mvc.Localization;
using System.Diagnostics; using System.Diagnostics;
using System.Data.Common;
namespace Yavsc.Controllers namespace Yavsc.Controllers
{ {
@ -538,9 +539,9 @@ IHtmlLocalizerFactory htmlLocalizerFactory,
{ {
for (var current = exception; current is not null; current = current.InnerException) for (var current = exception; current is not null; current = current.InnerException)
{ {
if (current is PostgresException pg if (current is DbException pg
&& pg.SqlState == PostgresErrorCodes.UniqueViolation && pg.ErrorCode == 23505)
&& string.Equals(pg.ConstraintName, "AK_AspNetUsers_Email", StringComparison.Ordinal)) // UNIQUE VIOLATION https://www.postgresql.org/docs/8.4/errcodes-appendix.html
{ {
return true; return true;
} }

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,825 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Yavsc.Migrations
{
/// <inheritdoc />
public partial class AddCircleAuthorizationToFileAcl : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_BankIdentity_AspNetUsers_UserId",
table: "BankIdentity");
migrationBuilder.DropForeignKey(
name: "FK_DeviceDeclaration_AspNetUsers_DeviceOwnerId",
table: "DeviceDeclaration");
migrationBuilder.DropForeignKey(
name: "FK_Estimates_Performers_OwnerId",
table: "Estimates");
migrationBuilder.DropForeignKey(
name: "FK_HairMultiCutQueries_Locations_LocationId",
table: "HairMultiCutQueries");
migrationBuilder.DropForeignKey(
name: "FK_RdvQueries_Locations_LocationId",
table: "RdvQueries");
migrationBuilder.AlterColumn<string>(
name: "Content",
table: "TrustDeclarations",
type: "character varying(2000)",
maxLength: 2000,
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "character varying(2000)",
oldMaxLength: 2000,
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "RdvQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "RdvQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Reason",
table: "RdvQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<long>(
name: "LocationId",
table: "RdvQueries",
type: "bigint",
nullable: false,
defaultValue: 0L,
oldClrType: typeof(long),
oldType: "bigint",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "RdvQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "Project",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "Project",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "WebSite",
table: "Performers",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "ExerciseCountryCode",
table: "Performers",
type: "text",
nullable: false,
oldClrType: typeof(string),
oldType: "character varying(2)",
oldMaxLength: 2);
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "HairMultiCutQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "HairMultiCutQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<long>(
name: "LocationId",
table: "HairMultiCutQueries",
type: "bigint",
nullable: false,
defaultValue: 0L,
oldClrType: typeof(long),
oldType: "bigint",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "HairMultiCutQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "HairCutQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "HairCutQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "HairCutQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "AdditionalInfo",
table: "HairCutQueries",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Estimates",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "OwnerId",
table: "Estimates",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "Estimates",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "AttachedGraphicsString",
table: "Estimates",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "AttachedFilesString",
table: "Estimates",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Version",
table: "DeviceDeclaration",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Platform",
table: "DeviceDeclaration",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Model",
table: "DeviceDeclaration",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "DeviceOwnerId",
table: "DeviceDeclaration",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "Comment",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "Comment",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Article",
table: "Comment",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Bug",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "Bug",
type: "character varying(10240)",
maxLength: 10240,
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "character varying(10240)",
oldMaxLength: 10240,
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "WicketCode",
table: "BankIdentity",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "UserId",
table: "BankIdentity",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "IBAN",
table: "BankIdentity",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "BankCode",
table: "BankIdentity",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "BIC",
table: "BankIdentity",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "AccountNumber",
table: "BankIdentity",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
migrationBuilder.AddForeignKey(
name: "FK_BankIdentity_AspNetUsers_UserId",
table: "BankIdentity",
column: "UserId",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_DeviceDeclaration_AspNetUsers_DeviceOwnerId",
table: "DeviceDeclaration",
column: "DeviceOwnerId",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_Estimates_Performers_OwnerId",
table: "Estimates",
column: "OwnerId",
principalTable: "Performers",
principalColumn: "PerformerId",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_HairMultiCutQueries_Locations_LocationId",
table: "HairMultiCutQueries",
column: "LocationId",
principalTable: "Locations",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_RdvQueries_Locations_LocationId",
table: "RdvQueries",
column: "LocationId",
principalTable: "Locations",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_BankIdentity_AspNetUsers_UserId",
table: "BankIdentity");
migrationBuilder.DropForeignKey(
name: "FK_DeviceDeclaration_AspNetUsers_DeviceOwnerId",
table: "DeviceDeclaration");
migrationBuilder.DropForeignKey(
name: "FK_Estimates_Performers_OwnerId",
table: "Estimates");
migrationBuilder.DropForeignKey(
name: "FK_HairMultiCutQueries_Locations_LocationId",
table: "HairMultiCutQueries");
migrationBuilder.DropForeignKey(
name: "FK_RdvQueries_Locations_LocationId",
table: "RdvQueries");
migrationBuilder.AlterColumn<string>(
name: "Content",
table: "TrustDeclarations",
type: "character varying(2000)",
maxLength: 2000,
nullable: true,
oldClrType: typeof(string),
oldType: "character varying(2000)",
oldMaxLength: 2000);
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "RdvQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "RdvQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Reason",
table: "RdvQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<long>(
name: "LocationId",
table: "RdvQueries",
type: "bigint",
nullable: true,
oldClrType: typeof(long),
oldType: "bigint");
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "RdvQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "Project",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "Project",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "WebSite",
table: "Performers",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "ExerciseCountryCode",
table: "Performers",
type: "character varying(2)",
maxLength: 2,
nullable: false,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "HairMultiCutQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "HairMultiCutQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<long>(
name: "LocationId",
table: "HairMultiCutQueries",
type: "bigint",
nullable: true,
oldClrType: typeof(long),
oldType: "bigint");
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "HairMultiCutQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "HairCutQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "HairCutQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "HairCutQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "AdditionalInfo",
table: "HairCutQueries",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Estimates",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "OwnerId",
table: "Estimates",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "Estimates",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "AttachedGraphicsString",
table: "Estimates",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "AttachedFilesString",
table: "Estimates",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Version",
table: "DeviceDeclaration",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Platform",
table: "DeviceDeclaration",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Model",
table: "DeviceDeclaration",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "DeviceOwnerId",
table: "DeviceDeclaration",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserModified",
table: "Comment",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserCreated",
table: "Comment",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Article",
table: "Comment",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Bug",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "Bug",
type: "character varying(10240)",
maxLength: 10240,
nullable: true,
oldClrType: typeof(string),
oldType: "character varying(10240)",
oldMaxLength: 10240);
migrationBuilder.AlterColumn<string>(
name: "WicketCode",
table: "BankIdentity",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "UserId",
table: "BankIdentity",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "IBAN",
table: "BankIdentity",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "BankCode",
table: "BankIdentity",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "BIC",
table: "BankIdentity",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AlterColumn<string>(
name: "AccountNumber",
table: "BankIdentity",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.AddForeignKey(
name: "FK_BankIdentity_AspNetUsers_UserId",
table: "BankIdentity",
column: "UserId",
principalTable: "AspNetUsers",
principalColumn: "Id");
migrationBuilder.AddForeignKey(
name: "FK_DeviceDeclaration_AspNetUsers_DeviceOwnerId",
table: "DeviceDeclaration",
column: "DeviceOwnerId",
principalTable: "AspNetUsers",
principalColumn: "Id");
migrationBuilder.AddForeignKey(
name: "FK_Estimates_Performers_OwnerId",
table: "Estimates",
column: "OwnerId",
principalTable: "Performers",
principalColumn: "PerformerId");
migrationBuilder.AddForeignKey(
name: "FK_HairMultiCutQueries_Locations_LocationId",
table: "HairMultiCutQueries",
column: "LocationId",
principalTable: "Locations",
principalColumn: "Id");
migrationBuilder.AddForeignKey(
name: "FK_RdvQueries_Locations_LocationId",
table: "RdvQueries",
column: "LocationId",
principalTable: "Locations",
principalColumn: "Id");
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,52 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Yavsc.Migrations
{
/// <inheritdoc />
public partial class fileACL : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "CircleAuthorizationToFile",
columns: table => new
{
CircleId = table.Column<long>(type: "bigint", nullable: false),
Path = table.Column<string>(type: "text", nullable: false),
OwnerId = table.Column<string>(type: "text", nullable: false),
Access = table.Column<byte>(type: "smallint", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CircleAuthorizationToFile", x => new { x.CircleId, x.Path, x.OwnerId });
table.ForeignKey(
name: "FK_CircleAuthorizationToFile_AspNetUsers_OwnerId",
column: x => x.OwnerId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_CircleAuthorizationToFile_Circle_CircleId",
column: x => x.CircleId,
principalTable: "Circle",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_CircleAuthorizationToFile_OwnerId",
table: "CircleAuthorizationToFile",
column: "OwnerId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "CircleAuthorizationToFile");
}
}
}

View file

@ -1088,6 +1088,27 @@ namespace Yavsc.Migrations
b.ToTable("CircleAuthorizationToBlogPost"); b.ToTable("CircleAuthorizationToBlogPost");
}); });
modelBuilder.Entity("Yavsc.Models.Access.CircleAuthorizationToFile", b =>
{
b.Property<long>("CircleId")
.HasColumnType("bigint");
b.Property<string>("Path")
.HasColumnType("text");
b.Property<string>("OwnerId")
.HasColumnType("text");
b.Property<byte>("Access")
.HasColumnType("smallint");
b.HasKey("CircleId", "Path", "OwnerId");
b.HasIndex("OwnerId");
b.ToTable("CircleAuthorizationToFile");
});
modelBuilder.Entity("Yavsc.Models.AccountBalance", b => modelBuilder.Entity("Yavsc.Models.AccountBalance", b =>
{ {
b.Property<string>("UserId") b.Property<string>("UserId")
@ -1242,24 +1263,30 @@ namespace Yavsc.Migrations
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
b.Property<string>("AccountNumber") b.Property<string>("AccountNumber")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("BIC") b.Property<string>("BIC")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("BankCode") b.Property<string>("BankCode")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<int>("BankedKey") b.Property<int>("BankedKey")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<string>("IBAN") b.Property<string>("IBAN")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("UserId") b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("WicketCode") b.Property<string>("WicketCode")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.HasKey("Id"); b.HasKey("Id");
@ -1320,9 +1347,11 @@ namespace Yavsc.Migrations
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
b.Property<string>("AttachedFilesString") b.Property<string>("AttachedFilesString")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("AttachedGraphicsString") b.Property<string>("AttachedGraphicsString")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("ClientId") b.Property<string>("ClientId")
@ -1340,15 +1369,18 @@ namespace Yavsc.Migrations
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("Description") b.Property<string>("Description")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("OwnerId") b.Property<string>("OwnerId")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime>("ProviderValidationDate") b.Property<DateTime>("ProviderValidationDate")
.HasColumnType("timestamp with time zone"); .HasColumnType("timestamp with time zone");
b.Property<string>("Title") b.Property<string>("Title")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.HasKey("Id"); b.HasKey("Id");
@ -1521,6 +1553,7 @@ namespace Yavsc.Migrations
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
b.Property<string>("Article") b.Property<string>("Article")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("AuthorId") b.Property<string>("AuthorId")
@ -1540,9 +1573,11 @@ namespace Yavsc.Migrations
.HasColumnType("bigint"); .HasColumnType("bigint");
b.Property<string>("UserCreated") b.Property<string>("UserCreated")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("UserModified") b.Property<string>("UserModified")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<bool>("Visible") b.Property<bool>("Visible")
@ -1892,6 +1927,7 @@ namespace Yavsc.Migrations
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("AdditionalInfo") b.Property<string>("AdditionalInfo")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("ClientId") b.Property<string>("ClientId")
@ -1908,6 +1944,7 @@ namespace Yavsc.Migrations
.HasColumnType("timestamp with time zone"); .HasColumnType("timestamp with time zone");
b.Property<string>("Description") b.Property<string>("Description")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime?>("EventDate") b.Property<DateTime?>("EventDate")
@ -1936,9 +1973,11 @@ namespace Yavsc.Migrations
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<string>("UserCreated") b.Property<string>("UserCreated")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("UserModified") b.Property<string>("UserModified")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime?>("ValidationDate") b.Property<DateTime?>("ValidationDate")
@ -1989,12 +2028,13 @@ namespace Yavsc.Migrations
.HasColumnType("timestamp with time zone"); .HasColumnType("timestamp with time zone");
b.Property<string>("Description") b.Property<string>("Description")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime>("EventDate") b.Property<DateTime>("EventDate")
.HasColumnType("timestamp with time zone"); .HasColumnType("timestamp with time zone");
b.Property<long?>("LocationId") b.Property<long>("LocationId")
.HasColumnType("bigint"); .HasColumnType("bigint");
b.Property<string>("PaymentId") b.Property<string>("PaymentId")
@ -2011,9 +2051,11 @@ namespace Yavsc.Migrations
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<string>("UserCreated") b.Property<string>("UserCreated")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("UserModified") b.Property<string>("UserModified")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime?>("ValidationDate") b.Property<DateTime?>("ValidationDate")
@ -2158,6 +2200,7 @@ namespace Yavsc.Migrations
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
b.Property<string>("Description") b.Property<string>("Description")
.IsRequired()
.HasMaxLength(10240) .HasMaxLength(10240)
.HasColumnType("character varying(10240)"); .HasColumnType("character varying(10240)");
@ -2168,6 +2211,7 @@ namespace Yavsc.Migrations
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<string>("Title") b.Property<string>("Title")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.HasKey("Id"); b.HasKey("Id");
@ -2188,18 +2232,22 @@ namespace Yavsc.Migrations
.HasDefaultValueSql("LOCALTIMESTAMP"); .HasDefaultValueSql("LOCALTIMESTAMP");
b.Property<string>("DeviceOwnerId") b.Property<string>("DeviceOwnerId")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime?>("LatestActivityUpdate") b.Property<DateTime?>("LatestActivityUpdate")
.HasColumnType("timestamp with time zone"); .HasColumnType("timestamp with time zone");
b.Property<string>("Model") b.Property<string>("Model")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("Platform") b.Property<string>("Platform")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("Version") b.Property<string>("Version")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.HasKey("DeviceId"); b.HasKey("DeviceId");
@ -2312,6 +2360,7 @@ namespace Yavsc.Migrations
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
b.Property<string>("Content") b.Property<string>("Content")
.IsRequired()
.HasMaxLength(2000) .HasMaxLength(2000)
.HasColumnType("character varying(2000)"); .HasColumnType("character varying(2000)");
@ -3086,8 +3135,7 @@ namespace Yavsc.Migrations
b.Property<string>("ExerciseCountryCode") b.Property<string>("ExerciseCountryCode")
.IsRequired() .IsRequired()
.HasMaxLength(2) .HasColumnType("text");
.HasColumnType("character varying(2)");
b.Property<int?>("MaxDailyCost") b.Property<int?>("MaxDailyCost")
.HasColumnType("integer"); .HasColumnType("integer");
@ -3109,6 +3157,7 @@ namespace Yavsc.Migrations
.HasColumnType("boolean"); .HasColumnType("boolean");
b.Property<string>("WebSite") b.Property<string>("WebSite")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.HasKey("PerformerId"); b.HasKey("PerformerId");
@ -3157,12 +3206,13 @@ namespace Yavsc.Migrations
.HasColumnType("timestamp with time zone"); .HasColumnType("timestamp with time zone");
b.Property<string>("Description") b.Property<string>("Description")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime>("EventDate") b.Property<DateTime>("EventDate")
.HasColumnType("timestamp with time zone"); .HasColumnType("timestamp with time zone");
b.Property<long?>("LocationId") b.Property<long>("LocationId")
.HasColumnType("bigint"); .HasColumnType("bigint");
b.Property<int>("LocationType") b.Property<int>("LocationType")
@ -3179,15 +3229,18 @@ namespace Yavsc.Migrations
.HasColumnType("numeric"); .HasColumnType("numeric");
b.Property<string>("Reason") b.Property<string>("Reason")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<int>("Status") b.Property<int>("Status")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<string>("UserCreated") b.Property<string>("UserCreated")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("UserModified") b.Property<string>("UserModified")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime?>("ValidationDate") b.Property<DateTime?>("ValidationDate")
@ -3326,9 +3379,11 @@ namespace Yavsc.Migrations
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<string>("UserCreated") b.Property<string>("UserCreated")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("UserModified") b.Property<string>("UserModified")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime?>("ValidationDate") b.Property<DateTime?>("ValidationDate")
@ -3733,6 +3788,25 @@ namespace Yavsc.Migrations
b.Navigation("Target"); b.Navigation("Target");
}); });
modelBuilder.Entity("Yavsc.Models.Access.CircleAuthorizationToFile", b =>
{
b.HasOne("Yavsc.Models.Relationship.Circle", "Allowed")
.WithMany()
.HasForeignKey("CircleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Yavsc.Models.ApplicationUser", "Owner")
.WithMany()
.HasForeignKey("OwnerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Allowed");
b.Navigation("Owner");
});
modelBuilder.Entity("Yavsc.Models.AccountBalance", b => modelBuilder.Entity("Yavsc.Models.AccountBalance", b =>
{ {
b.HasOne("Yavsc.Models.ApplicationUser", "Owner") b.HasOne("Yavsc.Models.ApplicationUser", "Owner")
@ -3768,7 +3842,9 @@ namespace Yavsc.Migrations
{ {
b.HasOne("Yavsc.Models.ApplicationUser", "User") b.HasOne("Yavsc.Models.ApplicationUser", "User")
.WithMany("BankInfo") .WithMany("BankInfo")
.HasForeignKey("UserId"); .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User"); b.Navigation("User");
}); });
@ -3800,7 +3876,9 @@ namespace Yavsc.Migrations
b.HasOne("Yavsc.Models.Workflow.PerformerProfile", "Owner") b.HasOne("Yavsc.Models.Workflow.PerformerProfile", "Owner")
.WithMany() .WithMany()
.HasForeignKey("OwnerId"); .HasForeignKey("OwnerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Client"); b.Navigation("Client");
@ -4061,7 +4139,9 @@ namespace Yavsc.Migrations
b.HasOne("Yavsc.Models.Relationship.Location", "Location") b.HasOne("Yavsc.Models.Relationship.Location", "Location")
.WithMany() .WithMany()
.HasForeignKey("LocationId"); .HasForeignKey("LocationId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Yavsc.Models.Payment.PayPalPayment", "Regularization") b.HasOne("Yavsc.Models.Payment.PayPalPayment", "Regularization")
.WithMany() .WithMany()
@ -4146,7 +4226,9 @@ namespace Yavsc.Migrations
{ {
b.HasOne("Yavsc.Models.ApplicationUser", "DeviceOwner") b.HasOne("Yavsc.Models.ApplicationUser", "DeviceOwner")
.WithMany("DeviceDeclaration") .WithMany("DeviceDeclaration")
.HasForeignKey("DeviceOwnerId"); .HasForeignKey("DeviceOwnerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("DeviceOwner"); b.Navigation("DeviceOwner");
}); });
@ -4445,7 +4527,9 @@ namespace Yavsc.Migrations
b.HasOne("Yavsc.Models.Relationship.Location", "Location") b.HasOne("Yavsc.Models.Relationship.Location", "Location")
.WithMany() .WithMany()
.HasForeignKey("LocationId"); .HasForeignKey("LocationId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Yavsc.Models.Payment.PayPalPayment", "Regularization") b.HasOne("Yavsc.Models.Payment.PayPalPayment", "Regularization")
.WithMany() .WithMany()

View file

@ -0,0 +1,24 @@
namespace Yavsc.Models.Access
{
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
using Models.Relationship;
using Yavsc.Services;
public class CircleAuthorizationToFile : FileAccessControlRulePayload
{
public FileAccessRight Access { get; set; }
[JsonIgnore]
[ForeignKey("CircleId")]
public virtual Circle Allowed { get; set; }
public string OwnerId { get; set; }
[JsonIgnore]
[ForeignKey("OwnerId")]
public virtual ApplicationUser Owner { get; set; }
}
}

View file

@ -1,4 +1,4 @@
using IdentityServer8.EntityFramework.Entities; using IdentityServer8.EntityFramework.Entities;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.ChangeTracking;
@ -96,6 +96,22 @@ namespace Yavsc.Models
builder.Entity<UserActivity>().HasKey(u => new { u.DoesCode, u.UserId }); builder.Entity<UserActivity>().HasKey(u => new { u.DoesCode, u.UserId });
builder.Entity<Instrumentation>().HasKey(u => new { u.InstrumentId, u.UserId }); builder.Entity<Instrumentation>().HasKey(u => new { u.InstrumentId, u.UserId });
builder.Entity<CircleAuthorizationToBlogPost>().HasKey(a => new { a.CircleId, a.BlogPostId }); builder.Entity<CircleAuthorizationToBlogPost>().HasKey(a => new { a.CircleId, a.BlogPostId });
builder.Entity<CircleAuthorizationToFile>().HasKey(a => new { a.CircleId, a.Path, a.OwnerId });
builder.Entity<CircleAuthorizationToFile>()
.HasOne(a => a.Allowed)
.WithMany()
.HasForeignKey(a => a.CircleId)
.OnDelete(DeleteBehavior.Cascade)
;
builder.Entity<CircleAuthorizationToFile>()
.HasOne(a => a.Owner)
.WithMany()
.HasForeignKey(a => a.OwnerId)
.OnDelete(DeleteBehavior.Cascade)
;
builder.Entity<CircleAuthorizationToFile>()
.Property(a => a.Access)
.HasConversion<byte>();
builder.Entity<CircleMember>().HasKey(c => new { c.MemberId, c.CircleId }); builder.Entity<CircleMember>().HasKey(c => new { c.MemberId, c.CircleId });
builder.Entity<DismissClicked>().HasKey(c => new { uid = c.UserId, notid = c.NotificationId }); builder.Entity<DismissClicked>().HasKey(c => new { uid = c.UserId, notid = c.NotificationId });
builder.Entity<HairTaintInstance>().HasKey(ti => new { ti.TaintId, ti.PrestationId }); builder.Entity<HairTaintInstance>().HasKey(ti => new { ti.TaintId, ti.PrestationId });
@ -367,6 +383,8 @@ namespace Yavsc.Models
public DbSet<CircleAuthorizationToBlogPost> CircleAuthorizationToBlogPost { get; set; } public DbSet<CircleAuthorizationToBlogPost> CircleAuthorizationToBlogPost { get; set; }
public DbSet<CircleAuthorizationToFile> CircleAuthorizationToFile { get; set; }
public DbSet<CommandForm> CommandForm { get; set; } public DbSet<CommandForm> CommandForm { get; set; }
public DbSet<Ban> Ban { get; set; } public DbSet<Ban> Ban { get; set; }

View file

@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using rules; using rules;
using Yavsc.Models; using Yavsc.Models;
using Yavsc.Models.Access;
using Yavsc.Server.Helpers; using Yavsc.Server.Helpers;
namespace Yavsc.Services namespace Yavsc.Services
@ -98,7 +99,44 @@ namespace Yavsc.Services
public void SetAccess(long circleId, string normalizedFullPath, FileAccessRight access) public void SetAccess(long circleId, string normalizedFullPath, FileAccessRight access)
{ {
throw new NotImplementedException(); var providerUserName = normalizedFullPath.Split('/')[0];
var providerUserId = _dbContext.Users.SingleOrDefault(u => u.UserName == providerUserName)?.Id;
if (string.IsNullOrEmpty(providerUserId))
{
return;
}
var acl = _dbContext.CircleAuthorizationToFile.SingleOrDefault(a =>
a.CircleId == circleId && a.Path == normalizedFullPath && a.OwnerId == providerUserId);
if (access == FileAccessRight.None)
{
if (acl != null)
{
_dbContext.CircleAuthorizationToFile.Remove(acl);
}
_dbContext.SaveChanges();
return;
}
if (acl == null)
{
_dbContext.CircleAuthorizationToFile.Add(new CircleAuthorizationToFile
{
CircleId = circleId,
Path = normalizedFullPath,
OwnerId = providerUserId,
Access = access
});
}
else
{
acl.Access = access;
}
_dbContext.SaveChanges();
} }
} }
} }