8524631508
- Replaced console app with .NET 8 Blazor Server architecture - Added EF Core SQLite database (trafag_exporter.db) with auto-seed data - Models: HanaServer, Site, SharePointConfig, ExportSettings, ExportLog, SalesRecord - Services: HanaQueryService (with configurable dateFilter), ExcelExportService, SharePointUploadService, ExportOrchestrationService (with live status events), TimerBackgroundService (scheduled daily export) - MudBlazor UI pages: Dashboard (export status + manual trigger), Standorte (HANA server + site CRUD), Settings (SharePoint + timer config), Logs (filtered view) - SAP HANA queries unchanged (INV + CRN with exact SAP B1 table joins) - SharePoint upload via Microsoft Graph with app registration auth https://claude.ai/code/session_012heAXNMbbyxqYf2S2HrKLj
46 lines
1.9 KiB
C#
46 lines
1.9 KiB
C#
using Azure.Identity;
|
|
using Microsoft.Graph;
|
|
|
|
namespace TrafagSalesExporter.Services;
|
|
|
|
public class SharePointUploadService
|
|
{
|
|
public async Task UploadAsync(string tenantId, string clientId, string clientSecret,
|
|
string siteUrl, string exportFolder, string land, string localFilePath)
|
|
{
|
|
var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
|
|
var graphClient = new GraphServiceClient(credential, ["https://graph.microsoft.com/.default"]);
|
|
|
|
var uri = new Uri(siteUrl);
|
|
var sitePath = uri.AbsolutePath;
|
|
var site = await graphClient.Sites[$"{uri.Host}:{sitePath}"].GetAsync();
|
|
|
|
if (site?.Id is null)
|
|
throw new InvalidOperationException("SharePoint Site konnte nicht gefunden werden.");
|
|
|
|
var drive = await graphClient.Sites[site.Id].Drive.GetAsync();
|
|
if (drive?.Id is null)
|
|
throw new InvalidOperationException("SharePoint Dokumentenbibliothek konnte nicht gefunden werden.");
|
|
|
|
var fileName = Path.GetFileName(localFilePath);
|
|
var folderPath = exportFolder.Trim('/').Trim();
|
|
var remotePath = $"{folderPath}/{land}/{fileName}";
|
|
|
|
await using var stream = File.OpenRead(localFilePath);
|
|
await graphClient.Drives[drive.Id].Root.ItemWithPath(remotePath).Content.PutAsync(stream);
|
|
}
|
|
|
|
public async Task TestConnectionAsync(string tenantId, string clientId, string clientSecret, string siteUrl)
|
|
{
|
|
var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
|
|
var graphClient = new GraphServiceClient(credential, ["https://graph.microsoft.com/.default"]);
|
|
|
|
var uri = new Uri(siteUrl);
|
|
var sitePath = uri.AbsolutePath;
|
|
var site = await graphClient.Sites[$"{uri.Host}:{sitePath}"].GetAsync();
|
|
|
|
if (site?.Id is null)
|
|
throw new InvalidOperationException("SharePoint Site konnte nicht gefunden werden.");
|
|
}
|
|
}
|