Skip to content

Commit f1b0325

Browse files
committed
wip
1 parent d0fccec commit f1b0325

3 files changed

Lines changed: 84 additions & 21 deletions

File tree

HwProj.APIGateway/HwProj.APIGateway.API/Controllers/StatisticsController.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Google.Apis.Sheets.v4;
77
using HwProj.APIGateway.API.Models;
88
using HwProj.AuthService.Client;
9+
using HwProj.Models.Result;
910
using HwProj.SolutionsService.Client;
1011
using Microsoft.AspNetCore.Mvc;
1112

@@ -53,14 +54,21 @@ public class SheetUrl
5354
}
5455

5556
[HttpPost("getSheetTitles")]
56-
public async Task<string[]> GetSheetTitles([FromBody] SheetUrl sheetUrl)
57+
public async Task<Result<string[]>> GetSheetTitles([FromBody] SheetUrl sheetUrl)
5758
{
5859
var match = Regex.Match(sheetUrl.Url, "https://docs\\.google\\.com/spreadsheets/d/(?<id>.+)/");
59-
if (!match.Success) return Array.Empty<string>();
60+
if (!match.Success) return Result<string[]>.Failed("Некорректная ссылка на страницу Google Docs");
6061

6162
var spreadsheetId = match.Groups["id"].Value;
62-
var sheet = await _sheetsService.Spreadsheets.Get(spreadsheetId).ExecuteAsync();
63-
return sheet.Sheets.Select(t => t.Properties.Title).ToArray();
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+
}
6472
}
6573
}
6674
}

hwproj.front/src/api/api.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,32 @@ export interface Result {
810810
errors?: Array<string>;
811811
}
812812

813+
/**
814+
*
815+
* @export
816+
* @interface ResultString
817+
*/
818+
export interface ResultString {
819+
/**
820+
*
821+
* @type {Array<string>}
822+
* @memberof ResultString
823+
*/
824+
value?: Array<string>;
825+
/**
826+
*
827+
* @type {boolean}
828+
* @memberof ResultString
829+
*/
830+
succeeded?: boolean;
831+
/**
832+
*
833+
* @type {Array<string>}
834+
* @memberof ResultString
835+
*/
836+
errors?: Array<string>;
837+
}
838+
813839
/**
814840
*
815841
* @export
@@ -5230,7 +5256,7 @@ export const StatisticsApiFp = function(configuration?: Configuration) {
52305256
* @param {*} [options] Override http request option.
52315257
* @throws {RequiredError}
52325258
*/
5233-
apiStatisticsGetSheetTitlesPost(sheetUrl?: SheetUrl, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise<Array<string>> {
5259+
apiStatisticsGetSheetTitlesPost(sheetUrl?: SheetUrl, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise<ResultString> {
52345260
const localVarFetchArgs = StatisticsApiFetchParamCreator(configuration).apiStatisticsGetSheetTitlesPost(sheetUrl, options);
52355261
return (fetch: FetchAPI = portableFetch, basePath: string = BASE_PATH) => {
52365262
return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => {

hwproj.front/src/components/Courses/StudentStats.tsx

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import React from "react";
2-
import {CourseViewModel, HomeworkViewModel, StatisticsCourseMatesModel} from "../../api/";
2+
import {CourseViewModel, HomeworkViewModel, ResultString, StatisticsCourseMatesModel} from "../../api/";
33
import {Table, TableBody, TableCell, TableContainer, TableHead, TableRow} from "@material-ui/core";
44
import StudentStatsCell from "../Tasks/StudentStatsCell";
5-
import {Alert, MenuItem, Select, TextField} from "@mui/material";
5+
import {Alert, Button, Grid, MenuItem, Select, TextField} from "@mui/material";
66
import apiSingleton from "../../api/ApiSingleton";
77

88
interface IStudentStatsProps {
@@ -16,7 +16,7 @@ interface IStudentStatsProps {
1616
interface IStudentStatsState {
1717
searched: string
1818
googleDocUrl: string
19-
sheetTitles: string[]
19+
sheetTitles: ResultString | undefined
2020
}
2121

2222
class StudentStats extends React.Component<IStudentStatsProps, IStudentStatsState> {
@@ -25,11 +25,11 @@ class StudentStats extends React.Component<IStudentStatsProps, IStudentStatsStat
2525
this.state = {
2626
searched: "",
2727
googleDocUrl: "",
28-
sheetTitles: []
28+
sheetTitles: undefined
2929
}
30-
3130
}
3231

32+
//TODO: throttling
3333
private handleGoogleDocUrlChange = async (value: string) => {
3434
const titles = await apiSingleton.statisticsApi.apiStatisticsGetSheetTitlesPost({url: value})
3535
this.setState({googleDocUrl: value, sheetTitles: titles});
@@ -105,17 +105,46 @@ class StudentStats extends React.Component<IStudentStatsProps, IStudentStatsStat
105105
</TableBody>
106106
</Table>
107107
</TableContainer>
108-
<TextField fullWidth label={"Ссылка на Google Docs"} value={googleDocUrl}
109-
onChange={event => {
110-
event.persist()
111-
this.handleGoogleDocUrlChange(event.target.value)
112-
}}/>
113-
{googleDocUrl && <Select
114-
labelId="demo-simple-select-label"
115-
id="demo-simple-select"
116-
label="Course"
117-
>
118-
{sheetTitles.map((title, i) => <MenuItem value={i}>{title}</MenuItem>)}</Select>}
108+
<Grid container spacing={1} style={{marginTop: 15}}>
109+
<Grid item>
110+
<Alert severity="info" variant={"standard"}>
111+
Для загрузки таблицы необходимо разрешить доступ на редактирование по ссылке для Google Docs
112+
страницы
113+
</Alert>
114+
</Grid>
115+
<Grid container item spacing={1} alignItems={"center"}>
116+
<Grid item>
117+
<TextField size={"small"} fullWidth label={"Ссылка на Google Docs"} value={googleDocUrl}
118+
onChange={event => {
119+
event.persist()
120+
this.handleGoogleDocUrlChange(event.target.value)
121+
}}/>
122+
</Grid>
123+
{sheetTitles && !sheetTitles.succeeded && <Grid item>
124+
<Alert severity="error">
125+
{sheetTitles!.errors![0]}
126+
</Alert>
127+
</Grid>}
128+
{sheetTitles && sheetTitles.value && sheetTitles.value.length > 0 && <Grid item>
129+
<Select
130+
size={"small"}
131+
id="demo-simple-select"
132+
label="Sheet"
133+
value={0}
134+
>
135+
{sheetTitles.value.map((title, i) => <MenuItem value={i}>{title}</MenuItem>)}
136+
</Select>
137+
</Grid>}
138+
{sheetTitles && sheetTitles.succeeded && <Grid item>
139+
<Button fullWidth
140+
variant="text"
141+
color="primary"
142+
type="button">
143+
Загрузить
144+
</Button>
145+
</Grid>}
146+
</Grid>
147+
</Grid>
119148
</div>
120149
);
121150
}

0 commit comments

Comments
 (0)