aboutsummaryrefslogtreecommitdiff
path: root/back-end/src/Model
diff options
context:
space:
mode:
authorLibravatar vnugent <public@vaughnnugent.com>2024-04-09 17:35:13 -0400
committerLibravatar vnugent <public@vaughnnugent.com>2024-04-09 17:35:13 -0400
commit56e0a38b2ca246e8beeaef3c6c4b9c0ce7d0f09b (patch)
tree5ba2556e42510cbbdf9c287f67041c1b1eb46206 /back-end/src/Model
parent0945210c0492dd8a8de99ccd8e5e66cf05e3a1c1 (diff)
chore(app): Update deps, login spinner, curl msg, view prep
Diffstat (limited to 'back-end/src/Model')
-rw-r--r--back-end/src/Model/BookmarkStore.cs38
-rw-r--r--back-end/src/Model/SimpleBookmarkContext.cs54
-rw-r--r--back-end/src/Model/UserSettingsDbStore.cs75
-rw-r--r--back-end/src/Model/UserSettingsEntry.cs39
4 files changed, 53 insertions, 153 deletions
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<int> 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<BookmarkEntry[]> 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<BookmarkEntry> Bookmarks { get; set; }
- public DbSet<UserSettingsEntry> 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<BookmarkEntry>(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<BookmarkEntry>(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 <https://www.gnu.org/licenses/>.
-
-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<DbContextOptions> dbOptions)
- {
-
- public async Task<UserSettingsEntry?> 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<ERRNO> 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 <https://www.gnu.org/licenses/>.
-
-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; }
- }
-}