Looks like we finally have a solution.

Change logging to just log a message, instead of the exception.
Moved logic to Syncer involvement.  When posting the data, if a 500 is
returned, then it is up to the Syncer to re-submit it.
This commit is contained in:
Mario Steele 2025-08-09 04:09:17 -05:00
parent 73955353cb
commit 004c490dd8
23 changed files with 529 additions and 177 deletions

View file

@ -0,0 +1,257 @@
// <auto-generated />
using System;
using FreeTubeSync.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace FreeTubeSync.Migrations
{
[DbContext(typeof(DataContext))]
[Migration("20250808221748_UpdateNewLayout")]
partial class UpdateNewLayout
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "9.0.7");
modelBuilder.Entity("FreeTubeSync.Model.ChangeLog", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime>("ChangeTime")
.HasColumnType("TEXT");
b.Property<string>("ChangeType")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("TableName")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("ChangeLogs");
});
modelBuilder.Entity("FreeTubeSync.Model.History", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
b.Property<string>("author")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("authorId")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("description")
.IsRequired()
.HasColumnType("TEXT");
b.Property<bool>("isLive")
.HasColumnType("INTEGER");
b.Property<string>("lastViewedPlaylistItemId")
.HasColumnType("TEXT");
b.Property<string>("lastViewedPlaylistType")
.IsRequired()
.HasColumnType("TEXT");
b.Property<long>("lengthSeconds")
.HasColumnType("INTEGER");
b.Property<long>("published")
.HasColumnType("INTEGER");
b.Property<long>("timeWatched")
.HasColumnType("INTEGER");
b.Property<string>("title")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("type")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("videoId")
.IsRequired()
.HasColumnType("TEXT");
b.Property<long>("viewCount")
.HasColumnType("INTEGER");
b.Property<float>("watchProgress")
.HasColumnType("REAL");
b.HasKey("_id");
b.ToTable("Histories");
});
modelBuilder.Entity("FreeTubeSync.Model.Playlist", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
b.Property<long>("createdAt")
.HasColumnType("INTEGER");
b.Property<long>("lastUpdatedAt")
.HasColumnType("INTEGER");
b.Property<string>("playlistName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<bool>("protected")
.HasColumnType("INTEGER");
b.HasKey("_id");
b.ToTable("Playlists");
});
modelBuilder.Entity("FreeTubeSync.Model.Profile", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
b.Property<string>("bgColor")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("name")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("textColor")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("_id");
b.ToTable("Profiles");
});
modelBuilder.Entity("FreeTubeSync.Model.SearchHistory", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
b.Property<long>("lastUpdatedAt")
.HasColumnType("INTEGER");
b.HasKey("_id");
b.ToTable("SearchHistories");
});
modelBuilder.Entity("FreeTubeSync.Model.Setting", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
b.Property<string>("value")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("_id");
b.ToTable("Settings");
});
modelBuilder.Entity("FreeTubeSync.Model.Playlist", b =>
{
b.OwnsMany("FreeTubeSync.Model.Video", "videos", b1 =>
{
b1.Property<string>("Playlist_id")
.HasColumnType("TEXT");
b1.Property<string>("videoId")
.HasColumnType("TEXT");
b1.Property<string>("author")
.IsRequired()
.HasColumnType("TEXT");
b1.Property<string>("authorId")
.IsRequired()
.HasColumnType("TEXT");
b1.Property<string>("lengthSeconds")
.IsRequired()
.HasColumnType("TEXT");
b1.Property<string>("playlistItemId")
.IsRequired()
.HasColumnType("TEXT");
b1.Property<long>("published")
.HasColumnType("INTEGER");
b1.Property<long>("timeAdded")
.HasColumnType("INTEGER");
b1.Property<string>("title")
.IsRequired()
.HasColumnType("TEXT");
b1.Property<string>("type")
.IsRequired()
.HasColumnType("TEXT");
b1.HasKey("Playlist_id", "videoId");
b1.ToTable("Video");
b1.WithOwner()
.HasForeignKey("Playlist_id");
});
b.Navigation("videos");
});
modelBuilder.Entity("FreeTubeSync.Model.Profile", b =>
{
b.OwnsMany("FreeTubeSync.Model.Subscription", "subscriptions", b1 =>
{
b1.Property<string>("Profile_id")
.HasColumnType("TEXT");
b1.Property<string>("id")
.HasColumnType("TEXT");
b1.Property<string>("name")
.IsRequired()
.HasColumnType("TEXT");
b1.Property<string>("thumbnail")
.HasColumnType("TEXT");
b1.HasKey("Profile_id", "id");
b1.ToTable("Subscription");
b1.WithOwner()
.HasForeignKey("Profile_id");
});
b.Navigation("subscriptions");
});
#pragma warning restore 612, 618
}
}
}

