summaryrefslogtreecommitdiff
path: root/Services
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-08-22 10:00:21 +1000
committerJake Mannens <jake@asger.xyz>2025-08-18 17:03:21 +1000
commitff715df3ccda51c1bb3d4b84f4391b4fdd1962dd (patch)
tree00cca236a9036896dc7a1d3688311c65f96159d8 /Services
parent4558ed9d6cbc59229cd56cc7a6c36b1df0b8199a (diff)
Finalised initial implementation of NSFW tag filtering
Diffstat (limited to 'Services')
-rw-r--r--Services/TagService.cs79
-rw-r--r--Services/UserStateService.cs21
2 files changed, 91 insertions, 9 deletions
diff --git a/Services/TagService.cs b/Services/TagService.cs
index 8de52ff..860103b 100644
--- a/Services/TagService.cs
+++ b/Services/TagService.cs
@@ -14,12 +14,18 @@ public interface ITagService {
public void RemoveTag(HBObject obj, TagDefinition tagDef);
public void SetImplicitTags(TagDefinition tagDef, TagDefinition[] implicitTagDefs);
public void SetImplicitTags(Guid tagDef, Guid[] implicitTagDefs);
+ public void AddImplicitTag(Guid tagDef, Guid implicitTagDef);
+ public void AddImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef);
+ public void RemoveImplicitTag(Guid tagDef, Guid implicitTagDef);
+ public void RemoveImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef);
public void CreateTagDefinition(string name, string? @namespace);
+ public void DeleteTagDefinition(Guid tagDef);
public void DeleteTagDefinition(TagDefinition tagDef);
public void UpdateTagDefinition(Guid tagDef, string name, string? @namespace);
public void UpdateTagDefinition(TagDefinition tagDef, string name, string? @namespace);
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(Guid obj);
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(HBObject obj);
+ public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(TagDefinition tagDef);
}
public class TagService : ITagService {
@@ -78,6 +84,31 @@ public class TagService : ITagService {
public void SetImplicitTags(TagDefinition tagDef, TagDefinition[] implicitTagDefs) =>
SetImplicitTags(tagDef.Guid, implicitTagDefs.Select(td => td.Guid).ToArray());
+ public void AddImplicitTag(Guid tagDef, Guid implicitTagDef) {
+ using var db = dbFactory.CreateDbContext();
+
+ var tag = db.TagDefinitions.First(td => td.Guid == tagDef);
+ var implicitTag = db.TagDefinitions.First(td => td.Guid == implicitTagDef);
+
+ tag.ImplicitTags.Add(implicitTag);
+ db.SaveChanges();
+ }
+
+ public void AddImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef) =>
+ AddImplicitTag(tagDef, implicitTagDef);
+
+ public void RemoveImplicitTag(Guid tagDef, Guid implicitTagDef) {
+ using var db = dbFactory.CreateDbContext();
+
+ var tag = db.TagDefinitions.First(td => td.Guid == tagDef);
+
+ tag.ImplicitTags.RemoveAll(td => td.Guid == implicitTagDef);
+ db.SaveChanges();
+ }
+
+ public void RemoveImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef) =>
+ RemoveImplicitTag(tagDef, implicitTagDef);
+
public void CreateTagDefinition(string name, string? @namespace) {
using var db = dbFactory.CreateDbContext();
@@ -91,20 +122,24 @@ public class TagService : ITagService {
db.SaveChanges();
}
- public void DeleteTagDefinition(TagDefinition tagDef) {
+ public void DeleteTagDefinition(Guid tagDef) {
using var db = dbFactory.CreateDbContext();
- db.Entry(tagDef).State = EntityState.Unchanged;
+
+ var tag = db.TagDefinitions.First(td => td.Guid == tagDef);
using var transaction = db.Database.BeginTransaction();
db.Tags.RemoveRange(
- db.Tags.Where(t => t.TagDefinition == tagDef));
- db.TagDefinitions.Remove(tagDef);
+ db.Tags.Where(t => t.TagDefinition.Guid == tagDef));
+ db.TagDefinitions.Remove(tag);
db.SaveChanges();
transaction.Commit();
}
+ public void DeleteTagDefinition(TagDefinition tagDef) =>
+ DeleteTagDefinition(tagDef.Guid);
+
public void UpdateTagDefinition(Guid tagDef, string name, string? @namespace) {
using var db = dbFactory.CreateDbContext();
@@ -122,11 +157,6 @@ public class TagService : ITagService {
UpdateTagDefinition(tagDef.Guid, name, @namespace);
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(Guid obj) {
- IEnumerable<TagDefinition> GetTagRecursive(IEnumerable<TagDefinition> tagDefs) =>
- tagDefs
- .Concat(tagDefs.SelectMany(td => GetTagRecursive(td.ImplicitTags)))
- .DistinctBy(td => td.Guid);
-
using var db = dbFactory.CreateDbContext();
var @object = db.Objects.First(o => o.Guid == obj);
@@ -139,4 +169,35 @@ public class TagService : ITagService {
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(HBObject obj) =>
GetAllTags(obj.Guid);
+
+ public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(TagDefinition tagDef) {
+ using var db = dbFactory.CreateDbContext();
+
+ var tag = db.TagDefinitions.First(td => td.Guid == tagDef.Guid);
+
+ return GetTagRecursive(tag.ImplicitTags)
+ .Select(td => new ValueTuple<TagDefinition, bool>(td, !tag.ImplicitTags.Select(it => it.Guid).Contains(td.Guid)))
+ .ToArray();
+ }
+
+ private List<TagDefinition> GetTagRecursive(IEnumerable<TagDefinition> tagDefs) {
+ var tags = new List<TagDefinition>(tagDefs);
+
+ List<TagDefinition>? toProcessNext = null;
+
+ while(true) {
+ toProcessNext = (toProcessNext ?? tags)
+ .SelectMany(td => td.ImplicitTags)
+ .Where(td => !tags.Select(td => td.Guid).Contains(td.Guid))
+ .DistinctBy(td => td.Guid)
+ .ToList();
+
+ tags.AddRange(toProcessNext);
+
+ if(toProcessNext.Count() == 0)
+ break;
+ }
+
+ return tags;
+ }
}
diff --git a/Services/UserStateService.cs b/Services/UserStateService.cs
new file mode 100644
index 0000000..dc742e1
--- /dev/null
+++ b/Services/UserStateService.cs
@@ -0,0 +1,21 @@
+namespace HyperBooru.Services;
+
+public interface IUserStateService {
+ public bool ShowNsfw { get; set; }
+
+ public event EventHandler<bool> ShowNsfwChanged;
+}
+
+public class UserStateService : IUserStateService {
+ public bool ShowNsfw {
+ get => showNsfw;
+ set {
+ showNsfw = value;
+ ShowNsfwChanged?.Invoke(this, value);
+ }
+ }
+
+ public event EventHandler<bool> ShowNsfwChanged;
+
+ private bool showNsfw = false;
+}