Use InMemory db driver at testing
This commit is contained in:
parent
3b4376a5f0
commit
95dec3636a
24 changed files with 474 additions and 139 deletions
|
|
@ -7,38 +7,34 @@ using Yavsc.Models;
|
|||
using Yavsc.Models.FileSystem;
|
||||
using Yavsc.Models.Streaming;
|
||||
using Yavsc.ViewModels;
|
||||
using SixLabors.ImageSharp;
|
||||
using SixLabors.ImageSharp.Processing;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Yavsc.Exceptions;
|
||||
using Yavsc.Helpers;
|
||||
using Yavsc.Abstract.Helpers;
|
||||
using ImageMagick;
|
||||
namespace Yavsc.Server.Helpers
|
||||
{
|
||||
public static class FileSystemHelpers
|
||||
public static class FileSystemHelpers
|
||||
{
|
||||
public static async Task SaveAsAsync(this IFormFile formFile, string path)
|
||||
{
|
||||
if (formFile.Length > 0) {
|
||||
using (Stream fileStream = new FileStream(path, FileMode.Create)) {
|
||||
if (formFile.Length > 0)
|
||||
{
|
||||
using (Stream fileStream = new FileStream(path, FileMode.Create))
|
||||
{
|
||||
await formFile.CopyToAsync(fileStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
public static FileReceivedInfo ReceiveProSignature(this ClaimsPrincipal user, string billingCode, long estimateId, IFormFile formFile, string signType)
|
||||
public static async Task<FileReceivedInfo> ReceiveProSignatureAsync(this ClaimsPrincipal user, string billingCode, long estimateId, IFormFile formFile, string signType)
|
||||
{
|
||||
var item = new FileReceivedInfo(
|
||||
Config.SiteSetup.Bills,
|
||||
Config.SiteSetup.Bills,
|
||||
AbstractFileSystemHelpers.SignFileNameFormat("pro", billingCode, estimateId));
|
||||
|
||||
var fi = new FileInfo(item.FullName);
|
||||
if (fi.Exists) item.Overridden = true;
|
||||
|
||||
using (var org = formFile.OpenReadStream())
|
||||
{
|
||||
using Image image = Image.Load(org);
|
||||
image.Save(fi.FullName);
|
||||
}
|
||||
await formFile.SaveAsAsync(fi.FullName);
|
||||
return item;
|
||||
}
|
||||
|
||||
|
|
@ -76,67 +72,70 @@ namespace Yavsc.Server.Helpers
|
|||
{
|
||||
var root = Path.Combine(AbstractFileSystemHelpers.UserFilesDirName, user.UserName);
|
||||
var fi = new FileInfo(Path.Combine(root, fileName));
|
||||
if (!fi.Exists) return ;
|
||||
if (!fi.Exists) return;
|
||||
fi.Delete();
|
||||
user.DiskUsage -= fi.Length;
|
||||
}
|
||||
|
||||
|
||||
public static FsOperationInfo DeleteUserDirOrFile(this ApplicationUser user, string dirName)
|
||||
{
|
||||
var root = Path.Combine(AbstractFileSystemHelpers.UserFilesDirName, user.UserName);
|
||||
if (string.IsNullOrEmpty(dirName))
|
||||
return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.InvalidRequest, ErrorMessage = "specify a directory or file name"} ;
|
||||
if (string.IsNullOrEmpty(dirName))
|
||||
return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.InvalidRequest, ErrorMessage = "specify a directory or file name" };
|
||||
|
||||
var di = new DirectoryInfo(Path.Combine(root, dirName));
|
||||
if (!di.Exists) {
|
||||
if (!di.Exists)
|
||||
{
|
||||
var fi = new FileInfo(Path.Combine(root, dirName));
|
||||
if (!fi.Exists) return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.NotFound, ErrorMessage = "non existent"} ;
|
||||
if (!fi.Exists) return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.NotFound, ErrorMessage = "non existent" };
|
||||
fi.Delete();
|
||||
user.DiskUsage -= fi.Length;
|
||||
}
|
||||
else {
|
||||
if (di.GetDirectories().Length>0 || di.GetFiles().Length>0)
|
||||
return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.InvalidRequest, ErrorMessage = "dir is not empty, refusing to remove it"} ;
|
||||
else
|
||||
{
|
||||
if (di.GetDirectories().Length > 0 || di.GetFiles().Length > 0)
|
||||
return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.InvalidRequest, ErrorMessage = "dir is not empty, refusing to remove it" };
|
||||
di.Delete();
|
||||
}
|
||||
return new FsOperationInfo { Done = true };
|
||||
}
|
||||
|
||||
|
||||
public static FsOperationInfo MoveUserDir(this ApplicationUser user, string fromDirName, string toDirName)
|
||||
{
|
||||
var root = Path.Combine(AbstractFileSystemHelpers.UserFilesDirName, user.UserName);
|
||||
if (string.IsNullOrEmpty(fromDirName))
|
||||
return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.InvalidRequest , ErrorMessage = "specify a dir name "} ;
|
||||
if (string.IsNullOrEmpty(fromDirName))
|
||||
return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.InvalidRequest, ErrorMessage = "specify a dir name " };
|
||||
|
||||
var di = new DirectoryInfo(Path.Combine(root, fromDirName));
|
||||
if (!di.Exists) return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.NotFound, ErrorMessage = "fromDirName: non existent"} ;
|
||||
|
||||
if (!di.Exists) return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.NotFound, ErrorMessage = "fromDirName: non existent" };
|
||||
|
||||
|
||||
if (string.IsNullOrEmpty(toDirName)) toDirName = ".";
|
||||
var destPath = Path.Combine(root, toDirName);
|
||||
|
||||
|
||||
var fout = new FileInfo(destPath);
|
||||
if (fout.Exists) return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.InvalidRequest, ErrorMessage = "destination is a regular file" } ;
|
||||
if (fout.Exists) return new FsOperationInfo { Done = false, ErrorCode = ErrorCode.InvalidRequest, ErrorMessage = "destination is a regular file" };
|
||||
|
||||
|
||||
var dout = new DirectoryInfo(destPath);
|
||||
if (dout.Exists) {
|
||||
destPath = Path.Combine(destPath, dout.Name);
|
||||
var dOut = new DirectoryInfo(destPath);
|
||||
if (dOut.Exists)
|
||||
{
|
||||
destPath = Path.Combine(destPath, dOut.Name);
|
||||
}
|
||||
di.MoveTo(destPath);
|
||||
di.MoveTo(destPath);
|
||||
return new FsOperationInfo { Done = true };
|
||||
}
|
||||
public static FsOperationInfo MoveUserFileToDir(this ApplicationUser user, string fileNameFrom, string fileNameDest)
|
||||
{
|
||||
var root = Path.Combine(AbstractFileSystemHelpers.UserFilesDirName, user.UserName);
|
||||
var fi = new FileInfo(Path.Combine(root, fileNameFrom));
|
||||
if (!fi.Exists) return new FsOperationInfo { ErrorCode = ErrorCode.NotFound, ErrorMessage = "no file to move" } ;
|
||||
if (!fi.Exists) return new FsOperationInfo { ErrorCode = ErrorCode.NotFound, ErrorMessage = "no file to move" };
|
||||
string dest;
|
||||
if (!string.IsNullOrEmpty(fileNameDest)) dest = Path.Combine(root, fileNameDest);
|
||||
else dest = root;
|
||||
var fo = new FileInfo(dest);
|
||||
if (fo.Exists) return new FsOperationInfo { ErrorCode = ErrorCode.DestExists , ErrorMessage = "destination file name is an existing file" } ;
|
||||
if (fo.Exists) return new FsOperationInfo { ErrorCode = ErrorCode.DestExists, ErrorMessage = "destination file name is an existing file" };
|
||||
var dout = new DirectoryInfo(dest);
|
||||
if (!dout.Exists) dout.Create();
|
||||
fi.MoveTo(Path.Combine(dout.FullName, fi.Name));
|
||||
|
|
@ -146,9 +145,9 @@ namespace Yavsc.Server.Helpers
|
|||
{
|
||||
var root = Path.Combine(AbstractFileSystemHelpers.UserFilesDirName, user.UserName);
|
||||
var fi = new FileInfo(Path.Combine(root, fileNameFrom));
|
||||
if (!fi.Exists) return new FsOperationInfo { ErrorCode = ErrorCode.NotFound, ErrorMessage = "no file to move" } ;
|
||||
if (!fi.Exists) return new FsOperationInfo { ErrorCode = ErrorCode.NotFound, ErrorMessage = "no file to move" };
|
||||
var fo = new FileInfo(Path.Combine(root, fileNameDest));
|
||||
if (fo.Exists) return new FsOperationInfo { ErrorCode = ErrorCode.DestExists , ErrorMessage = "destination file name is an existing file" } ;
|
||||
if (fo.Exists) return new FsOperationInfo { ErrorCode = ErrorCode.DestExists, ErrorMessage = "destination file name is an existing file" };
|
||||
fi.MoveTo(fo.FullName);
|
||||
return new FsOperationInfo { Done = true };
|
||||
}
|
||||
|
|
@ -158,7 +157,7 @@ namespace Yavsc.Server.Helpers
|
|||
// form-data_ name=_file__ filename=_Constants.Private.cs_
|
||||
var parts = disposition.Split(' ');
|
||||
var filename = parts[2].Split('=')[1];
|
||||
filename = filename.Substring(1,filename.Length-2);
|
||||
filename = filename.Substring(1, filename.Length - 2);
|
||||
return filename;
|
||||
}
|
||||
|
||||
|
|
@ -170,7 +169,7 @@ namespace Yavsc.Server.Helpers
|
|||
{
|
||||
return ReceiveUserFile(user, root, f.OpenReadStream(), destFileName ?? ParseFileNameFromDisposition(f.ContentDisposition), f.ContentType, CancellationToken.None);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the user's disk usage
|
||||
/// </summary>
|
||||
|
|
@ -203,7 +202,7 @@ namespace Yavsc.Server.Helpers
|
|||
{
|
||||
item.Overridden = true;
|
||||
usage -= fi.Length;
|
||||
}
|
||||
}
|
||||
using (var dest = fi.OpenWrite())
|
||||
{
|
||||
using (inputStream)
|
||||
|
|
@ -211,7 +210,7 @@ namespace Yavsc.Server.Helpers
|
|||
const int blen = 1024;
|
||||
byte[] buffer = new byte[blen];
|
||||
int len = 0;
|
||||
while (!token.IsCancellationRequested && (len=inputStream.Read(buffer, 0, blen))>0)
|
||||
while (!token.IsCancellationRequested && (len = inputStream.Read(buffer, 0, blen)) > 0)
|
||||
{
|
||||
dest.Write(buffer, 0, len);
|
||||
usage += len;
|
||||
|
|
@ -222,7 +221,8 @@ namespace Yavsc.Server.Helpers
|
|||
inputStream.Close();
|
||||
}
|
||||
}
|
||||
if (usage >= user.DiskQuota) {
|
||||
if (usage >= user.DiskQuota)
|
||||
{
|
||||
item.QuotaOffense = true;
|
||||
}
|
||||
user.DiskUsage = usage;
|
||||
|
|
@ -231,15 +231,15 @@ namespace Yavsc.Server.Helpers
|
|||
|
||||
public static HtmlString FileLink(this RemoteFileInfo info, string username, string subpath)
|
||||
{
|
||||
return new HtmlString(
|
||||
$"{Config.UserFilesOptions.RequestPath}/{username}/{subpath}/{info.Name}" );
|
||||
return new HtmlString(
|
||||
$"{Config.UserFilesOptions.RequestPath}/{username}/{subpath}/{info.Name}");
|
||||
}
|
||||
|
||||
public static RemoteFileInfo FileInfo(this ApplicationUser user, string path)
|
||||
{
|
||||
IFileInfo info = Config.UserFilesOptions.FileProvider.GetFileInfo($"{user.UserName}/{path}");
|
||||
if (!info.Exists) return null;
|
||||
return new RemoteFileInfo{ Name = info.Name, Size = info.Length, LastModified = info.LastModified.UtcDateTime };
|
||||
return new RemoteFileInfo { Name = info.Name, Size = info.Length, LastModified = info.LastModified.UtcDateTime };
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -248,32 +248,43 @@ namespace Yavsc.Server.Helpers
|
|||
var item = new FileReceivedInfo
|
||||
(Config.AvatarsOptions.RequestPath.ToUriComponent(),
|
||||
user.UserName + ".png");
|
||||
|
||||
using (var org = formFile.OpenReadStream())
|
||||
{
|
||||
using Image image = Image.Load(org);
|
||||
image.Mutate(x=>x.Resize(128,128));
|
||||
image.Save(Path.Combine(Config.SiteSetup.Avatars,item.FileName));
|
||||
image.Mutate(x=>x.Resize(64,64));
|
||||
image.Save(Path.Combine(Config.SiteSetup.Avatars,user.UserName + ".s.png"));
|
||||
image.Mutate(x=>x.Resize(32,32));
|
||||
image.Save(Path.Combine(Config.SiteSetup.Avatars,user.UserName + ".xs.png"));
|
||||
|
||||
var size = new MagickGeometry(128, 128);
|
||||
size.IgnoreAspectRatio = false;
|
||||
using var image = new MagickImage(org);
|
||||
|
||||
image.Resize(size);
|
||||
image.Write(Path.Combine(Config.SiteSetup.Avatars, item.FileName));
|
||||
size.X = 64;
|
||||
size.Y = 64;
|
||||
image.Resize(size);
|
||||
image.Write(Path.Combine(Config.SiteSetup.Avatars, user.UserName + ".s.png"));
|
||||
size.X = 32;
|
||||
size.Y = 32;
|
||||
image.Resize(size);
|
||||
image.Write(Path.Combine(Config.SiteSetup.Avatars, user.UserName + ".xs.png"));
|
||||
|
||||
}
|
||||
|
||||
user.Avatar = $"{item.DestDir}/{item.FileName}";
|
||||
return item;
|
||||
}
|
||||
|
||||
public static string GetFileUrl (this LiveFlow flow)
|
||||
public static string GetFileUrl(this LiveFlow flow)
|
||||
{
|
||||
// no server-side backup for this stream
|
||||
return $"{Config.UserFilesOptions.RequestPath}/{flow.Owner.UserName}/live/"+GetFileName(flow);
|
||||
return $"{Config.UserFilesOptions.RequestPath}/{flow.Owner.UserName}/live/" + GetFileName(flow);
|
||||
}
|
||||
|
||||
public static string GetFileName (this LiveFlow flow)
|
||||
|
||||
public static string GetFileName(this LiveFlow flow)
|
||||
{
|
||||
var fileInfo = new FileInfo(flow.DifferedFileName);
|
||||
var ext = fileInfo.Extension;
|
||||
var namelen = flow.DifferedFileName.Length - ext.Length;
|
||||
var basename = flow.DifferedFileName.Substring(0,namelen);
|
||||
var basename = flow.DifferedFileName.Substring(0, namelen);
|
||||
return $"{basename}-{flow.SequenceNumber}{ext}";
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue