From 5877c86b1da4eb4e9e74378709c546933dc63cf4 Mon Sep 17 00:00:00 2001 From: vnugent Date: Tue, 9 Apr 2024 17:37:41 -0400 Subject: Squashed commit of the following: commit 56e0a38b2ca246e8beeaef3c6c4b9c0ce7d0f09b Author: vnugent Date: Tue Apr 9 17:35:13 2024 -0400 chore(app): Update deps, login spinner, curl msg, view prep commit 0945210c0492dd8a8de99ccd8e5e66cf05e3a1c1 Merge: 24fac82 3c15d54 Author: vnugent Date: Tue Apr 2 14:58:59 2024 -0400 Merge branch 'master' into develop commit 24fac82efe9e5c18e86ed535678640e7401472db Author: vnugent Date: Tue Apr 2 14:54:20 2024 -0400 ci: Configure manual dep versions commit d2ae31ec919d72e66d8b40db8394b55efd6ea6d3 Author: vnugent Date: Sun Mar 31 22:19:53 2024 -0400 ci: Native compression support for win commit fa7fdef79c6d468022b77f81314ac129fe0cdc32 Merge: 308092d a01220a Author: vnugent Date: Wed Mar 13 21:26:55 2024 -0400 Merge branch 'master' into develop commit 308092d6d743d0ba8f7ca86fd77e9c837dc46e88 Merge: 48637a8 9134093 Author: vnugent Date: Wed Mar 13 21:01:02 2024 -0400 Merge branch 'master' into develop commit 48637a8781fc951c307216f604fc1610e68691c3 Merge: 1e08c6d e326736 Author: vnugent Date: Wed Mar 13 16:20:35 2024 -0400 Merge branch 'master' into develop commit 1e08c6d2112459dc02a0ab873123c4a363b01d21 Author: vnugent Date: Wed Mar 13 16:17:58 2024 -0400 ci: verified container build ready for next release commit 85a1e5b7cc5c99e97a2d4e99bbceb0d2139742ff Author: vnugent Date: Tue Mar 12 22:05:16 2024 -0400 ci: exciting bare-metal build process, os support, smaller packages commit 748cdbf4880d830fd794e92856e8c35a46e4f884 Author: vnugent Date: Mon Mar 11 21:21:18 2024 -0400 feat(app): #1 update libs & add curl support --- back-end/src/Model/BookmarkStore.cs | 38 +++++++++++++++ back-end/src/Model/SimpleBookmarkContext.cs | 54 ++++++--------------- back-end/src/Model/UserSettingsDbStore.cs | 75 ----------------------------- back-end/src/Model/UserSettingsEntry.cs | 39 --------------- 4 files changed, 53 insertions(+), 153 deletions(-) delete mode 100644 back-end/src/Model/UserSettingsDbStore.cs delete mode 100644 back-end/src/Model/UserSettingsEntry.cs (limited to 'back-end/src/Model') diff --git a/back-end/src/Model/BookmarkStore.cs b/back-end/src/Model/BookmarkStore.cs index ec020e8..d53ab01 100644 --- a/back-end/src/Model/BookmarkStore.cs +++ b/back-end/src/Model/BookmarkStore.cs @@ -52,6 +52,44 @@ namespace SimpleBookmark.Model existing.Description = newRecord.Description; existing.JsonTags = newRecord.JsonTags; } + + public async Task AddSingleIfNotExists(string userId, BookmarkEntry entry, DateTime now, uint maxRecords, CancellationToken cancellation) + { + ArgumentNullException.ThrowIfNull(userId); + ArgumentNullException.ThrowIfNull(entry); + + //Init new db connection + await using SimpleBookmarkContext context = new(dbOptions.Value); + + //Check if any bookmarks exist for the user with a given url + bool exists = await context.Bookmarks.AnyAsync(b => b.UserId == userId && b.Url == entry.Url, cancellation); + + //If no bookmarks exist, add a new one + if (!exists) + { + //Check if the user has reached the maximum number of bookmarks + if (await context.Bookmarks.CountAsync(b => b.UserId == userId, cancellation) >= maxRecords) + { + await context.SaveAndCloseAsync(true, cancellation); + return -1; + } + + context.Bookmarks.Add(new () + { + Id = GetNewRecordId(), //Overwrite with new record id + UserId = userId, //Enforce user id + Created = now, + LastModified = now, + Name = entry.Name, //Copy over the entry data + Url = entry.Url, + Description = entry.Description, + Tags = entry.Tags + }); + } + + await context.SaveAndCloseAsync(true, cancellation); + return exists ? 0 : 1; //1 if added, 0 if already exists + } public async Task SearchBookmarksAsync(string userId, string? query, string[] tags, int limit, int page, CancellationToken cancellation) { diff --git a/back-end/src/Model/SimpleBookmarkContext.cs b/back-end/src/Model/SimpleBookmarkContext.cs index 25343d9..f0e53b1 100644 --- a/back-end/src/Model/SimpleBookmarkContext.cs +++ b/back-end/src/Model/SimpleBookmarkContext.cs @@ -27,8 +27,6 @@ namespace SimpleBookmark.Model public DbSet Bookmarks { get; set; } - public DbSet SbSettings { get; set; } - public SimpleBookmarkContext(DbContextOptions options) : base(options) { } @@ -37,43 +35,21 @@ namespace SimpleBookmark.Model public void OnDatabaseCreating(IDbContextBuilder builder, object? userState) { - builder.DefineTable(nameof(Bookmarks)) - .WithColumn(p => p.Id) - .SetIsKey() - .Next() - - .WithColumn(p => p.Created) - .AllowNull(false) - .Next() - - .WithColumn(p => p.LastModified) - .AllowNull(false) - .Next() - - .WithColumn(p => p.UserId) - .AllowNull(false) - .Next() - - .WithColumn(p => p.Name) - .AllowNull(true) - .Next() - - .WithColumn(p => p.Version) - .TimeStamp() - .AllowNull(true) - .Next() - - .WithColumn(p => p.Url) - .AllowNull(true) - .Next() - - .WithColumn(p => p.Description) - .AllowNull(true) - .Next() - - .WithColumn(p => p.Tags) - .AllowNull(true) - .Next(); + /* + * Define the coloumn mappings for the BookmarkEntry table + */ + builder.DefineTable(nameof(Bookmarks), table => + { + table.WithColumn(p => p.Id).AllowNull(false); + table.WithColumn(p => p.Created); + table.WithColumn(p => p.LastModified); + table.WithColumn(p => p.UserId).AllowNull(false); + table.WithColumn(p => p.Name); + table.WithColumn(p => p.Version); + table.WithColumn(p => p.Url); + table.WithColumn(p => p.Description); + table.WithColumn(p => p.Tags); + }); } } diff --git a/back-end/src/Model/UserSettingsDbStore.cs b/back-end/src/Model/UserSettingsDbStore.cs deleted file mode 100644 index d392262..0000000 --- a/back-end/src/Model/UserSettingsDbStore.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; -using System.Threading; -using System.Threading.Tasks; - -using Microsoft.EntityFrameworkCore; - -using VNLib.Utils; -using VNLib.Plugins.Extensions.Loading; - -namespace SimpleBookmark.Model -{ - internal sealed class UserSettingsDbStore(IAsyncLazy dbOptions) - { - - public async Task GetSettingsForUserAsync(string userId, CancellationToken cancellation) - { - ArgumentNullException.ThrowIfNull(userId); - - //Init new db connection - await using SimpleBookmarkContext context = new(dbOptions.Value); - - UserSettingsEntry? settings = await context.SbSettings.FirstOrDefaultAsync(p => p.UserId == userId, cancellation); - - //Close db and commit transaction - await context.SaveAndCloseAsync(true, cancellation); - - return settings; - } - - public async Task SetSettingsForUser(string userId, UserSettingsEntry settings, CancellationToken cancellation) - { - ArgumentNullException.ThrowIfNull(userId); - ArgumentNullException.ThrowIfNull(settings); - - //Init new db connection - await using SimpleBookmarkContext context = new(dbOptions.Value); - - //Search for existing settings entry - UserSettingsEntry? existing = await context.SbSettings.FirstOrDefaultAsync(p => p.UserId == userId, cancellation); - - if (existing is null) - { - //Add a new entry - settings.UserId = userId; - settings.LastModified = DateTime.UtcNow; - context.Add(settings); - } - else - { - //Update existing entry - existing.SettingsData = settings.SettingsData; - existing.LastModified = DateTime.UtcNow; - context.Update(existing); - } - - //Close db and commit transaction - return await context.SaveAndCloseAsync(true, cancellation); - } - } -} diff --git a/back-end/src/Model/UserSettingsEntry.cs b/back-end/src/Model/UserSettingsEntry.cs deleted file mode 100644 index c27af8a..0000000 --- a/back-end/src/Model/UserSettingsEntry.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; -using System.Text.Json.Serialization; -using System.ComponentModel.DataAnnotations; - -using VNLib.Plugins.Extensions.Data.Abstractions; - -namespace SimpleBookmark.Model -{ - internal sealed class UserSettingsEntry : IUserEntity - { - public DateTime LastModified { get; set; } - - [Timestamp] - [JsonIgnore] - public byte[]? Version { get; set; } - - [Key] - [JsonIgnore] - public string? UserId { get; set; } - - [MaxLength(5000)] - public byte[]? SettingsData { get; set; } - } -} -- cgit