diff --git a/.idea/.idea.Abyss/.idea/workspace.xml b/.idea/.idea.Abyss/.idea/workspace.xml
index dc60824..85382ea 100644
--- a/.idea/.idea.Abyss/.idea/workspace.xml
+++ b/.idea/.idea.Abyss/.idea/workspace.xml
@@ -11,7 +11,10 @@
-
+
+
+
+
@@ -85,7 +88,7 @@
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
"RunOnceActivity.git.unshallow": "true",
"XThreadsFramesViewSplitterKey": "0.30266345",
- "git-widget-placeholder": "dev-abyss",
+ "git-widget-placeholder": "main",
"last_opened_file_path": "/storage/Images/31/summary.json",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
@@ -201,6 +204,9 @@
+
+
+
diff --git a/Abyss/Components/Controllers/Media/ImageController.cs b/Abyss/Components/Controllers/Media/ImageController.cs
index 650f6a4..633a03b 100644
--- a/Abyss/Components/Controllers/Media/ImageController.cs
+++ b/Abyss/Components/Controllers/Media/ImageController.cs
@@ -9,6 +9,8 @@ using Newtonsoft.Json.Linq;
namespace Abyss.Components.Controllers.Media;
using System.IO;
+using Task = System.Threading.Tasks.Task;
+
[ApiController]
[Route("api/[controller]")]
public class ImageController(ILogger logger, ResourceService rs, ConfigureService config) : BaseController
@@ -46,6 +48,27 @@ public class ImageController(ILogger logger, ResourceService rs
return Ok(await System.IO.File.ReadAllTextAsync(d));
}
+ [HttpPost("bulkquery")]
+ public async Task QueryBulk([FromQuery] string token, [FromBody] string[] id)
+ {
+ List result = new List();
+
+ var db = id.Select(x => Helpers.SafePathCombine(ImageFolder, [x, "summary.json"])).ToArray();
+ if(db.Any(x => x == null))
+ return StatusCode(403, new { message = "403 Denied" });
+
+ var rb = db.Select(x => rs.Get(x!, token, Ip)).ToArray();
+ bool[] results = await Task.WhenAll(rb);
+
+ if(results.Any(x => !x))
+ return StatusCode(403, new { message = "403 Denied" });
+
+ var rc = db.Select(x => System.IO.File.ReadAllTextAsync(x!)).ToArray();
+ string[] rcs = await Task.WhenAll(rc);
+
+ return Ok(rcs);
+ }
+
[HttpPost("{id}/bookmark")]
public async Task Bookmark(string id, string token, [FromBody] Bookmark bookmark)
{
diff --git a/Abyss/Components/Controllers/Media/VideoController.cs b/Abyss/Components/Controllers/Media/VideoController.cs
index b5b4a5a..c9e4b9c 100644
--- a/Abyss/Components/Controllers/Media/VideoController.cs
+++ b/Abyss/Components/Controllers/Media/VideoController.cs
@@ -8,6 +8,8 @@ using Newtonsoft.Json;
namespace Abyss.Components.Controllers.Media;
+using Task = System.Threading.Tasks.Task;
+
[ApiController]
[Route("api/[controller]")]
public class VideoController(ILogger logger, ResourceService rs, ConfigureService config) : BaseController
@@ -73,6 +75,27 @@ public class VideoController(ILogger logger, ResourceService rs
return Ok(await System.IO.File.ReadAllTextAsync(d));
}
+ [HttpPost("{klass}/bulkquery")]
+ public async Task QueryBulk([FromQuery] string token, [FromBody] string[] id, [FromRoute] string klass)
+ {
+ List result = new List();
+
+ var db = id.Select(x => Helpers.SafePathCombine(VideoFolder, [klass, x, "summary.json"])).ToArray();
+ if(db.Any(x => x == null))
+ return BadRequest();
+
+ var rb = db.Select(x => rs.Get(x!, token, Ip)).ToArray();
+ bool[] results = await Task.WhenAll(rb);
+
+ if(results.Any(x => !x))
+ return StatusCode(403, new { message = "403 Denied" });
+
+ var rc = db.Select(x => System.IO.File.ReadAllTextAsync(x!)).ToArray();
+ string[] rcs = await Task.WhenAll(rc);
+
+ return Ok(rcs);
+ }
+
[HttpGet("{klass}/{id}/cover")]
public async Task Cover(string klass, string id, string token)
{
@@ -82,8 +105,6 @@ public class VideoController(ILogger logger, ResourceService rs
var r = await rs.Get(d, token, Ip);
if (!r) return StatusCode(403, new { message = "403 Denied" });
- _logger.LogInformation($"Cover found for {id}");
-
return PhysicalFile(d, "image/jpeg", enableRangeProcessing: true);
}
diff --git a/Abyss/Components/Services/AbyssService.cs b/Abyss/Components/Services/AbyssService.cs
index 98ae16b..2107fcb 100644
--- a/Abyss/Components/Services/AbyssService.cs
+++ b/Abyss/Components/Services/AbyssService.cs
@@ -41,6 +41,7 @@ public class AbyssService(ILogger logger, ConfigureService config)
int bytesRead = await upstream.ReadAsync(buffer, 0, buffer.Length, token);
if (bytesRead == 0)
break;
+
await client.WriteAsync(buffer, 0, bytesRead, token);
}
});
diff --git a/Abyss/Components/Tools/AbyssStream.cs b/Abyss/Components/Tools/AbyssStream.cs
index cca67e5..566d015 100644
--- a/Abyss/Components/Tools/AbyssStream.cs
+++ b/Abyss/Components/Tools/AbyssStream.cs
@@ -5,7 +5,7 @@
using System.Buffers;
using System.Buffers.Binary;
using System.Collections.Concurrent;
-
+using System.Data;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
@@ -16,6 +16,8 @@ using ChaCha20Poly1305 = System.Security.Cryptography.ChaCha20Poly1305;
namespace Abyss.Components.Tools
{
+ // TODO: Since C25519 has already been used for user authentication,
+ // TODO: why not use that public key to verify user identity when establishing a secure channel here?
public sealed class AbyssStream : NetworkStream, IDisposable
{
private const int PublicKeyLength = 32;