Folder and file management service
This commit is contained in:
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
@ -3,12 +3,16 @@ using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Oqtane.Infrastructure;
|
||||
using Oqtane.Repository;
|
||||
using Oqtane.Models;
|
||||
using Oqtane.Shared;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Oqtane.Security;
|
||||
using System.Linq;
|
||||
|
||||
namespace Oqtane.Controllers
|
||||
{
|
||||
@ -16,53 +20,163 @@ namespace Oqtane.Controllers
|
||||
public class FileController : Controller
|
||||
{
|
||||
private readonly IWebHostEnvironment environment;
|
||||
private readonly IFileRepository Files;
|
||||
private readonly IFolderRepository Folders;
|
||||
private readonly IUserPermissions UserPermissions;
|
||||
private readonly ITenantResolver Tenants;
|
||||
private readonly ILogManager logger;
|
||||
private readonly string WhiteList = "jpg,jpeg,jpe,gif,bmp,png,mov,wmv,avi,mp4,mp3,doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,nupkg";
|
||||
|
||||
public FileController(IWebHostEnvironment environment, ILogManager logger)
|
||||
public FileController(IWebHostEnvironment environment, IFileRepository Files, IFolderRepository Folders, IUserPermissions UserPermissions, ITenantResolver Tenants, ILogManager logger)
|
||||
{
|
||||
this.environment = environment;
|
||||
this.Files = Files;
|
||||
this.Folders = Folders;
|
||||
this.UserPermissions = UserPermissions;
|
||||
this.Tenants = Tenants;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
// GET: api/<controller>?folder=x
|
||||
[HttpGet]
|
||||
public IEnumerable<string> Get(string folder)
|
||||
public IEnumerable<Models.File> Get(string folder)
|
||||
{
|
||||
List<string> files = new List<string>();
|
||||
folder = GetFolder(folder);
|
||||
if (Directory.Exists(folder))
|
||||
List<Models.File> files = new List<Models.File>();
|
||||
int folderid;
|
||||
if (int.TryParse(folder, out folderid))
|
||||
{
|
||||
foreach (string file in Directory.GetFiles(folder))
|
||||
Folder Folder = Folders.GetFolder(folderid);
|
||||
if (Folder != null && UserPermissions.IsAuthorized(User, "Browse", Folder.Permissions))
|
||||
{
|
||||
files.Add(Path.GetFileName(file));
|
||||
files = Files.GetFiles(folderid).ToList();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (User.IsInRole(Constants.HostRole))
|
||||
{
|
||||
folder = GetFolderPath(folder);
|
||||
if (Directory.Exists(folder))
|
||||
{
|
||||
foreach (string file in Directory.GetFiles(folder))
|
||||
{
|
||||
files.Add(new Models.File { Name = Path.GetFileName(file), Extension = Path.GetExtension(file).Replace(".","") });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return files;
|
||||
}
|
||||
|
||||
// GET api/<controller>/5
|
||||
[HttpGet("{id}")]
|
||||
public Models.File Get(int id)
|
||||
{
|
||||
return Files.GetFile(id);
|
||||
}
|
||||
|
||||
// PUT api/<controller>/5
|
||||
[HttpPut("{id}")]
|
||||
[Authorize(Roles = Constants.RegisteredRole)]
|
||||
public Models.File Put(int id, [FromBody] Models.File File)
|
||||
{
|
||||
if (ModelState.IsValid && UserPermissions.IsAuthorized(User, "Folder", File.Folder.FolderId, "Edit"))
|
||||
{
|
||||
File = Files.UpdateFile(File);
|
||||
logger.Log(LogLevel.Information, this, LogFunction.Update, "File Updated {File}", File);
|
||||
}
|
||||
return File;
|
||||
}
|
||||
|
||||
// DELETE api/<controller>/5
|
||||
[HttpDelete("{id}")]
|
||||
[Authorize(Roles = Constants.RegisteredRole)]
|
||||
public void Delete(int id)
|
||||
{
|
||||
Models.File File = Files.GetFile(id);
|
||||
if (UserPermissions.IsAuthorized(User, "Folder", File.Folder.FolderId, "Edit"))
|
||||
{
|
||||
Files.DeleteFile(id);
|
||||
|
||||
string filepath = Path.Combine(GetFolderPath(File.Folder) + File.Name);
|
||||
if (System.IO.File.Exists(filepath))
|
||||
{
|
||||
System.IO.File.Delete(filepath);
|
||||
}
|
||||
logger.Log(LogLevel.Information, this, LogFunction.Delete, "File Deleted {File}", File);
|
||||
}
|
||||
}
|
||||
|
||||
// GET api/<controller>/upload?url=x&folderid=y
|
||||
[HttpGet("upload")]
|
||||
public Models.File UploadFile(string url, string folderid)
|
||||
{
|
||||
Models.File file = null;
|
||||
Folder folder = Folders.GetFolder(int.Parse(folderid));
|
||||
if (folder != null && UserPermissions.IsAuthorized(User, "Edit", folder.Permissions))
|
||||
{
|
||||
string folderpath = GetFolderPath(folder);
|
||||
CreateDirectory(folderpath);
|
||||
string filename = url.Substring(url.LastIndexOf("/") + 1);
|
||||
try
|
||||
{
|
||||
var client = new System.Net.WebClient();
|
||||
client.DownloadFile(url, folderpath + filename);
|
||||
FileInfo fileinfo = new FileInfo(folderpath + filename);
|
||||
file = Files.AddFile(new Models.File { Name = filename, FolderId = folder.FolderId, Extension = fileinfo.Extension.Replace(".",""), Size = (int)fileinfo.Length });
|
||||
}
|
||||
catch
|
||||
{
|
||||
logger.Log(LogLevel.Error, this, LogFunction.Create, "File Could Not Be Downloaded From Url {Url}", url);
|
||||
}
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
// POST api/<controller>/upload
|
||||
[HttpPost("upload")]
|
||||
[Authorize(Roles = Constants.AdminRole)]
|
||||
public async Task UploadFile(string folder, IFormFile file)
|
||||
{
|
||||
if (file.Length > 0)
|
||||
{
|
||||
folder = GetFolder(folder);
|
||||
if (!Directory.Exists(folder))
|
||||
string folderpath = "";
|
||||
int folderid = -1;
|
||||
if (int.TryParse(folder, out folderid))
|
||||
{
|
||||
Directory.CreateDirectory(folder);
|
||||
Folder Folder = Folders.GetFolder(folderid);
|
||||
if (Folder != null && UserPermissions.IsAuthorized(User, "Edit", Folder.Permissions))
|
||||
{
|
||||
folderpath = GetFolderPath(Folder);
|
||||
}
|
||||
}
|
||||
using (var stream = new FileStream(Path.Combine(folder, file.FileName), FileMode.Create))
|
||||
else
|
||||
{
|
||||
await file.CopyToAsync(stream);
|
||||
if (User.IsInRole(Constants.HostRole))
|
||||
{
|
||||
folderpath = GetFolderPath(folder);
|
||||
}
|
||||
}
|
||||
if (folderpath != "")
|
||||
{
|
||||
CreateDirectory(folderpath);
|
||||
using (var stream = new FileStream(Path.Combine(folderpath, file.FileName), FileMode.Create))
|
||||
{
|
||||
await file.CopyToAsync(stream);
|
||||
}
|
||||
string upload = await MergeFile(folderpath, file.FileName);
|
||||
if (upload != "" && folderid != -1)
|
||||
{
|
||||
FileInfo fileinfo = new FileInfo(folderpath + upload);
|
||||
Files.AddFile(new Models.File { Name = upload, FolderId = folderid, Extension = fileinfo.Extension.Replace(".", ""), Size = (int)fileinfo.Length });
|
||||
}
|
||||
}
|
||||
await MergeFile(folder, file.FileName);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task MergeFile(string folder, string filename)
|
||||
private async Task<string> MergeFile(string folder, string filename)
|
||||
{
|
||||
string merged = "";
|
||||
|
||||
// parse the filename which is in the format of filename.ext.part_x_y
|
||||
string token = ".part_";
|
||||
string parts = Path.GetExtension(filename).Replace(token, ""); // returns "x_y"
|
||||
@ -112,6 +226,7 @@ namespace Oqtane.Controllers
|
||||
System.IO.File.Move(Path.Combine(folder, filename + ".tmp"), Path.Combine(folder, filename));
|
||||
logger.Log(LogLevel.Information, this, LogFunction.Create, "File Uploaded {File}", Path.Combine(folder, filename));
|
||||
}
|
||||
merged = filename;
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,6 +240,8 @@ namespace Oqtane.Controllers
|
||||
System.IO.File.Delete(filepart);
|
||||
}
|
||||
}
|
||||
|
||||
return merged;
|
||||
}
|
||||
|
||||
private bool CanAccessFiles(string[] files)
|
||||
@ -164,24 +281,47 @@ namespace Oqtane.Controllers
|
||||
return canaccess;
|
||||
}
|
||||
|
||||
// DELETE api/<controller>/?folder=x&file=y
|
||||
[HttpDelete]
|
||||
[Authorize(Roles = Constants.AdminRole)]
|
||||
public void Delete(string folder, string file)
|
||||
// GET api/<controller>/download/5
|
||||
[HttpGet("download/{id}")]
|
||||
public IActionResult Download(int id)
|
||||
{
|
||||
file = Path.Combine(GetFolder(folder) + file);
|
||||
if (System.IO.File.Exists(file))
|
||||
Models.File file = Files.GetFile(id);
|
||||
if (file != null && UserPermissions.IsAuthorized(User, "View", file.Folder.Permissions))
|
||||
{
|
||||
System.IO.File.Delete(file);
|
||||
logger.Log(LogLevel.Information, this, LogFunction.Delete, "File Deleted {File}", file);
|
||||
byte[] filebytes = System.IO.File.ReadAllBytes(GetFolderPath(file.Folder) + file.Name);
|
||||
return File(filebytes, "application/octet-stream", file.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
private string GetFolder(string folder)
|
||||
private string GetFolderPath(Folder folder)
|
||||
{
|
||||
return environment.ContentRootPath + "\\Content\\Tenants\\" + Tenants.GetTenant().TenantId.ToString() + "\\Sites\\" + folder.SiteId.ToString() + "\\" + folder.Path;
|
||||
}
|
||||
|
||||
private string GetFolderPath(string folder)
|
||||
{
|
||||
folder = folder.Replace("/", "\\");
|
||||
if (folder.StartsWith("\\")) folder = folder.Substring(1);
|
||||
return Path.Combine(environment.WebRootPath, folder);
|
||||
}
|
||||
|
||||
private void CreateDirectory(string folderpath)
|
||||
{
|
||||
if (!Directory.Exists(folderpath))
|
||||
{
|
||||
string path = "";
|
||||
string[] folders = folderpath.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
foreach (string folder in folders)
|
||||
{
|
||||
path += folder + "\\";
|
||||
if (!Directory.Exists(path))
|
||||
{
|
||||
Directory.CreateDirectory(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -52,6 +52,12 @@ namespace Oqtane.Controllers
|
||||
{
|
||||
if (ModelState.IsValid && UserPermissions.IsAuthorized(User, "Edit", Folder.Permissions))
|
||||
{
|
||||
Folder.Path = "";
|
||||
if (string.IsNullOrEmpty(Folder.Path) && Folder.ParentId != null)
|
||||
{
|
||||
Folder parent = Folders.GetFolder(Folder.ParentId.Value);
|
||||
Folder.Path = parent.Path + Folder.Name + "\\";
|
||||
}
|
||||
Folder = Folders.AddFolder(Folder);
|
||||
logger.Log(LogLevel.Information, this, LogFunction.Create, "Folder Added {Folder}", Folder);
|
||||
}
|
||||
@ -65,6 +71,12 @@ namespace Oqtane.Controllers
|
||||
{
|
||||
if (ModelState.IsValid && UserPermissions.IsAuthorized(User, "Folder", Folder.FolderId, "Edit"))
|
||||
{
|
||||
Folder.Path = "";
|
||||
if (string.IsNullOrEmpty(Folder.Path) && Folder.ParentId != null)
|
||||
{
|
||||
Folder parent = Folders.GetFolder(Folder.ParentId.Value);
|
||||
Folder.Path = parent.Path + Folder.Name + "\\";
|
||||
}
|
||||
Folder = Folders.UpdateFolder(Folder);
|
||||
logger.Log(LogLevel.Information, this, LogFunction.Update, "Folder Updated {Folder}", Folder);
|
||||
}
|
||||
|
@ -62,11 +62,6 @@ namespace Oqtane.Controllers
|
||||
if (authorized)
|
||||
{
|
||||
Site = Sites.AddSite(Site);
|
||||
string folder = environment.WebRootPath + "\\Tenants\\" + Tenants.GetTenant().TenantId.ToString() + "\\Sites\\" + Site.SiteId.ToString();
|
||||
if (!Directory.Exists(folder))
|
||||
{
|
||||
Directory.CreateDirectory(folder);
|
||||
}
|
||||
logger.Log(LogLevel.Information, this, LogFunction.Create, "Site Added {Site}", Site);
|
||||
}
|
||||
}
|
||||
|
@ -26,9 +26,10 @@ namespace Oqtane.Controllers
|
||||
private readonly SignInManager<IdentityUser> IdentitySignInManager;
|
||||
private readonly ITenantResolver Tenants;
|
||||
private readonly INotificationRepository Notifications;
|
||||
private readonly IFolderRepository Folders;
|
||||
private readonly ILogManager logger;
|
||||
|
||||
public UserController(IUserRepository Users, IRoleRepository Roles, IUserRoleRepository UserRoles, UserManager<IdentityUser> IdentityUserManager, SignInManager<IdentityUser> IdentitySignInManager, ITenantResolver Tenants, INotificationRepository Notifications, ILogManager logger)
|
||||
public UserController(IUserRepository Users, IRoleRepository Roles, IUserRoleRepository UserRoles, UserManager<IdentityUser> IdentityUserManager, SignInManager<IdentityUser> IdentitySignInManager, ITenantResolver Tenants, INotificationRepository Notifications, IFolderRepository Folders, ILogManager logger)
|
||||
{
|
||||
this.Users = Users;
|
||||
this.Roles = Roles;
|
||||
@ -36,12 +37,14 @@ namespace Oqtane.Controllers
|
||||
this.IdentityUserManager = IdentityUserManager;
|
||||
this.IdentitySignInManager = IdentitySignInManager;
|
||||
this.Tenants = Tenants;
|
||||
this.Folders = Folders;
|
||||
this.Notifications = Notifications;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
// GET: api/<controller>?siteid=x
|
||||
[HttpGet]
|
||||
[Authorize(Roles = Constants.AdminRole)]
|
||||
public IEnumerable<User> Get()
|
||||
{
|
||||
return Users.GetUsers();
|
||||
@ -98,6 +101,8 @@ namespace Oqtane.Controllers
|
||||
var result = await IdentityUserManager.CreateAsync(identityuser, User.Password);
|
||||
if (result.Succeeded)
|
||||
{
|
||||
User.LastLoginOn = null;
|
||||
User.LastIPAddress = "";
|
||||
user = Users.AddUser(User);
|
||||
if (!verified)
|
||||
{
|
||||
@ -128,6 +133,14 @@ namespace Oqtane.Controllers
|
||||
userrole.ExpiryDate = null;
|
||||
UserRoles.AddUserRole(userrole);
|
||||
}
|
||||
|
||||
// add folder for user
|
||||
Folder folder = Folders.GetFolder(User.SiteId, "Users\\");
|
||||
if (folder != null)
|
||||
{
|
||||
Folders.AddFolder(new Folder { SiteId = folder.SiteId, ParentId = folder.FolderId, Name = "My Folder", Path = folder.Path + user.UserId.ToString() + "\\", Order = 1, IsSystem = true,
|
||||
Permissions = "[{\"PermissionName\":\"Browse\",\"Permissions\":\"[" + user.UserId.ToString() + "]\"},{\"PermissionName\":\"View\",\"Permissions\":\"All Users\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"[" + user.UserId.ToString() + "]\"}]" });
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -222,6 +235,9 @@ namespace Oqtane.Controllers
|
||||
if (identityuser.EmailConfirmed)
|
||||
{
|
||||
user.IsAuthenticated = true;
|
||||
user.LastLoginOn = DateTime.Now;
|
||||
user.LastIPAddress = HttpContext.Connection.RemoteIpAddress.ToString();
|
||||
Users.UpdateUser(user);
|
||||
logger.Log(LogLevel.Information, this, LogFunction.Security, "User Login Successful {Username}", User.Username);
|
||||
if (SetCookie)
|
||||
{
|
||||
|
@ -18,8 +18,8 @@ namespace Oqtane.Repository
|
||||
|
||||
public IEnumerable<File> GetFiles(int FolderId)
|
||||
{
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Folder", FolderId);
|
||||
IEnumerable<File> files = db.File.Where(item => item.FolderId == FolderId);
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Folder", FolderId).ToList();
|
||||
IEnumerable<File> files = db.File.Where(item => item.FolderId == FolderId).Include(item => item.Folder);
|
||||
foreach (File file in files)
|
||||
{
|
||||
file.Folder.Permissions = Permissions.EncodePermissions(FolderId, permissions);
|
||||
@ -43,10 +43,10 @@ namespace Oqtane.Repository
|
||||
|
||||
public File GetFile(int FileId)
|
||||
{
|
||||
File file = db.File.Find(FileId);
|
||||
File file = db.File.Where(item => item.FileId == FileId).Include(item => item.Folder).FirstOrDefault();
|
||||
if (file != null)
|
||||
{
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Folder", file.FolderId);
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Folder", file.FolderId).ToList();
|
||||
file.Folder.Permissions = Permissions.EncodePermissions(file.FolderId, permissions);
|
||||
}
|
||||
return file;
|
||||
|
@ -53,7 +53,18 @@ namespace Oqtane.Repository
|
||||
Folder folder = db.Folder.Find(FolderId);
|
||||
if (folder != null)
|
||||
{
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Folder", folder.FolderId);
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Folder", folder.FolderId).ToList();
|
||||
folder.Permissions = Permissions.EncodePermissions(folder.FolderId, permissions);
|
||||
}
|
||||
return folder;
|
||||
}
|
||||
|
||||
public Folder GetFolder(int SiteId, string Path)
|
||||
{
|
||||
Folder folder = db.Folder.Where(item => item.SiteId == SiteId && item.Path == Path).FirstOrDefault();
|
||||
if (folder != null)
|
||||
{
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Folder", folder.FolderId).ToList();
|
||||
folder.Permissions = Permissions.EncodePermissions(folder.FolderId, permissions);
|
||||
}
|
||||
return folder;
|
||||
|
@ -10,6 +10,7 @@ namespace Oqtane.Repository
|
||||
Folder AddFolder(Folder Folder);
|
||||
Folder UpdateFolder(Folder Folder);
|
||||
Folder GetFolder(int FolderId);
|
||||
Folder GetFolder(int SiteId, string Path);
|
||||
void DeleteFolder(int FolderId);
|
||||
}
|
||||
}
|
||||
|
@ -3,21 +3,28 @@ using System.Linq;
|
||||
using Oqtane.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
|
||||
namespace Oqtane.Repository
|
||||
{
|
||||
public class JobRepository : IJobRepository
|
||||
{
|
||||
private MasterDBContext db;
|
||||
private readonly IMemoryCache _cache;
|
||||
|
||||
public JobRepository(MasterDBContext context)
|
||||
public JobRepository(MasterDBContext context, IMemoryCache cache)
|
||||
{
|
||||
db = context;
|
||||
_cache = cache;
|
||||
}
|
||||
|
||||
public IEnumerable<Job> GetJobs()
|
||||
{
|
||||
return db.Job.ToList();
|
||||
return _cache.GetOrCreate("jobs", entry =>
|
||||
{
|
||||
entry.SlidingExpiration = TimeSpan.FromMinutes(30);
|
||||
return db.Job.ToList();
|
||||
});
|
||||
}
|
||||
|
||||
public Job AddJob(Job Job)
|
||||
|
@ -56,7 +56,7 @@ namespace Oqtane.Repository
|
||||
.SingleOrDefault(item => item.PageModuleId == PageModuleId);
|
||||
if (pagemodule != null)
|
||||
{
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Module", pagemodule.ModuleId);
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Module", pagemodule.ModuleId).ToList();
|
||||
pagemodule.Module.Permissions = Permissions.EncodePermissions(pagemodule.ModuleId, permissions);
|
||||
}
|
||||
return pagemodule;
|
||||
@ -68,7 +68,7 @@ namespace Oqtane.Repository
|
||||
.SingleOrDefault(item => item.PageId == PageId && item.ModuleId == ModuleId);
|
||||
if (pagemodule != null)
|
||||
{
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Module", pagemodule.ModuleId);
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Module", pagemodule.ModuleId).ToList();
|
||||
pagemodule.Module.Permissions = Permissions.EncodePermissions(pagemodule.ModuleId, permissions);
|
||||
}
|
||||
return pagemodule;
|
||||
|
@ -55,7 +55,7 @@ namespace Oqtane.Repository
|
||||
Page page = db.Page.Find(PageId);
|
||||
if (page != null)
|
||||
{
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Page", page.PageId);
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Page", page.PageId).ToList();
|
||||
page.Permissions = Permissions.EncodePermissions(page.PageId, permissions);
|
||||
}
|
||||
return page;
|
||||
@ -73,7 +73,7 @@ namespace Oqtane.Repository
|
||||
}
|
||||
if (page != null)
|
||||
{
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Page", page.PageId);
|
||||
IEnumerable<Permission> permissions = Permissions.GetPermissions("Page", page.PageId).ToList();
|
||||
page.Permissions = Permissions.EncodePermissions(page.PageId, permissions);
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,8 @@ namespace Oqtane.Repository
|
||||
private readonly TenantDBContext db;
|
||||
private readonly IRoleRepository RoleRepository;
|
||||
private readonly IProfileRepository ProfileRepository;
|
||||
private readonly IFolderRepository FolderRepository;
|
||||
private readonly IFileRepository FileRepository;
|
||||
private readonly IPageRepository PageRepository;
|
||||
private readonly IModuleRepository ModuleRepository;
|
||||
private readonly IPageModuleRepository PageModuleRepository;
|
||||
@ -22,11 +24,13 @@ namespace Oqtane.Repository
|
||||
private readonly IServiceProvider ServiceProvider;
|
||||
private readonly List<PageTemplate> SiteTemplate;
|
||||
|
||||
public SiteRepository(TenantDBContext context, IRoleRepository RoleRepository, IProfileRepository ProfileRepository, IPageRepository PageRepository, IModuleRepository ModuleRepository, IPageModuleRepository PageModuleRepository, IModuleDefinitionRepository ModuleDefinitionRepository, IServiceProvider ServiceProvider)
|
||||
public SiteRepository(TenantDBContext context, IRoleRepository RoleRepository, IProfileRepository ProfileRepository, IFolderRepository FolderRepository, IFileRepository FileRepository, IPageRepository PageRepository, IModuleRepository ModuleRepository, IPageModuleRepository PageModuleRepository, IModuleDefinitionRepository ModuleDefinitionRepository, IServiceProvider ServiceProvider)
|
||||
{
|
||||
db = context;
|
||||
this.RoleRepository = RoleRepository;
|
||||
this.ProfileRepository = ProfileRepository;
|
||||
this.FolderRepository = FolderRepository;
|
||||
this.FileRepository = FileRepository;
|
||||
this.PageRepository = PageRepository;
|
||||
this.ModuleRepository = ModuleRepository;
|
||||
this.PageModuleRepository = PageModuleRepository;
|
||||
@ -40,7 +44,7 @@ namespace Oqtane.Repository
|
||||
Content = "<p><a href=\"https://www.oqtane.org\" target=\"_new\">Oqtane</a> is an open source <b>modular application framework</b> built from the ground up using modern .NET Core technology. It leverages the revolutionary new Blazor component model to create a <b>fully dynamic</b> web development experience which can be executed on a client or server. Whether you are looking for a platform to <b>accelerate your web development</b> efforts, or simply interested in exploring the anatomy of a large-scale Blazor application, Oqtane provides a solid foundation based on proven enterprise architectural principles.</p>" +
|
||||
"<p align=\"center\"><a href=\"https://www.oqtane.org\" target=\"_new\"><img src=\"oqtane.png\"></a><br /><br /><a class=\"btn btn-primary\" href=\"https://www.oqtane.org/Community\" target=\"_new\">Join Our Community</a> <a class=\"btn btn-primary\" href=\"https://github.com/oqtane/oqtane.framework\" target=\"_new\">Clone Our Repo</a><br /><br /></p>" +
|
||||
"<p><a href=\"https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor\" target=\"_new\">Blazor</a> is a single-page app framework that lets you build interactive web applications using C# instead of JavaScript. Client-side Blazor relies on WebAssembly, an open web standard that does not require plugins or code transpilation in order to run natively in a web browser. Server-side Blazor uses SignalR to host your application on a web server and provide a responsive and robust debugging experience. Blazor applications works in all modern web browsers, including mobile browsers.</p>" +
|
||||
"<p>Blazor is a feature of <a href=\"https://dotnet.microsoft.com/apps/aspnet\" target=\"_new\">ASP.NET Core 3.0</a>, the popular cross platform web development framework from Microsoft that extends the <a href=\"https://dotnet.microsoft.com/learn/dotnet/what-is-dotnet\" target=\"_new\" >.NET developer platform</a> with tools and libraries for building web apps.</p>"
|
||||
"<p>Blazor is a feature of <a href=\"https://dotnet.microsoft.com/apps/aspnet\" target=\"_new\">ASP.NET Core 3</a>, the popular cross platform web development framework from Microsoft that extends the <a href=\"https://dotnet.microsoft.com/learn/dotnet/what-is-dotnet\" target=\"_new\" >.NET developer platform</a> with tools and libraries for building web apps.</p>"
|
||||
},
|
||||
new PageTemplateModule { ModuleDefinitionName = "Oqtane.Modules.HtmlText, Oqtane.Client", Title = "MIT License", Pane = "Content", ModulePermissions = "[{\"PermissionName\":\"View\",\"Permissions\":\"All Users;Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]",
|
||||
Content = "<p>Copyright (c) 2019 .NET Foundation</p>" +
|
||||
@ -168,6 +172,15 @@ namespace Oqtane.Repository
|
||||
ProfileRepository.AddProfile(new Profile { SiteId = site.SiteId, Name = "PostalCode", Title = "Postal Code", Description = "Postal Code Or Zip Code", Category = "Address", ViewOrder = 7, MaxLength = 50, DefaultValue = "", IsRequired = false, IsPrivate = false });
|
||||
ProfileRepository.AddProfile(new Profile { SiteId = site.SiteId, Name = "Phone", Title = "Phone Number", Description = "Phone Number", Category = "Contact", ViewOrder = 8, MaxLength = 50, DefaultValue = "", IsRequired = false, IsPrivate = false });
|
||||
|
||||
Folder folder = FolderRepository.AddFolder(new Folder { SiteId = site.SiteId, ParentId = null, Name = "Root", Path = "", Order = 1, IsSystem = true, Permissions = "[{\"PermissionName\":\"Browse\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"View\",\"Permissions\":\"All Users\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]" });
|
||||
FolderRepository.AddFolder(new Folder { SiteId = site.SiteId, ParentId = folder.FolderId, Name = "Users", Path = "Users\\", Order = 1, IsSystem = true, Permissions = "[{\"PermissionName\":\"Browse\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"View\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]" });
|
||||
if (site.Name == "Default Site")
|
||||
{
|
||||
File file = FileRepository.AddFile(new File { FolderId = folder.FolderId, Name = "logo.png", Extension = "png", Size = 8192 });
|
||||
site.LogoFileId = file.FileId;
|
||||
UpdateSite(site);
|
||||
}
|
||||
|
||||
List<ModuleDefinition> moduledefinitions = ModuleDefinitionRepository.GetModuleDefinitions(site.SiteId).ToList();
|
||||
foreach (PageTemplate pagetemplate in SiteTemplate)
|
||||
{
|
||||
|
@ -8,7 +8,7 @@ CREATE TABLE [dbo].[Site](
|
||||
[SiteId] [int] IDENTITY(1,1) NOT NULL,
|
||||
[TenantId] [int] NOT NULL,
|
||||
[Name] [nvarchar](200) NOT NULL,
|
||||
[Logo] [nvarchar](50) NOT NULL,
|
||||
[LogoFileId] [int] NULL,
|
||||
[DefaultThemeType] [nvarchar](200) NOT NULL,
|
||||
[DefaultLayoutType] [nvarchar](200) NOT NULL,
|
||||
[DefaultContainerType] [nvarchar](200) NOT NULL,
|
||||
@ -96,6 +96,9 @@ CREATE TABLE [dbo].[User](
|
||||
[Username] [nvarchar](256) NOT NULL,
|
||||
[DisplayName] [nvarchar](50) NOT NULL,
|
||||
[Email] [nvarchar](256) NOT NULL,
|
||||
[PhotoFileId] [int] NULL,
|
||||
[LastLoginOn] [datetime] NULL,
|
||||
[LastIPAddress] [nvarchar](50) NOT NULL,
|
||||
[CreatedBy] [nvarchar](256) NOT NULL,
|
||||
[CreatedOn] [datetime] NOT NULL,
|
||||
[ModifiedBy] [nvarchar](256) NOT NULL,
|
||||
@ -261,6 +264,7 @@ CREATE TABLE [dbo].[Folder](
|
||||
[Name] [nvarchar](50) NOT NULL,
|
||||
[ParentId] [int] NULL,
|
||||
[Order] [int] NOT NULL,
|
||||
[IsSystem] [bit] NOT NULL,
|
||||
[CreatedBy] [nvarchar](256) NOT NULL,
|
||||
[CreatedOn] [datetime] NOT NULL,
|
||||
[ModifiedBy] [nvarchar](256) NOT NULL,
|
||||
@ -278,7 +282,9 @@ GO
|
||||
CREATE TABLE [dbo].[File](
|
||||
[FileId] [int] IDENTITY(1,1) NOT NULL,
|
||||
[FolderId] [int] NOT NULL,
|
||||
[Name] [nvarchar](50) NOT NULL,
|
||||
[Name] [nvarchar](250) NOT NULL,
|
||||
[Extension] [nvarchar](50) NOT NULL,
|
||||
[Size] [int] NOT NULL,
|
||||
[CreatedBy] [nvarchar](256) NOT NULL,
|
||||
[CreatedOn] [datetime] NOT NULL,
|
||||
[ModifiedBy] [nvarchar](256) NOT NULL,
|
||||
|
@ -139,7 +139,7 @@ GO
|
||||
SET IDENTITY_INSERT [dbo].[Job] ON
|
||||
GO
|
||||
INSERT [dbo].[Job] ([JobId], [Name], [JobType], [Frequency], [Interval], [StartDate], [EndDate], [IsEnabled], [IsStarted], [IsExecuting], [NextExecution], [RetentionHistory], [CreatedBy], [CreatedOn], [ModifiedBy], [ModifiedOn])
|
||||
VALUES (1, N'Notification Job', N'Oqtane.Infrastructure.NotificationJob, Oqtane.Server', N'm', 1, null, null, 1, 0, 0, null, 10, '', getdate(), '', getdate())
|
||||
VALUES (1, N'Notification Job', N'Oqtane.Infrastructure.NotificationJob, Oqtane.Server', N'm', 1, null, null, 0, 0, 0, null, 10, '', getdate(), '', getdate())
|
||||
GO
|
||||
SET IDENTITY_INSERT [dbo].[Job] OFF
|
||||
GO
|
||||
|
@ -82,6 +82,9 @@ namespace Oqtane.Server
|
||||
options.AddPolicy("EditPage", policy => policy.Requirements.Add(new PermissionRequirement("Page", "Edit")));
|
||||
options.AddPolicy("ViewModule", policy => policy.Requirements.Add(new PermissionRequirement("Module", "View")));
|
||||
options.AddPolicy("EditModule", policy => policy.Requirements.Add(new PermissionRequirement("Module", "Edit")));
|
||||
options.AddPolicy("ViewFolder", policy => policy.Requirements.Add(new PermissionRequirement("Folder", "View")));
|
||||
options.AddPolicy("EditFolder", policy => policy.Requirements.Add(new PermissionRequirement("Folder", "Edit")));
|
||||
options.AddPolicy("ListFolder", policy => policy.Requirements.Add(new PermissionRequirement("Folder", "List")));
|
||||
});
|
||||
|
||||
// register scoped core services
|
||||
@ -101,12 +104,13 @@ namespace Oqtane.Server
|
||||
services.AddScoped<IRoleService, RoleService>();
|
||||
services.AddScoped<IUserRoleService, UserRoleService>();
|
||||
services.AddScoped<ISettingService, SettingService>();
|
||||
services.AddScoped<IFileService, FileService>();
|
||||
services.AddScoped<IPackageService, PackageService>();
|
||||
services.AddScoped<ILogService, LogService>();
|
||||
services.AddScoped<IJobService, JobService>();
|
||||
services.AddScoped<IJobLogService, JobLogService>();
|
||||
services.AddScoped<INotificationService, NotificationService>();
|
||||
services.AddScoped<IFolderService, FolderService>();
|
||||
services.AddScoped<IFileService, FileService>();
|
||||
|
||||
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
||||
|
||||
@ -181,6 +185,8 @@ namespace Oqtane.Server
|
||||
services.AddTransient<IJobRepository, JobRepository>();
|
||||
services.AddTransient<IJobLogRepository, JobLogRepository>();
|
||||
services.AddTransient<INotificationRepository, NotificationRepository>();
|
||||
services.AddTransient<IFolderRepository, FolderRepository>();
|
||||
services.AddTransient<IFileRepository, FileRepository>();
|
||||
|
||||
services.AddOqtaneModules();
|
||||
services.AddOqtaneThemes();
|
||||
@ -329,6 +335,8 @@ namespace Oqtane.Server
|
||||
services.AddTransient<IJobRepository, JobRepository>();
|
||||
services.AddTransient<IJobLogRepository, JobLogRepository>();
|
||||
services.AddTransient<INotificationRepository, NotificationRepository>();
|
||||
services.AddTransient<IFolderRepository, FolderRepository>();
|
||||
services.AddTransient<IFileRepository, FileRepository>();
|
||||
|
||||
services.AddOqtaneModules();
|
||||
services.AddOqtaneThemes();
|
||||
|
@ -62,9 +62,9 @@ window.interop = {
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
},
|
||||
getFiles: function (name) {
|
||||
getFiles: function (id) {
|
||||
var files = [];
|
||||
var fileinput = document.getElementById(name);
|
||||
var fileinput = document.getElementById(id);
|
||||
if (fileinput !== null) {
|
||||
for (var i = 0; i < fileinput.files.length; i++) {
|
||||
files.push(fileinput.files[i].name);
|
||||
@ -72,10 +72,10 @@ window.interop = {
|
||||
}
|
||||
return files;
|
||||
},
|
||||
uploadFiles: function (posturl, folder, name) {
|
||||
var files = document.getElementById(name + 'FileInput').files;
|
||||
var progressinfo = document.getElementById(name + 'ProgressInfo');
|
||||
var progressbar = document.getElementById(name + 'ProgressBar');
|
||||
uploadFiles: function (posturl, folder, id) {
|
||||
var files = document.getElementById(id + 'FileInput').files;
|
||||
var progressinfo = document.getElementById(id + 'ProgressInfo');
|
||||
var progressbar = document.getElementById(id + 'ProgressBar');
|
||||
var filename = '';
|
||||
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
|
Reference in New Issue
Block a user