Export DataSet to GoogleSheet

This commit is contained in:
2022-12-22 15:12:19 +01:00
parent c7b907da7c
commit f2d2d3f28b
8 changed files with 149 additions and 22 deletions

View File

@@ -7,7 +7,7 @@ import { DataRow } from './dataRow.model copy';
export class DataSet extends Base {
number?: Number;
source?: string;
source?: string;
name?: string;
dataRows: DataRow[] = [];
@@ -15,7 +15,7 @@ export class DataSet extends Base {
super();
Object.assign(this, data);
}
override deserialize(input: any): this {
override deserialize(input: any): this {
Object.assign(this, Object.assign(this, super.deserialize(input)));
if (this.dataRows) { this.dataRows = this.dataRows.map(x => new DataRow().deserialize(x)); }
return this;
@@ -34,7 +34,7 @@ export class DataSet extends Base {
modifiedAt: '',
createdBy: '',
modifiedBy: '',
});
});
}
fillForm(form: UntypedFormGroup) {
form.patchValue(this);
@@ -53,21 +53,21 @@ export class DataSet extends Base {
//API Actions
static add(input: DataSet, _http: HttpClient): Promise<string> {
return new Promise((resolve, reject) => {
_http.post<string>(`${environment.api.url}/datasets`, {...input.serialize(), }).subscribe({
_http.post<string>(`${environment.api.url}/datasets`, { ...input.serialize(), }).subscribe({
next: (data) => resolve(data),
error: (e) => reject(e)
}
error: (e) => reject(e)
}
);
});
}
static getList(_http: HttpClient): any {
return new Promise((resolve, reject) => {
_http.get<DataSet[]>(`${environment.api.url}/datasets`)
.pipe(map(data => data.map(x => new DataSet().deserialize(x))))
.subscribe({
next: (data) => resolve(data),
error: (e) => reject(e)
})
.pipe(map(data => data.map(x => new DataSet().deserialize(x))))
.subscribe({
next: (data) => resolve(data),
error: (e) => reject(e)
})
});
}
static getById(id: string, _http: HttpClient): Promise<DataSet> {
@@ -83,20 +83,31 @@ export class DataSet extends Base {
formData.append(file.name, file);
return new Promise((resolve, reject) => {
_http.post<DataRow[]>(`${environment.api.url}/datasets/parseFile`, formData,
).pipe(map(data => data.map(x => new DataRow().deserialize(x))))
.subscribe({
next: (data) => {
resolve(data);
},
error: (e) => reject(e)
})
).pipe(map(data => data.map(x => new DataRow().deserialize(x))))
.subscribe({
next: (data) => {
resolve(data);
},
error: (e) => reject(e)
})
})
}
static parseGoogleSheet(sheetId: string, _http: HttpClient): Promise<DataRow[]> {
return new Promise((resolve, reject) => {
_http.get<DataRow[]>(`${environment.api.url}/datasets/parseGoogleSheet/${sheetId}`,
).pipe(map(data => data.map(x => new DataRow().deserialize(x))))
.subscribe({
).pipe(map(data => data.map(x => new DataRow().deserialize(x))))
.subscribe({
next: (data) => {
resolve(data);
},
error: (e) => reject(e)
})
})
}
static exportToGoogleSheet(id: string, _http: HttpClient): Promise<boolean> {
return new Promise((resolve, reject) => {
_http.get<boolean>(`${environment.api.url}/datasets/exportToGoogleSheet/${id}`,
).subscribe({
next: (data) => {
resolve(data);
},

View File

@@ -3,6 +3,8 @@
<mat-card appearance="outlined">
<mat-toolbar color="secondary">
Szczegóły warstwy danych
<span class="fill-to-right"></span>
<button mat-button (click)="export()">Eksportuj do Google</button>
</mat-toolbar>
<mat-card-content>
<mat-grid-list cols="2" rowHeight="90px">

View File

@@ -3,6 +3,7 @@ import { HttpClient } from '@angular/common/http';
import { Component, ViewChild } from '@angular/core';
import { UntypedFormGroup, UntypedFormBuilder } from '@angular/forms';
import { MatPaginator } from '@angular/material/paginator';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MatSort } from '@angular/material/sort';
import { MatTableDataSource } from '@angular/material/table';
import { Router, ActivatedRoute } from '@angular/router';
@@ -32,7 +33,8 @@ export class DataSetDetailComponent {
private router$: Router,
private http$: HttpClient,
private route$: ActivatedRoute,
private auth$: AuthService
private auth$: AuthService,
private snackBar: MatSnackBar
) { }
async ngOnInit() {
@@ -50,4 +52,11 @@ export class DataSetDetailComponent {
trackByUid(index : number, item : DataRow) {
return item.id;
}
async export() {
if (await DataSet.exportToGoogleSheet(this.document.id || "", this.http$)) {
this.snackBar.open("Plik został zapisany na dysku Google", "OK");
} else {
this.snackBar.open("Zapis się nie udał.", "OK");
}
}
}

View File

@@ -12,6 +12,7 @@ using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using WebAPI.dataParsers;
using WebAPI.Exports;
using WebAPI.Models;
namespace WebAPI.Controllers
@@ -23,9 +24,14 @@ namespace WebAPI.Controllers
{
private readonly AppDbContext db;
private SpreadsheetsResource.ValuesResource googleSheetValues;
public DataSetsController(AppDbContext _db, GoogleSheetsHelper _googleSheetsHelper) {
private GoogleDriveHelper googleDriveHelper;
public DataSetsController(
AppDbContext _db,
GoogleSheetsHelper _googleSheetsHelper,
GoogleDriveHelper _googleDriveHelper) {
db = _db;
googleSheetValues = _googleSheetsHelper.Service.Spreadsheets.Values;
googleDriveHelper = _googleDriveHelper;
}
[HttpGet]
@@ -85,6 +91,18 @@ namespace WebAPI.Controllers
var parser = new csvParser();
return Ok(parser.parse(Request.Form.Files[0]));
}
[HttpGet]
[Route("exportToGoogleSheet/{id}")]
public IActionResult ExportToGoogleSheet(Guid id)
{
DataSet dataSet = db.DataSets
.Include(x => x.DataRows)
.Where(x => x.Id == id && !x.IsDeleted).First();
var export = new googleSheetExport(googleDriveHelper, googleSheetValues);
export.export(dataSet);
return Ok(true);
}
//
private DataSet AddDataSet(DataSet input, Guid currentUserId)

View File

@@ -0,0 +1,50 @@
using Google.Apis.Drive.v3.Data;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using WebAPI.Models;
using static Google.Apis.Drive.v3.FilesResource;
namespace WebAPI.Exports
{
public class googleSheetExport
{
private GoogleDriveHelper googleDriveHelper;
private SpreadsheetsResource.ValuesResource googleSheetValues;
public googleSheetExport(GoogleDriveHelper _googleDriveHelper, SpreadsheetsResource.ValuesResource _googleSheetValues)
{
googleDriveHelper = _googleDriveHelper;
googleSheetValues = _googleSheetValues;
}
public void export(DataSet dataSet)
{
try
{
List<IList<object>> data = new List<IList<object>>() { new List<object>() { dataSet.Name, dataSet.Number } };
foreach (DataRow dataRow in dataSet.DataRows)
{
data.Add(new List<object> { dataRow.Code, dataRow.Value });
}
Google.Apis.Drive.v3.Data.File body = new Google.Apis.Drive.v3.Data.File();
body.Name = $"export-{DateTime.Now}";
body.MimeType = "application/vnd.google-apps.spreadsheet";
body.Parents = new List<string> { "1Sar-9ux6GWlXKZiD-l1Mfh1gdsxZif3j" };
CreateRequest request = googleDriveHelper.Service.Files.Create(body);
var file = request.Execute();
string sheetId = file.Id;
var range = $"Sheet1!A1:B${data.Count}";
ValueRange valueRange = new ValueRange() { Values = data};
var updateRequest = googleSheetValues.Update(valueRange, sheetId, range);
updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
updateRequest.Execute();
} catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
}

View File

@@ -0,0 +1,35 @@
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;
namespace WebAPI
{
public class GoogleDriveHelper
{
public DriveService Service { get; set; }
const string APPLICATION_NAME = "Diuna";
static readonly string[] Scopes = { DriveService.Scope.Drive };
public GoogleDriveHelper()
{
InitializeService();
}
private void InitializeService()
{
var credential = GetCredentialsFromFile();
Service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = APPLICATION_NAME
});
}
private GoogleCredential GetCredentialsFromFile()
{
GoogleCredential credential;
using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream).CreateScoped(Scopes);
}
return credential;
}
}
}

View File

@@ -54,6 +54,7 @@ builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddSingleton(typeof(GoogleSheetsHelper));
builder.Services.AddSingleton(typeof(GoogleDriveHelper));
var app = builder.Build();

View File

@@ -9,6 +9,7 @@
<ItemGroup>
<PackageReference Include="CsvHelper" Version="30.0.1" />
<PackageReference Include="Google.Apis.Auth" Version="1.58.0" />
<PackageReference Include="Google.Apis.Drive.v3" Version="1.58.0.2859" />
<PackageReference Include="Google.Apis.Sheets.v4" Version="1.58.0.2826" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0" />