diff options
| author | Jake Mannens <jake@asger.xyz> | 2023-08-15 15:49:14 +1000 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2023-08-15 15:49:14 +1000 |
| commit | 8e94a12be4a56447e78d68c37def772bef8cade4 (patch) | |
| tree | 0a12c64f8e34da45df8ac8e4c484c83385aedb45 /Services | |
| parent | 5b00f23b28e3a09a4120101a8be8802d009e5d84 (diff) | |
Convert Razor pages to Blazor
Diffstat (limited to 'Services')
| -rw-r--r-- | Services/ConfigService.cs | 81 | ||||
| -rw-r--r-- | Services/MediaService.cs | 28 | ||||
| -rw-r--r-- | Services/TagService.cs | 97 |
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 |
