From 45dc73de51de3a2707ac54b7339da37e3c129c30 Mon Sep 17 00:00:00 2001 From: saman azadi Date: Sat, 22 Jun 2024 14:00:53 +0330 Subject: [PATCH] v 2.0.0 --- README.md | 119 +++++++++++++++--- Source/Sam.EndPoint.ConsoleApp/Program.cs | 4 +- .../Controllers/FileController.cs | 2 +- .../Models/FileEntityDto.cs | 4 +- .../Context/Internall/ContextQuery.cs | 4 +- .../ServiceCollocationExtentions.cs | 1 - .../Linq/FtDbSetLinq.cs | 2 +- .../Sam.FileTableFramework.csproj | 2 +- 8 files changed, 114 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 4cefbe9..07a6d80 100644 --- a/README.md +++ b/README.md @@ -12,22 +12,22 @@ In today's digital world, effective file management is crucial for individuals a - .NET CLI ``` sh - dotnet add package Sam.FileTableFramework --version 1.0.1 + dotnet add package Sam.FileTableFramework --version 2.0.0 ``` - Package Manager ``` sh - NuGet\Install-Package Sam.FileTableFramework -Version 1.0.1 + NuGet\Install-Package Sam.FileTableFramework -Version 2.0.0 ``` - Package Reference ``` xml - + ``` - Paket CLI ``` sh - paket add Sam.FileTableFramework --version 1.0.1 + paket add Sam.FileTableFramework --version 2.0.0 ``` 3. Create your DbContext by inheriting from FileTableDbContext. Then, define a FtDbSet property for your tables. @@ -67,6 +67,8 @@ In today's digital world, effective file management is crucial for individuals a 6. Now you can inject DatabaseContext in your classes and use your tables, for example, see the source code below ``` c# using Microsoft.AspNetCore.Mvc; + using Sam.EndPoint.WebApi.Models; + using Sam.FileTableFramework.Linq; using Sam.Persistence; using System.Net.Mime; @@ -80,49 +82,138 @@ In today's digital world, effective file management is crucial for individuals a [HttpGet("GetPaged/{page}/{pageCount}")] public async Task GetPaged(int page, int pageCount) { - return Ok(await databaseContext.Table1.GetPagedListAsync(page, pageCount)); + var skip = (page - 1) * pageCount; + + var query = databaseContext.Table1; + + var result = await query + .Skip(skip) + .Take(pageCount) + .OrderBy(p => p.name) + .ToListAsync(p => new FileEntityDto() + { + Name = p.name, + Size = p.cached_file_size, + Id = p.stream_id, + Type = p.file_type + }); + + return Ok(result); } [HttpGet("GetAll")] public async Task GetAll() { - return Ok(await databaseContext.Table1.GetAllAsync()); + var query = databaseContext.Table1; + + var result = await query + .ToListAsync(p => new FileEntityDto() + { + Name = p.name, + Size = p.cached_file_size, + Id = p.stream_id, + Type = p.file_type + }); + + return Ok(result); } [HttpGet("Count")] public async Task Count() { - return Ok(await databaseContext.Table1.Count()); + var query = databaseContext.Table1; + return Ok(await query.CountAsync()); } [HttpGet("Download/{name}")] public async Task Download(string name) { - var result = await databaseContext.Table1.FindByNameAsync(name); + var entity = await databaseContext.Table1.Where($"name = '{name}'").FirstOrDefaultAsync(); - if (result is null) - return NotFound(name); + if (entity is null) + return NotFound(nameof(NotFound)); - return File(result.file_stream!, MediaTypeNames.Application.Octet, result.name); + return File(entity.file_stream!, MediaTypeNames.Application.Octet, entity.name); } [HttpPost("Upload")] public async Task Upload(IFormFile file) { - var fileName = Guid.NewGuid() + file.FileName[file.FileName.LastIndexOf(".", StringComparison.Ordinal)..]; + var fileName = Guid.NewGuid() + file.FileName[file.FileName.LastIndexOf('.')..]; var stream = file.OpenReadStream(); - return Ok(await databaseContext.Table1.CreateAsync(fileName, stream)); + + await databaseContext.Table1.CreateAsync(fileName, stream); + + return Ok(fileName); } [HttpDelete("Delete")] public async Task Delete(string name) { - return Ok(await databaseContext.Table1.RemoveByNameAsync(name)); + var entity = await databaseContext.Table1.Where($"name = '{name}'").FirstOrDefaultAsync(); + + if (entity is null) + return NotFound(nameof(NotFound)); + + var temp = await databaseContext.Table1.RemoveAsync(entity); + + return Ok(temp); + } + + [HttpGet("TestQueryString")] + public async Task TestQueryString() + { + + var query = databaseContext.Table1; + + var result = query + .Take(3) + .Skip(2) + .Where("name = 'saman'") + .OrderBy(p => p.name) + .OrderBy(p => p.is_archive) + .OrderByDescending(p => p.stream_id) + .OrderBy(p => p.creation_time) + .Select(p => new FileEntityDto() + { + Name = p.name, + Size = p.cached_file_size, + Id = p.stream_id, + Type = p.file_type + }); + + return Ok(new + { + Query = result.ToQueryString(), + Data = await result.ToListAsync(p => new FileEntityDto() + { + Name = p.name, + Size = p.cached_file_size, + Id = p.stream_id, + Type = p.file_type + }) + }); } + + } + + public class FileEntityDto + { + public Guid Id { get; set; } + public string? Name { get; set; } + public string? Type { get; set; } + public long Size { get; set; } } } ``` + # Conclusion In this article, we delved into creating a file management application using ASP.NET Core and SQL Server FileTable. This application provides functionalities for organizing and managing files in a web environment. Leveraging modern technologies and tools like FileTable, we were able to build a secure, reliable, and high-performance application. + +# Support +If you are having problems, please let me know by [raising a new issue](https://github.com/samanazadi1996/Sam.FileTableSqlServer/issues). + +# License +This project is licensed with the [MIT license](https://github.com/samanazadi1996/Sam.FileTableSqlServer?tab=MIT-1-ov-file#readme). diff --git a/Source/Sam.EndPoint.ConsoleApp/Program.cs b/Source/Sam.EndPoint.ConsoleApp/Program.cs index 82677e3..1ceb573 100644 --- a/Source/Sam.EndPoint.ConsoleApp/Program.cs +++ b/Source/Sam.EndPoint.ConsoleApp/Program.cs @@ -1,6 +1,6 @@ using Sam.FileTableFramework.Extentions; -using Sam.Persistence; using Sam.FileTableFramework.Linq; +using Sam.Persistence; using System; var connectionStrings = "Data Source =.; Initial Catalog = db1; Integrated Security = true"; @@ -8,7 +8,7 @@ db.UseSqlServer(connectionStrings); db.Migrate(); -var result = await db.Table1.CountAsync(); +var result = await db.Table1.Where("[is_readonly] = 0").CountAsync(); Console.WriteLine($"Count Files in Table1 : {result}"); Console.ReadKey(); diff --git a/Source/Sam.EndPoint.WebApi/Controllers/FileController.cs b/Source/Sam.EndPoint.WebApi/Controllers/FileController.cs index 7fa9f18..9dded06 100644 --- a/Source/Sam.EndPoint.WebApi/Controllers/FileController.cs +++ b/Source/Sam.EndPoint.WebApi/Controllers/FileController.cs @@ -71,7 +71,7 @@ public async Task Download(string name) [HttpPost("Upload")] public async Task Upload(IFormFile file) { - var fileName = Guid.NewGuid() + file.FileName[file.FileName.LastIndexOf(".", StringComparison.Ordinal)..]; + var fileName = Guid.NewGuid() + file.FileName[file.FileName.LastIndexOf('.')..]; var stream = file.OpenReadStream(); await databaseContext.Table1.CreateAsync(fileName, stream); diff --git a/Source/Sam.EndPoint.WebApi/Models/FileEntityDto.cs b/Source/Sam.EndPoint.WebApi/Models/FileEntityDto.cs index 51d75ee..4696338 100644 --- a/Source/Sam.EndPoint.WebApi/Models/FileEntityDto.cs +++ b/Source/Sam.EndPoint.WebApi/Models/FileEntityDto.cs @@ -3,8 +3,8 @@ public class FileEntityDto { public Guid Id { get; set; } - public string Name { get; set; } - public string Type { get; set; } + public string? Name { get; set; } + public string? Type { get; set; } public long Size { get; set; } } } diff --git a/Source/Sam.FileTableFramework/Context/Internall/ContextQuery.cs b/Source/Sam.FileTableFramework/Context/Internall/ContextQuery.cs index a30fb75..ea1749c 100644 --- a/Source/Sam.FileTableFramework/Context/Internall/ContextQuery.cs +++ b/Source/Sam.FileTableFramework/Context/Internall/ContextQuery.cs @@ -12,9 +12,9 @@ internal ContextQuery(FtDbSet ftDbSet) internal string TableName { get; set; } internal string ConnectionString { get; set; } internal List? Fields { get; set; } - internal int? Skip { get; set; } - internal int? Take { get; set; } internal List? Where { get; set; } internal List? OrderBy { get; set; } + internal int? Skip { get; set; } + internal int? Take { get; set; } } } diff --git a/Source/Sam.FileTableFramework/Extentions/ServiceCollocationExtentions.cs b/Source/Sam.FileTableFramework/Extentions/ServiceCollocationExtentions.cs index 83e0197..6d594f0 100644 --- a/Source/Sam.FileTableFramework/Extentions/ServiceCollocationExtentions.cs +++ b/Source/Sam.FileTableFramework/Extentions/ServiceCollocationExtentions.cs @@ -1,7 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Sam.FileTableFramework.Context; using System; -using System.Linq; namespace Sam.FileTableFramework.Extentions { diff --git a/Source/Sam.FileTableFramework/Linq/FtDbSetLinq.cs b/Source/Sam.FileTableFramework/Linq/FtDbSetLinq.cs index 28f2d32..c0f7f88 100644 --- a/Source/Sam.FileTableFramework/Linq/FtDbSetLinq.cs +++ b/Source/Sam.FileTableFramework/Linq/FtDbSetLinq.cs @@ -204,7 +204,7 @@ public static string ToQueryString(this ContextQuery contextQuery) var skipClause = contextQuery.Skip.HasValue ? $"OFFSET {contextQuery.Skip.Value} ROWS" : string.Empty; var takeClause = contextQuery.Take.HasValue ? $"FETCH NEXT {contextQuery.Take.Value} ROWS ONLY" : string.Empty; - var queryString = $"SELECT {selectClause} {fromClause} {whereClause} {orderByClause} {skipClause} {takeClause};"; + var queryString = $"SELECT {selectClause} {fromClause} {whereClause} {orderByClause} {skipClause} {takeClause}"; return queryString.Trim(); } diff --git a/Source/Sam.FileTableFramework/Sam.FileTableFramework.csproj b/Source/Sam.FileTableFramework/Sam.FileTableFramework.csproj index 87e9011..c2d4663 100644 --- a/Source/Sam.FileTableFramework/Sam.FileTableFramework.csproj +++ b/Source/Sam.FileTableFramework/Sam.FileTableFramework.csproj @@ -7,7 +7,7 @@ https://github.com/samanazadi1996/Sam.FileTableSqlServer https://github.com/samanazadi1996/Sam.FileTableSqlServer github - 1.0.1 + 2.0.0 sql-server-filetable;filetable;csharp;dotnet Saman Azadi PackageIcon.png