using Masuit.MyBlogs.Core.Extensions.DriveHelpers;
using Masuit.MyBlogs.Core.Models.Drive;
using Microsoft.Identity.Client;
namespace Masuit.MyBlogs.Core.Infrastructure.Drive
{
public class DriveAccountService : IDriveAccountService
{
private readonly IConfidentialClientApplication _app;
public DriveContext SiteContext { get; set; }
///
/// Graph实例
///
///
public Microsoft.Graph.GraphServiceClient Graph { get; set; }
public DriveAccountService(DriveContext siteContext, TokenService tokenService)
{
SiteContext = siteContext;
_app = tokenService.app;
Graph = tokenService.Graph;
}
///
/// 返回 Oauth 验证url
///
///
public async Task GetAuthorizationRequestUrl()
{
var redirectUrl = await _app.GetAuthorizationRequestUrl(OneDriveConfiguration.Scopes).ExecuteAsync();
return redirectUrl.AbsoluteUri;
}
///
/// 添加 SharePoint Site-ID 到数据库
///
///
///
///
public async Task AddSiteId(string siteName, string nickName)
{
Site site = new();
//使用 Onedrive
if (siteName == "onedrive")
{
site.Name = siteName;
site.NickName = nickName;
}
else
{
using var httpClient = new HttpClient
{
Timeout = TimeSpan.FromSeconds(20)
};
var apiCaller = new ProtectedApiCallHelper(httpClient);
await apiCaller.CallWebApiAndProcessResultASync($"{OneDriveConfiguration.GraphApi}/v1.0/sites/{OneDriveConfiguration.DominName}:/sites/{siteName}", GetToken(), result =>
{
site.SiteId = result.Properties().Single((prop) => prop.Name == "id").Value.ToString();
site.Name = result.Properties().Single((prop) => prop.Name == "name").Value.ToString();
site.NickName = nickName;
});
}
if (!SiteContext.Sites.Any(s => s.SiteId == site.SiteId))
{
//若是首次添加则设置为默认的驱动器
using (var setting = new SettingService(new DriveContext()))
{
if (!SiteContext.Sites.Any())
{
await setting.Set("DefaultDrive", site.Name);
}
}
await SiteContext.Sites.AddAsync(site);
await SiteContext.SaveChangesAsync();
}
else
{
throw new Exception("站点已被创建");
}
}
public List GetSites()
{
return SiteContext.Sites.ToList();
}
///
/// 获取 Drive Info
///
///
public async Task> GetDriveInfo()
{
var drivesInfo = new List();
foreach (var item in SiteContext.Sites.ToArray())
{
Microsoft.Graph.Drive drive;
//Onedrive
if (string.IsNullOrEmpty(item.SiteId))
{
drive = await Graph.Me.Drive.Request().GetAsync();
}
else
{
drive = await Graph.Sites[item.SiteId].Drive.Request().GetAsync();
}
drivesInfo.Add(new DriveInfo()
{
Quota = drive.Quota,
NickName = item.NickName,
Name = item.Name,
HiddenFolders = item.HiddenFolders
});
}
return drivesInfo;
}
public async Task Unbind(string nickName)
{
SiteContext.Sites.Remove(SiteContext.Sites.Single(site => site.NickName == nickName));
await SiteContext.SaveChangesAsync();
}
///
/// 获取 Token
///
///
public string GetToken()
{
return _app.AcquireTokenSilent(OneDriveConfiguration.Scopes, OneDriveConfiguration.AccountName).ExecuteAsync().Result.AccessToken;
}
public class DriveInfo
{
public Microsoft.Graph.Quota Quota { get; set; }
public string NickName { get; set; }
public string Name { get; set; }
public string[] HiddenFolders { get; set; }
}
}
}