summaryrefslogtreecommitdiff
path: root/Services
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-08-15 15:49:14 +1000
committerJake Mannens <jake@asger.xyz>2025-08-18 10:59:32 +1000
commit38c60cee378b9c2ad42fc9dc79bc492b919a68f5 (patch)
tree6b62f84aab4b7866432e5da8ae8fcb889795d58b /Services
parent07a4c7ead01514bd3f304f00abc38140a1d73634 (diff)
Convert Razor pages to Blazor
Diffstat (limited to 'Services')
-rw-r--r--Services/ConfigService.cs81
-rw-r--r--Services/MediaService.cs28
-rw-r--r--Services/TagService.cs97
3 files changed, 206 insertions, 0 deletions
diff --git a/Services/ConfigService.cs b/Services/ConfigService.cs
new file mode 100644
index 0000000..6ba3936
--- /dev/null
+++ b/Services/ConfigService.cs
@@ -0,0 +1,81 @@
+namespace HyperBooru.Services;
+
+public interface IConfigService {
+ public string DataPath { get; }
+ public string DbPath { get; }
+ public string MediaBasePath { get; }
+
+ public string GetPath(Media media);
+ public string GetPath(Media media, int width, int height);
+}
+
+public class ConfigService : IConfigService {
+ private IConfiguration config;
+
+ private const string AppName = "HyperBooru";
+
+ public string DataPath {
+ get {
+ #if DEBUG
+ return "Data";
+ #else
+ string? path = config["DataPath"];
+ if(path is not null)
+ return path;
+
+ switch(Environment.OSVersion.Platform) {
+ case PlatformID.Win32NT:
+ return Path.Join(
+ Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
+ AppName);
+ case PlatformID.Unix:
+ return $"/var/lib/{AppName.ToLower()}";
+ default:
+ throw new NotImplementedException(
+ $"Unknown Operating System: {Environment.OSVersion.Platform}");
+ }
+ #endif
+ }
+ }
+
+ public string DbPath =>
+ Path.Join(DataPath, $"{AppName}.db");
+
+ public string MediaBasePath =>
+ Path.Join(DataPath, "media");
+
+ public string ThumbnailBasePath =>
+ Path.Join(DataPath, "thumb");
+
+ public ConfigService(IConfiguration config) {
+ this.config = config;
+ InitDirectoryStructure();
+ }
+
+ public string GetPath(Media media) {
+ var fileInfo = new FileInfo(Path.Join(
+ MediaBasePath,
+ media.Guid.ToString().Substring(0, 2),
+ media.Guid.ToString().Substring(2, 2),
+ media.Guid.ToString()));
+
+ Directory.CreateDirectory(fileInfo.Directory.FullName);
+ return fileInfo.FullName;
+ }
+
+ public string GetPath(Media media, int width, int height) {
+ var fileInfo = new FileInfo(Path.Join(
+ ThumbnailBasePath,
+ media.Guid.ToString().Substring(0, 2),
+ media.Guid.ToString().Substring(2, 2),
+ $"{media.Guid.ToString()}-{width}-{height}"));
+
+ Directory.CreateDirectory(fileInfo.Directory.FullName);
+ return fileInfo.FullName;
+ }
+
+ private void InitDirectoryStructure() {
+ Directory.CreateDirectory(DataPath);
+ Directory.CreateDirectory(MediaBasePath);
+ }
+} \ No newline at end of file
diff --git a/Services/MediaService.cs b/Services/MediaService.cs
new file mode 100644
index 0000000..be2657a
--- /dev/null
+++ b/Services/MediaService.cs
@@ -0,0 +1,28 @@
+using Microsoft.EntityFrameworkCore;
+
+namespace HyperBooru.Services;
+
+public interface IMediaService {
+ public void SetIngest(Media media, bool ingest);
+}
+
+public class MediaService : IMediaService {
+ private IDbContextFactory<HBContext> dbFactory;
+
+ public MediaService(IDbContextFactory<HBContext> dbFactory) =>
+ this.dbFactory = dbFactory;
+
+ public void SetIngest(Media media, bool ingest) {
+ using var db = dbFactory.CreateDbContext();
+ var ingestTag = db.TagDefinitions
+ .First(td => td.Source == TagSource.Internal && td.Name == "ingest");
+
+ if(ingest)
+ media.Tags.Add(new() { TagDefinition = ingestTag });
+ else
+ media.Tags.Remove(
+ media.Tags.First(t => t.TagDefinition.Guid == ingestTag.Guid));
+
+ db.SaveChanges();
+ }
+}
diff --git a/Services/TagService.cs b/Services/TagService.cs
new file mode 100644
index 0000000..e0dcf64
--- /dev/null
+++ b/Services/TagService.cs
@@ -0,0 +1,97 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+
+namespace HyperBooru.Services;
+
+public interface ITagService {
+ public void AddTag(HBObject obj, TagDefinition tagDef);
+ public void RemoveTag(HBObject obj, TagDefinition tagDef);
+ public void AddImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef);
+ public void RemoveImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef);
+ public void CreateTagDefinition(string name, string? @namespace);
+ public void DeleteTagDefinition(TagDefinition tagDef);
+}
+
+public class TagService : ITagService {
+ private IDbContextFactory<HBContext> dbFactory;
+
+ public TagService(IDbContextFactory<HBContext> dbFactory) =>
+ this.dbFactory = dbFactory;
+
+ public void AddTag(HBObject obj, TagDefinition tagDef) {
+ using var db = dbFactory.CreateDbContext();
+ db.Entry(obj).State = EntityState.Unchanged;
+
+ bool alreadyTagged = obj.Tags
+ .Select(t => t.TagDefinition.Guid)
+ .Contains(tagDef.Guid);
+
+ obj.Tags.Add(new() {
+ TagDefinition = tagDef,
+ Target = obj
+ });
+
+ db.SaveChanges();
+ }
+
+ public void RemoveTag(Guid obj, Guid tagDef) {
+ using var db = dbFactory.CreateDbContext();
+
+ db.Objects.First(o => o.Guid == obj).Tags
+ .RemoveAll(t => t.TagDefinition.Guid == tagDef);
+
+ db.SaveChanges();
+ }
+
+ public void RemoveTag(HBObject obj, TagDefinition tagDef) =>
+ RemoveTag(obj.Guid, tagDef.Guid);
+
+ public void AddImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef) {
+ using var db = dbFactory.CreateDbContext();
+ db.Entry(tagDef).State = EntityState.Unchanged;
+
+ if(tagDef.ImplicitTags.Select(td => td.Guid).Contains(implicitTagDef.Guid))
+ throw new ArgumentException("Tag definition already contains implicit tag");
+
+ tagDef.ImplicitTags.Add(implicitTagDef);
+ db.SaveChanges();
+ }
+
+ public void RemoveImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef) {
+ using var db = dbFactory.CreateDbContext();
+ db.Entry(tagDef).State = EntityState.Unchanged;
+
+ if(!tagDef.ImplicitTags.Select(td => td.Guid).Contains(implicitTagDef.Guid))
+ throw new ArgumentException("Tag definition doesn't contain implicit tag");
+
+ tagDef.ImplicitTags.Remove(implicitTagDef);
+ db.SaveChanges();
+ }
+
+ public void CreateTagDefinition(string name, string? @namespace) {
+ using var db = dbFactory.CreateDbContext();
+
+ TagDefinition tagdef = new() {
+ Source = TagSource.UserTag,
+ Namespace = @namespace,
+ Name = name
+ };
+ if(!db.TagDefinitions.Contains(tagdef))
+ db.TagDefinitions.Add(tagdef);
+ db.SaveChanges();
+ }
+
+ public void DeleteTagDefinition(TagDefinition tagDef) {
+ using var db = dbFactory.CreateDbContext();
+ db.Entry(tagDef).State = EntityState.Unchanged;
+
+ using var transaction = db.Database.BeginTransaction();
+
+ db.Tags.RemoveRange(
+ db.Tags.Where(t => t.TagDefinition == tagDef));
+ db.TagDefinitions.Remove(tagDef);
+ db.SaveChanges();
+
+ transaction.Commit();
+ }
+} \ No newline at end of file