From f2d2d3f28b194a52be2cb6d6e53e0a390a4c9593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zieli=C5=84ski?= Date: Thu, 22 Dec 2022 15:12:19 +0100 Subject: [PATCH] Export DataSet to GoogleSheet --- Frontend/src/app/models/dataSet.model.ts | 51 +++++++++++-------- .../data-set-detail.component.html | 2 + .../data-set-detail.component.ts | 11 +++- WebAPI/Controllers/DataSetsController.cs | 20 +++++++- WebAPI/Exports/googleSheet.export.cs | 50 ++++++++++++++++++ WebAPI/GoogleDriveHelper.cs | 35 +++++++++++++ WebAPI/Program.cs | 1 + WebAPI/WebAPI.csproj | 1 + 8 files changed, 149 insertions(+), 22 deletions(-) create mode 100644 WebAPI/Exports/googleSheet.export.cs create mode 100644 WebAPI/GoogleDriveHelper.cs diff --git a/Frontend/src/app/models/dataSet.model.ts b/Frontend/src/app/models/dataSet.model.ts index 484229b..eef4740 100644 --- a/Frontend/src/app/models/dataSet.model.ts +++ b/Frontend/src/app/models/dataSet.model.ts @@ -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 { return new Promise((resolve, reject) => { - _http.post(`${environment.api.url}/datasets`, {...input.serialize(), }).subscribe({ + _http.post(`${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(`${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 { @@ -83,20 +83,31 @@ export class DataSet extends Base { formData.append(file.name, file); return new Promise((resolve, reject) => { _http.post(`${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 { return new Promise((resolve, reject) => { _http.get(`${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 { + return new Promise((resolve, reject) => { + _http.get(`${environment.api.url}/datasets/exportToGoogleSheet/${id}`, + ).subscribe({ next: (data) => { resolve(data); }, diff --git a/Frontend/src/app/modules/data-sets/data-set-detail/data-set-detail.component.html b/Frontend/src/app/modules/data-sets/data-set-detail/data-set-detail.component.html index 0689999..5fc74ef 100644 --- a/Frontend/src/app/modules/data-sets/data-set-detail/data-set-detail.component.html +++ b/Frontend/src/app/modules/data-sets/data-set-detail/data-set-detail.component.html @@ -3,6 +3,8 @@ Szczegóły warstwy danych + + diff --git a/Frontend/src/app/modules/data-sets/data-set-detail/data-set-detail.component.ts b/Frontend/src/app/modules/data-sets/data-set-detail/data-set-detail.component.ts index 5436f28..799e659 100644 --- a/Frontend/src/app/modules/data-sets/data-set-detail/data-set-detail.component.ts +++ b/Frontend/src/app/modules/data-sets/data-set-detail/data-set-detail.component.ts @@ -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"); + } + } } diff --git a/WebAPI/Controllers/DataSetsController.cs b/WebAPI/Controllers/DataSetsController.cs index 666ed17..2bf3147 100644 --- a/WebAPI/Controllers/DataSetsController.cs +++ b/WebAPI/Controllers/DataSetsController.cs @@ -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) diff --git a/WebAPI/Exports/googleSheet.export.cs b/WebAPI/Exports/googleSheet.export.cs new file mode 100644 index 0000000..21983df --- /dev/null +++ b/WebAPI/Exports/googleSheet.export.cs @@ -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> data = new List>() { new List() { dataSet.Name, dataSet.Number } }; + foreach (DataRow dataRow in dataSet.DataRows) + { + data.Add(new List { 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 { "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()); + } + } + } +} diff --git a/WebAPI/GoogleDriveHelper.cs b/WebAPI/GoogleDriveHelper.cs new file mode 100644 index 0000000..0521e25 --- /dev/null +++ b/WebAPI/GoogleDriveHelper.cs @@ -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; + } + } +} diff --git a/WebAPI/Program.cs b/WebAPI/Program.cs index b2580d3..d899307 100644 --- a/WebAPI/Program.cs +++ b/WebAPI/Program.cs @@ -54,6 +54,7 @@ builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddSingleton(typeof(GoogleSheetsHelper)); +builder.Services.AddSingleton(typeof(GoogleDriveHelper)); var app = builder.Build(); diff --git a/WebAPI/WebAPI.csproj b/WebAPI/WebAPI.csproj index a962f28..6e91ac7 100644 --- a/WebAPI/WebAPI.csproj +++ b/WebAPI/WebAPI.csproj @@ -9,6 +9,7 @@ +