Skip to content

Commit 77dff88

Browse files
DedSec256YuriUfimtsev
authored andcommitted
wip
wip feat: add Excel file Generate method; add tests refactor: make corrections feat: implement report uploading to google docs docs: add comments to the code refactor: create Google and Yandex services refactor tests feat: add requests to the Google Service fix: support of export to google docs fix: implement support of native file upload, change httpRequests types feat: simple yandex support is implemented refactor frontend part refactor frontend part
1 parent c76ed48 commit 77dff88

File tree

25 files changed

+1964
-172
lines changed

25 files changed

+1964
-172
lines changed

.run/StartAll.run.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
<toRun name="HwProj.CoursesService.API" type="LaunchSettings" />
66
<toRun name="HwProj.NotificationsService.API" type="LaunchSettings" />
77
<toRun name="HwProj.SolutionsService.API" type="LaunchSettings" />
8-
<toRun name="start" type="js.build_tools.npm" />
98
<method v="2" />
109
</configuration>
1110
</component>
Lines changed: 79 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using System;
2-
using System.Linq;
1+
using System.Linq;
32
using System.Net;
4-
using System.Text.RegularExpressions;
53
using System.Threading.Tasks;
6-
using Google.Apis.Sheets.v4;
4+
using HwProj.APIGateway.API.ExportServices;
75
using HwProj.APIGateway.API.Models;
6+
using HwProj.APIGateway.API.TableGenerators;
87
using HwProj.AuthService.Client;
8+
using HwProj.CoursesService.Client;
99
using HwProj.Models.Result;
1010
using HwProj.SolutionsService.Client;
1111
using Microsoft.AspNetCore.Mvc;
@@ -17,58 +17,103 @@ namespace HwProj.APIGateway.API.Controllers
1717
public class StatisticsController : AggregationController
1818
{
1919
private readonly ISolutionsServiceClient _solutionClient;
20-
private readonly SheetsService _sheetsService;
20+
private readonly ICoursesServiceClient _coursesClient;
21+
private readonly GoogleService _googleService;
2122

22-
public StatisticsController(ISolutionsServiceClient solutionClient, IAuthServiceClient authServiceClient,
23-
SheetsService sheetsService) :
24-
base(authServiceClient)
23+
public StatisticsController(
24+
ISolutionsServiceClient solutionClient,
25+
ICoursesServiceClient coursesServiceClient,
26+
IAuthServiceClient authServiceClient,
27+
GoogleService googleService)
28+
: base(authServiceClient)
2529
{
2630
_solutionClient = solutionClient;
27-
_sheetsService = sheetsService;
31+
_coursesClient = coursesServiceClient;
32+
_googleService = googleService;
2833
}
2934

3035
[HttpGet("{courseId}")]
3136
[ProducesResponseType(typeof(StatisticsCourseMatesModel[]), (int)HttpStatusCode.OK)]
3237
public async Task<IActionResult> GetCourseStatistics(long courseId)
38+
{
39+
var result = await GetStatistics(courseId);
40+
if (result == null)
41+
{
42+
return Forbid();
43+
}
44+
45+
return Ok(result);
46+
}
47+
48+
private async Task<IOrderedEnumerable<StatisticsCourseMatesModel>?> GetStatistics(long courseId)
3349
{
3450
var statistics = await _solutionClient.GetCourseStatistics(courseId, UserId);
35-
if (statistics == null) return Forbid();
51+
if (statistics == null) return null;
3652

3753
var studentIds = statistics.Select(t => t.StudentId).ToArray();
3854
var students = await AuthServiceClient.GetAccountsData(studentIds);
3955

40-
var result = statistics.Zip(students, (stats, student) => new StatisticsCourseMatesModel
41-
{
42-
Id = student.UserId,
43-
Name = student.Name,
44-
Surname = student.Surname,
45-
Homeworks = stats.Homeworks
46-
}).OrderBy(t => t.Surname).ThenBy(t => t.Name);
56+
var result
57+
= statistics.Zip(students, (stats, student)
58+
=> new StatisticsCourseMatesModel
59+
{
60+
Id = student.UserId,
61+
Name = student.Name,
62+
Surname = student.Surname,
63+
Homeworks = stats.Homeworks
64+
}).OrderBy(t => t.Surname).ThenBy(t => t.Name);
4765

48-
return Ok(result);
66+
return result;
4967
}
5068

51-
public class SheetUrl
69+
/// <summary>
70+
/// Implements file download.
71+
/// </summary>
72+
/// <param name="courseId">The course Id the report is based on.</param>
73+
/// <param name="userId">Id of the user requesting the report.</param>
74+
/// <param name="sheetName">Name of the sheet on which the report will be generated.</param>
75+
/// <returns>File download process.</returns>
76+
[HttpGet("getFile")]
77+
public async Task<IActionResult> GetFile(long courseId, string userId, string sheetName)
5278
{
53-
public string Url { get; set; }
79+
var course = await _coursesClient.GetCourseById(courseId, userId);
80+
var statistics = await GetStatistics(courseId);
81+
if (statistics == null || course == null) return Forbid();
82+
83+
var statisticStream =
84+
await ExcelGenerator.Generate(statistics.ToList(), course, sheetName).GetAsByteArrayAsync();
85+
return new FileContentResult(statisticStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
5486
}
5587

56-
[HttpPost("getSheetTitles")]
57-
public async Task<Result<string[]>> GetSheetTitles([FromBody] SheetUrl sheetUrl)
88+
[HttpGet("getSheetTitles")]
89+
public async Task<Result<string[]>> GetSheetTitles(string sheetUrl)
90+
=> await _googleService.GetSheetTitles(sheetUrl);
91+
92+
[HttpPost("processLink")]
93+
public Result ProcessLink(string? sheetUrl)
5894
{
59-
var match = Regex.Match(sheetUrl.Url, "https://docs\\.google\\.com/spreadsheets/d/(?<id>.+)/");
60-
if (!match.Success) return Result<string[]>.Failed("Некорректная ссылка на страницу Google Docs");
95+
if (sheetUrl == null) return Result.Failed("Некорректная ссылка");
96+
if (GoogleService.ParseLink(sheetUrl).Succeeded) return Result.Success();
97+
return Result.Failed("Некорректная ссылка");
98+
}
6199

62-
var spreadsheetId = match.Groups["id"].Value;
63-
try
64-
{
65-
var sheet = await _sheetsService.Spreadsheets.Get(spreadsheetId).ExecuteAsync();
66-
return Result<string[]>.Success(sheet.Sheets.Select(t => t.Properties.Title).ToArray());
67-
}
68-
catch (Exception ex)
69-
{
70-
return Result<string[]>.Failed($"Ошибка при обращении к Google Docs: {ex.Message}");
71-
}
100+
/// <summary>
101+
/// Implements sending a report to the Google Sheets.
102+
/// </summary>
103+
/// <param name="courseId">The course Id the report is based on.</param>
104+
/// <param name="userId">Id of the user requesting the report.</param>
105+
/// <param name="sheetUrl">Sheet Url parameter, required to make requests to the Google Sheets.</param>
106+
/// <param name="sheetName">Sheet Name parameter, required to make requests to the Google Sheets.</param>
107+
/// <returns>Operation status.</returns>
108+
[HttpGet("exportToSheet")]
109+
public async Task<Result> ExportToGoogleSheets(
110+
long courseId, string userId, string sheetUrl, string sheetName)
111+
{
112+
var course = await _coursesClient.GetCourseById(courseId, userId);
113+
var statistics = await GetStatistics(courseId);
114+
if (course == null || statistics == null) return Result.Failed("Ошибка при получении статистики");
115+
var result = await _googleService.Export(course, statistics, sheetUrl, sheetName);
116+
return result;
72117
}
73118
}
74119
}

0 commit comments

Comments
 (0)