summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Controllers/MediaController.cs17
-rw-r--r--Server.csproj12
-rw-r--r--Services/MediaService.cs43
3 files changed, 55 insertions, 17 deletions
diff --git a/Controllers/MediaController.cs b/Controllers/MediaController.cs
index cd6916f..7eb46c6 100644
--- a/Controllers/MediaController.cs
+++ b/Controllers/MediaController.cs
@@ -114,6 +114,13 @@ public class MediaController : Controller {
.ElementAtOrDefault(0);
Enum.TryParse(typeof(PathType), pathTypeString, true, out pathType);
+ // Parse tag IDs from headers
+ Guid[]? tagIds = formFile.Headers["X-HyperBooru-Tags"]
+ .ElementAtOrDefault(0)?
+ .Split(',')
+ .Select(t => Guid.Parse(t))
+ .ToArray();
+
media = mediaService.Create(
formFile.OpenReadStream(),
formFile.FileName,
@@ -123,7 +130,15 @@ public class MediaController : Controller {
lastWriteTime,
createTime,
path,
- (PathType?) pathType);
+ (PathType?) pathType,
+ tagIds);
+
+ // Return the GUID of the new media object if requested
+ bool returnMetadataParsed = bool.TryParse(
+ formFile.Headers["X-HyperBooru-ReturnMediaId"], out var returnMetadata);
+
+ if(returnMetadataParsed && returnMetadata)
+ return Content(media.Guid.ToString());
} catch(MediaCreateException e) {
return BadRequest(e.Message);
}
diff --git a/Server.csproj b/Server.csproj
index e435946..b743529 100644
--- a/Server.csproj
+++ b/Server.csproj
@@ -6,9 +6,9 @@
<ImplicitUsings>enable</ImplicitUsings>
<AssemblyName>HyperBooru</AssemblyName>
<RootNamespace>HyperBooru</RootNamespace>
- <AssemblyVersion>0.11.0.0</AssemblyVersion>
+ <AssemblyVersion>0.12.0.0</AssemblyVersion>
<FileVersion>$(AssemblyVersion)</FileVersion>
- <Version>0.11-alpha</Version>
+ <Version>0.12-alpha</Version>
<UserSecretsId>2907567f-4640-4581-8f4d-0977952d26bd</UserSecretsId>
</PropertyGroup>
@@ -32,16 +32,16 @@
</ItemGroup>
<ItemGroup>
- <PackageReference Include="Magick.NET-Q16-AnyCPU" Version="14.11.1" />
- <PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.5" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.5">
+ <PackageReference Include="Magick.NET-Q16-AnyCPU" Version="14.13.0" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.7" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.7">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Mime-Detective" Version="25.8.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" />
- <PackageReference Include="System.Drawing.Common" Version="10.0.5" />
+ <PackageReference Include="System.Drawing.Common" Version="10.0.7" />
<PackageReference Include="Tesseract" Version="5.2.0" />
</ItemGroup>
diff --git a/Services/MediaService.cs b/Services/MediaService.cs
index 27c77d6..763b953 100644
--- a/Services/MediaService.cs
+++ b/Services/MediaService.cs
@@ -24,7 +24,8 @@ public interface IMediaService {
DateTime? lastWriteTime = null,
DateTime? createTime = null,
string? path = null,
- PathType? pathType = null);
+ PathType? pathType = null,
+ Guid[]? tagIds = null);
public void Delete(Guid media);
public void Delete(Media media);
@@ -117,7 +118,8 @@ public class MediaService : IMediaService {
DateTime? lastWriteTime = null,
DateTime? createTime = null,
string? path = null,
- PathType? pathType = null) {
+ PathType? pathType = null,
+ Guid[]? tagIds = null) {
using var db = dbFactory.CreateDbContext();
using var transaction = db.Database.BeginTransaction();
@@ -145,10 +147,10 @@ public class MediaService : IMediaService {
fileData.Seek(0, SeekOrigin.Begin);
using var magickImage = new MagickImage(fileData);
- var media = db.UploadedFiles
- .Include(uf => uf.Media)
- .FirstOrDefault(uf => uf.Checksum == hash)?
- .Media;
+ var media = db.Media
+ .Include(m => m.UploadedFiles)
+ .Include(m => m.Tags)
+ .FirstOrDefault(m => m.UploadedFiles.Any(uf => uf.Checksum == hash));
var fileRecord = new UploadedFile() {
Filename = fileName,
@@ -166,6 +168,24 @@ public class MediaService : IMediaService {
PathType = pathType
};
+ var tags = Array.Empty<TagDefinition>();
+ if(tagIds is not null) {
+ tagIds = tagIds.Distinct().ToArray();
+
+ tags = db.TagDefinitions
+ .Where(td => tagIds.Contains(td.Guid))
+ .ToArray();
+
+ if(tags.Count() < tagIds.Count()) {
+ var badIds = tagIds
+ .Where(x => !tags.Select(td => td.Guid).Contains(x))
+ .Order();
+
+ throw new MediaCreateException(
+ $"Non-existent tags specified: {string.Join(", ", badIds)}");
+ }
+ }
+
if(media is null) {
var ingestTagDef = db.TagDefinitions
.First(td => td.Guid == HBContext.IngestTag);
@@ -174,9 +194,9 @@ public class MediaService : IMediaService {
UploadedFiles = new() {
fileRecord
},
- Tags = new() {
- new() { TagDefinition = ingestTagDef }
- }
+ Tags = tags is null ? [ new() { TagDefinition = ingestTagDef } ] : tags
+ .Select(td => new Tag() { TagDefinition = td })
+ .ToList()
};
using var newFile = File.Create(GetPath(media));
@@ -190,12 +210,15 @@ public class MediaService : IMediaService {
media.CurrentUploadedFile = fileRecord;
db.SaveChanges();
} else {
- db.Entry(media).Collection(m => m.UploadedFiles).Load();
var fileHashes = media.UploadedFiles
.Select(uf => GetUploadedFileHash(uf));
// Only add the uploaded file record if it contains new information
if(!fileHashes.Contains(GetUploadedFileHash(fileRecord)))
media.UploadedFiles.Add(fileRecord);
+ // Add new tags if needed
+ var missingTags = tags
+ .Where(td => !media.Tags.Select(t => t.TagDefinition.Guid).Contains(td.Guid));
+ media.Tags.AddRange(missingTags.Select(td => new Tag() { TagDefinition = td }));
db.Update(media);
db.SaveChanges();
}