View file

@ -0,0 +1,130 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace FreeTubeSync.Migrations
{
/// <inheritdoc />
public partial class UpdateNewLayout : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Subscriptions");
migrationBuilder.DropTable(
name: "Videos");
migrationBuilder.CreateTable(
name: "Subscription",
columns: table => new
{
id = table.Column<string>(type: "TEXT", nullable: false),
Profile_id = table.Column<string>(type: "TEXT", nullable: false),
name = table.Column<string>(type: "TEXT", nullable: false),
thumbnail = table.Column<string>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Subscription", x => new { x.Profile_id, x.id });
table.ForeignKey(
name: "FK_Subscription_Profiles_Profile_id",
column: x => x.Profile_id,
principalTable: "Profiles",
principalColumn: "_id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "Video",
columns: table => new
{
videoId = table.Column<string>(type: "TEXT", nullable: false),
Playlist_id = table.Column<string>(type: "TEXT", nullable: false),
title = table.Column<string>(type: "TEXT", nullable: false),
author = table.Column<string>(type: "TEXT", nullable: false),
authorId = table.Column<string>(type: "TEXT", nullable: false),
lengthSeconds = table.Column<string>(type: "TEXT", nullable: false),
published = table.Column<long>(type: "INTEGER", nullable: false),
timeAdded = table.Column<long>(type: "INTEGER", nullable: false),
playlistItemId = table.Column<string>(type: "TEXT", nullable: false),
type = table.Column<string>(type: "TEXT", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Video", x => new { x.Playlist_id, x.videoId });
table.ForeignKey(
name: "FK_Video_Playlists_Playlist_id",
column: x => x.Playlist_id,
principalTable: "Playlists",
principalColumn: "_id",
onDelete: ReferentialAction.Cascade);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Subscription");
migrationBuilder.DropTable(
name: "Video");
migrationBuilder.CreateTable(
name: "Subscriptions",
columns: table => new
{
id = table.Column<string>(type: "TEXT", nullable: false),
Profile_id = table.Column<string>(type: "TEXT", nullable: true),
name = table.Column<string>(type: "TEXT", nullable: false),
thumbnail = table.Column<string>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Subscriptions", x => x.id);
table.ForeignKey(
name: "FK_Subscriptions_Profiles_Profile_id",
column: x => x.Profile_id,
principalTable: "Profiles",
principalColumn: "_id");
});
migrationBuilder.CreateTable(
name: "Videos",
columns: table => new
{
playlistItemId = table.Column<string>(type: "TEXT", nullable: false),
Playlist_id = table.Column<string>(type: "TEXT", nullable: true),
author = table.Column<string>(type: "TEXT", nullable: false),
authorId = table.Column<string>(type: "TEXT", nullable: false),
lengthSeconds = table.Column<string>(type: "TEXT", nullable: false),
pubished = table.Column<long>(type: "INTEGER", nullable: false),
timeAdded = table.Column<long>(type: "INTEGER", nullable: false),
title = table.Column<string>(type: "TEXT", nullable: false),
type = table.Column<string>(type: "TEXT", nullable: false),
videoId = table.Column<string>(type: "TEXT", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Videos", x => x.playlistItemId);
table.ForeignKey(
name: "FK_Videos_Playlists_Playlist_id",
column: x => x.Playlist_id,
principalTable: "Playlists",
principalColumn: "_id");
});
migrationBuilder.CreateIndex(
name: "IX_Subscriptions_Profile_id",
table: "Subscriptions",
column: "Profile_id");
migrationBuilder.CreateIndex(
name: "IX_Videos_Playlist_id",
table: "Videos",
column: "Playlist_id");
}
}
}

View file

@ -17,7 +17,7 @@ namespace FreeTubeSync.Migrations
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "9.0.7");
modelBuilder.Entity("FreeTubeSync.Model.Database.ChangeLog", b =>
modelBuilder.Entity("FreeTubeSync.Model.ChangeLog", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
@ -39,7 +39,7 @@ namespace FreeTubeSync.Migrations
b.ToTable("ChangeLogs");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.History", b =>
modelBuilder.Entity("FreeTubeSync.Model.History", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
@ -98,7 +98,7 @@ namespace FreeTubeSync.Migrations
b.ToTable("Histories");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.Playlist", b =>
modelBuilder.Entity("FreeTubeSync.Model.Playlist", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
@ -121,7 +121,7 @@ namespace FreeTubeSync.Migrations
b.ToTable("Playlists");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.Profile", b =>
modelBuilder.Entity("FreeTubeSync.Model.Profile", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
@ -143,7 +143,7 @@ namespace FreeTubeSync.Migrations
b.ToTable("Profiles");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.SearchHistory", b =>
modelBuilder.Entity("FreeTubeSync.Model.SearchHistory", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
@ -156,7 +156,7 @@ namespace FreeTubeSync.Migrations
b.ToTable("SearchHistories");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.Setting", b =>
modelBuilder.Entity("FreeTubeSync.Model.Setting", b =>
{
b.Property<string>("_id")
.HasColumnType("TEXT");
@ -170,94 +170,82 @@ namespace FreeTubeSync.Migrations
b.ToTable("Settings");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.Subscription", b =>
modelBuilder.Entity("FreeTubeSync.Model.Playlist", b =>
{
b.Property<string>("id")
.HasColumnType("TEXT");
b.OwnsMany("FreeTubeSync.Model.Video", "videos", b1 =>
{
b1.Property<string>("Playlist_id")
.HasColumnType("TEXT");
b.Property<string>("Profile_id")
.HasColumnType("TEXT");
b1.Property<string>("videoId")
.HasColumnType("TEXT");
b.Property<string>("name")
.IsRequired()
.HasColumnType("TEXT");
b1.Property<string>("author")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("thumbnail")
.HasColumnType("TEXT");
b1.Property<string>("authorId")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("id");
b1.Property<string>("lengthSeconds")
.IsRequired()
.HasColumnType("TEXT");
b.HasIndex("Profile_id");
b1.Property<string>("playlistItemId")
.IsRequired()
.HasColumnType("TEXT");
b.ToTable("Subscriptions");
});
b1.Property<long>("published")
.HasColumnType("INTEGER");
modelBuilder.Entity("FreeTubeSync.Model.Database.Video", b =>
{
b.Property<string>("playlistItemId")
.HasColumnType("TEXT");
b1.Property<long>("timeAdded")
.HasColumnType("INTEGER");
b.Property<string>("Playlist_id")
.HasColumnType("TEXT");
b1.Property<string>("title")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("author")
.IsRequired()
.HasColumnType("TEXT");
b1.Property<string>("type")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("authorId")
.IsRequired()
.HasColumnType("TEXT");
b1.HasKey("Playlist_id", "videoId");
b.Property<string>("lengthSeconds")
.IsRequired()
.HasColumnType("TEXT");
b1.ToTable("Video");
b.Property<long>("pubished")
.HasColumnType("INTEGER");
b1.WithOwner()
.HasForeignKey("Playlist_id");
});
b.Property<long>("timeAdded")
.HasColumnType("INTEGER");
b.Property<string>("title")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("type")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("videoId")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("playlistItemId");
b.HasIndex("Playlist_id");
b.ToTable("Videos");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.Subscription", b =>
{
b.HasOne("FreeTubeSync.Model.Database.Profile", null)
.WithMany("subscriptions")
.HasForeignKey("Profile_id");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.Video", b =>
{
b.HasOne("FreeTubeSync.Model.Database.Playlist", null)
.WithMany("videos")
.HasForeignKey("Playlist_id");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.Playlist", b =>
{
b.Navigation("videos");
});
modelBuilder.Entity("FreeTubeSync.Model.Database.Profile", b =>
modelBuilder.Entity("FreeTubeSync.Model.Profile", b =>
{
b.OwnsMany("FreeTubeSync.Model.Subscription", "subscriptions", b1 =>
{
b1.Property<string>("Profile_id")
.HasColumnType("TEXT");
b1.Property<string>("id")
.HasColumnType("TEXT");
b1.Property<string>("name")
.IsRequired()
.HasColumnType("TEXT");
b1.Property<string>("thumbnail")
.HasColumnType("TEXT");
b1.HasKey("Profile_id", "id");
b1.ToTable("Subscription");
b1.WithOwner()
.HasForeignKey("Profile_id");
});
b.Navigation("subscriptions");
});
#pragma warning restore 612, 618