diff options
author | vnugent <public@vaughnnugent.com> | 2024-01-20 23:49:29 -0500 |
---|---|---|
committer | vnugent <public@vaughnnugent.com> | 2024-01-20 23:49:29 -0500 |
commit | 6cb7da37824d02a1898d08d0f9495c77fde4dd1d (patch) | |
tree | 95e37ea3c20f416d6a205ee4ab050c307b18eafe /back-end/src/Model/BookmarkEntry.cs |
inital commit
Diffstat (limited to 'back-end/src/Model/BookmarkEntry.cs')
-rw-r--r-- | back-end/src/Model/BookmarkEntry.cs | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/back-end/src/Model/BookmarkEntry.cs b/back-end/src/Model/BookmarkEntry.cs new file mode 100644 index 0000000..dca7f87 --- /dev/null +++ b/back-end/src/Model/BookmarkEntry.cs @@ -0,0 +1,93 @@ +// 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.RegularExpressions; +using System.Text.Json.Serialization; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +using FluentValidation; + +using Microsoft.EntityFrameworkCore; + +using VNLib.Plugins.Extensions.Data; +using VNLib.Plugins.Extensions.Data.Abstractions; + +namespace SimpleBookmark.Model +{ + [Index(nameof(Url))] + internal sealed partial class BookmarkEntry : DbModelBase, IUserEntity + { + [Key] + public override string Id { get; set; } + + public override DateTime Created { get; set; } + + public override DateTime LastModified { get; set; } + + [JsonIgnore] + public string? UserId { get; set; } + + [MaxLength(100)] + public string? Name { get; set; } + + [MaxLength(200)] + public string? Url { get; set; } + + [MaxLength(500)] + public string? Description { get; set; } + + //Json flavor + [NotMapped] + [JsonPropertyName("Tags")] + public string[]? JsonTags + { + get => Tags?.Split(','); + set => Tags = value is null ? null : string.Join(',', value); + } + + //Database flavor as string + [JsonIgnore] + [MaxLength(100)] + public string? Tags { get; set; } + + public static IValidator<BookmarkEntry> GetValidator() + { + InlineValidator<BookmarkEntry> validator = new(); + + validator.RuleFor(p => p.Name) + .NotEmpty() + .Matches(@"^[a-zA-Z0-9_\-\|\. ]+$", RegexOptions.Compiled) + .MaximumLength(100); + + validator.RuleFor(p => p.Url) + .NotEmpty() + .Matches(@"^https?://", RegexOptions.Compiled) + .MaximumLength(200); + + validator.RuleFor(p => p.Description) + .MaximumLength(500); + + //Tags must be non-empty and alphanumeric only, no spaces + validator.RuleForEach(p => p.JsonTags) + .NotNull() + .NotEmpty() + .Matches(@"^[a-zA-Z0-9]+$", RegexOptions.Compiled); + + return validator; + } + } +} |