[feat] Bulk query
This commit is contained in:
		
							
								
								
									
										10
									
								
								.idea/.idea.Abyss/.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										10
									
								
								.idea/.idea.Abyss/.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							| @@ -11,7 +11,10 @@ | |||||||
|   <component name="ChangeListManager"> |   <component name="ChangeListManager"> | ||||||
|     <list default="true" id="bf317275-3039-49bb-a475-725a800a0cce" name="Changes" comment=""> |     <list default="true" id="bf317275-3039-49bb-a475-725a800a0cce" name="Changes" comment=""> | ||||||
|       <change beforePath="$PROJECT_DIR$/.idea/.idea.Abyss/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.Abyss/.idea/workspace.xml" afterDir="false" /> |       <change beforePath="$PROJECT_DIR$/.idea/.idea.Abyss/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.Abyss/.idea/workspace.xml" afterDir="false" /> | ||||||
|       <change beforePath="$PROJECT_DIR$/Abyss/Components/Services/UserService.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Services/UserService.cs" afterDir="false" /> |       <change beforePath="$PROJECT_DIR$/Abyss/Components/Controllers/Media/ImageController.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Controllers/Media/ImageController.cs" afterDir="false" /> | ||||||
|  |       <change beforePath="$PROJECT_DIR$/Abyss/Components/Controllers/Media/VideoController.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Controllers/Media/VideoController.cs" afterDir="false" /> | ||||||
|  |       <change beforePath="$PROJECT_DIR$/Abyss/Components/Services/AbyssService.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Services/AbyssService.cs" afterDir="false" /> | ||||||
|  |       <change beforePath="$PROJECT_DIR$/Abyss/Components/Tools/AbyssStream.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Abyss/Components/Tools/AbyssStream.cs" afterDir="false" /> | ||||||
|     </list> |     </list> | ||||||
|     <option name="SHOW_DIALOG" value="false" /> |     <option name="SHOW_DIALOG" value="false" /> | ||||||
|     <option name="HIGHLIGHT_CONFLICTS" value="true" /> |     <option name="HIGHLIGHT_CONFLICTS" value="true" /> | ||||||
| @@ -85,7 +88,7 @@ | |||||||
|     "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", |     "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", | ||||||
|     "RunOnceActivity.git.unshallow": "true", |     "RunOnceActivity.git.unshallow": "true", | ||||||
|     "XThreadsFramesViewSplitterKey": "0.30266345", |     "XThreadsFramesViewSplitterKey": "0.30266345", | ||||||
|     "git-widget-placeholder": "dev-abyss", |     "git-widget-placeholder": "main", | ||||||
|     "last_opened_file_path": "/storage/Images/31/summary.json", |     "last_opened_file_path": "/storage/Images/31/summary.json", | ||||||
|     "node.js.detected.package.eslint": "true", |     "node.js.detected.package.eslint": "true", | ||||||
|     "node.js.detected.package.tslint": "true", |     "node.js.detected.package.tslint": "true", | ||||||
| @@ -201,6 +204,9 @@ | |||||||
|       <workItem from="1757687641035" duration="2969000" /> |       <workItem from="1757687641035" duration="2969000" /> | ||||||
|       <workItem from="1757693751836" duration="667000" /> |       <workItem from="1757693751836" duration="667000" /> | ||||||
|       <workItem from="1757694833696" duration="11000" /> |       <workItem from="1757694833696" duration="11000" /> | ||||||
|  |       <workItem from="1757695721386" duration="749000" /> | ||||||
|  |       <workItem from="1757702942841" duration="32000" /> | ||||||
|  |       <workItem from="1757735249561" duration="4543000" /> | ||||||
|     </task> |     </task> | ||||||
|     <servers /> |     <servers /> | ||||||
|   </component> |   </component> | ||||||
|   | |||||||
| @@ -9,6 +9,8 @@ using Newtonsoft.Json.Linq; | |||||||
| namespace Abyss.Components.Controllers.Media; | namespace Abyss.Components.Controllers.Media; | ||||||
| using System.IO; | using System.IO; | ||||||
|  |  | ||||||
|  | using Task = System.Threading.Tasks.Task; | ||||||
|  |  | ||||||
| [ApiController] | [ApiController] | ||||||
| [Route("api/[controller]")] | [Route("api/[controller]")] | ||||||
| public class ImageController(ILogger<ImageController> logger, ResourceService rs, ConfigureService config) : BaseController | public class ImageController(ILogger<ImageController> logger, ResourceService rs, ConfigureService config) : BaseController | ||||||
| @@ -46,6 +48,27 @@ public class ImageController(ILogger<ImageController> logger, ResourceService rs | |||||||
|         return Ok(await System.IO.File.ReadAllTextAsync(d)); |         return Ok(await System.IO.File.ReadAllTextAsync(d)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     [HttpPost("bulkquery")] | ||||||
|  |     public async Task<IActionResult> QueryBulk([FromQuery] string token, [FromBody] string[] id) | ||||||
|  |     { | ||||||
|  |         List<string> result = new List<string>(); | ||||||
|  |  | ||||||
|  |         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")] |     [HttpPost("{id}/bookmark")] | ||||||
|     public async Task<IActionResult> Bookmark(string id, string token, [FromBody] Bookmark bookmark) |     public async Task<IActionResult> Bookmark(string id, string token, [FromBody] Bookmark bookmark) | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -8,6 +8,8 @@ using Newtonsoft.Json; | |||||||
|  |  | ||||||
| namespace Abyss.Components.Controllers.Media; | namespace Abyss.Components.Controllers.Media; | ||||||
|  |  | ||||||
|  | using Task = System.Threading.Tasks.Task; | ||||||
|  |  | ||||||
| [ApiController] | [ApiController] | ||||||
| [Route("api/[controller]")] | [Route("api/[controller]")] | ||||||
| public class VideoController(ILogger<VideoController> logger, ResourceService rs, ConfigureService config) : BaseController | public class VideoController(ILogger<VideoController> logger, ResourceService rs, ConfigureService config) : BaseController | ||||||
| @@ -73,6 +75,27 @@ public class VideoController(ILogger<VideoController> logger, ResourceService rs | |||||||
|         return Ok(await System.IO.File.ReadAllTextAsync(d)); |         return Ok(await System.IO.File.ReadAllTextAsync(d)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     [HttpPost("{klass}/bulkquery")] | ||||||
|  |     public async Task<IActionResult> QueryBulk([FromQuery] string token, [FromBody] string[] id, [FromRoute] string klass) | ||||||
|  |     { | ||||||
|  |         List<string> result = new List<string>(); | ||||||
|  |          | ||||||
|  |         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")] |     [HttpGet("{klass}/{id}/cover")] | ||||||
|     public async Task<IActionResult> Cover(string klass, string id, string token) |     public async Task<IActionResult> Cover(string klass, string id, string token) | ||||||
|     { |     { | ||||||
| @@ -82,8 +105,6 @@ public class VideoController(ILogger<VideoController> logger, ResourceService rs | |||||||
|         var r = await rs.Get(d, token, Ip); |         var r = await rs.Get(d, token, Ip); | ||||||
|         if (!r)  return StatusCode(403, new { message = "403 Denied" }); |         if (!r)  return StatusCode(403, new { message = "403 Denied" }); | ||||||
|          |          | ||||||
|         _logger.LogInformation($"Cover found for {id}"); |  | ||||||
|          |  | ||||||
|         return PhysicalFile(d, "image/jpeg", enableRangeProcessing: true); |         return PhysicalFile(d, "image/jpeg", enableRangeProcessing: true); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ public class AbyssService(ILogger<AbyssService> logger, ConfigureService config) | |||||||
|                 int bytesRead = await upstream.ReadAsync(buffer, 0, buffer.Length, token); |                 int bytesRead = await upstream.ReadAsync(buffer, 0, buffer.Length, token); | ||||||
|                 if (bytesRead == 0)  |                 if (bytesRead == 0)  | ||||||
|                     break; |                     break; | ||||||
|  |                  | ||||||
|                 await client.WriteAsync(buffer, 0, bytesRead, token); |                 await client.WriteAsync(buffer, 0, bytesRead, token); | ||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| using System.Buffers; | using System.Buffers; | ||||||
| using System.Buffers.Binary; | using System.Buffers.Binary; | ||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
|  | using System.Data; | ||||||
| using System.Net.Sockets; | using System.Net.Sockets; | ||||||
| using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||||
| using System.Security.Cryptography; | using System.Security.Cryptography; | ||||||
| @@ -16,6 +16,8 @@ using ChaCha20Poly1305 = System.Security.Cryptography.ChaCha20Poly1305; | |||||||
|  |  | ||||||
| namespace Abyss.Components.Tools | 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 |     public sealed class AbyssStream : NetworkStream, IDisposable | ||||||
|     { |     { | ||||||
|         private const int PublicKeyLength = 32; |         private const int PublicKeyLength = 32; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 acite
					acite