Skip to content

Commit d906a56

Browse files
committed
cloud-file-storage: UI description replaced with REST API schema
1 parent 875e382 commit d906a56

File tree

1 file changed

+280
-24
lines changed

1 file changed

+280
-24
lines changed

content/projects/cloud-file-storage.md

Lines changed: 280 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ weight = 6
1313
- [Maven/Gradle](../technologies/build-systems.md)
1414
- [Backend](../technologies/backend.md)
1515
- Spring Boot, Spring Security, Spring Sessions
16-
- Thymeleaf
17-
- Upload файлов, заголовки HTTP запросов, cookies, cессии
16+
- REST, Swagger, Upload файлов
17+
- Cookies, cессии
1818
- [Базы данных](../technologies/databases.md)
1919
- SQL
2020
- Spring Data JPA
@@ -31,6 +31,7 @@ weight = 6
3131
- Практика с Docker и Docker Compose
3232
- Первый проект, где студент самостоятельно разрабатывает структуру БД
3333
- Знакомство с NoSQL хранилищами - S3 для файлов, Redis для сессий
34+
- Интеграция по REST с одностраничным frontend приложением на React
3435

3536
## Функционал приложения
3637

@@ -45,39 +46,294 @@ weight = 6
4546
- Загрузка (upload) файлов и папок
4647
- Создание новой пустой папки (аналогично созданию новой папки в проводнике)
4748
- Удаление
48-
- Переименование
49+
- Переименование и перемещение
4950
- Скачивание файлов и папок
5051

51-
## Интерфейс приложения
52+
## REST API
5253

53-
### Главная страница
54+
- Архитектурный стиль - RPC для авторизации и регистрации, REST для всего остального
55+
- Механизм авторизации - сессии
56+
- Формат запросов и ответов - JSON, кроме скачивания и аплоада файлов
5457

55-
Адрес - `/?path=$path_to_subdirectory`. Параметр `$path` задаёт путь просматриваемой папки. Если параметр отсутствует, подразумевается корневая папка. Пример - `/path=Projects%2FJava%2FCloudFileStorage` (параметр закодирован через URL Encode).
58+
### Ответ в случае ошибки
5659

57-
- Заголовок
58-
- Для неавторизованных пользователей - кнопки регистрации и авторизации
59-
- Для авторизованных пользователей - логин текущего пользователя и кнопка Logout
60-
- Контент (только для авторизованных пользователей)
61-
- Форма поиска файлов и папок по названию
62-
- Навигационная цепочка (breadcrumbs), содержащая путь из папок до текущей папки. Каждый элемент является ссылкой на свою папку. Пример - цепочка из папок, ведущая к - `Projects/Java/CloudFileStorage` содержала бы 3 папки - корневую, `Projects` и `Projects/Java`
63-
- Список файлов в текущей директории. Для каждого файла отображаем имя и кнопку, вызывающее меню действий (удаление, переименование)
64-
- Формы (или drop areas) для загрузки файлов и папок
60+
Актуально для всех методов.
6561

66-
### Страница поиска файлов
62+
Тело ответа:
63+
```
64+
{
65+
"message": "Текст ошибки"
66+
}
67+
```
6768

68-
Адрес - `/search/?query=$search_query`.
69+
Тело ответа может содержать другие поля (которые по-умолчанию отправляет Spring).
6970

70-
Неавторизованные пользователя не имеют доступа к данной странице, приложение должно редиректить их на форму авторизации.
71+
### Регистрация и авторизация
7172

72-
- Заголовок
73-
- Логин текущего пользователя и кнопка Logout
74-
- Контент
75-
- Форма поиска файлов и папок по названию
76-
- Список найденных файлов. Для каждого найденного файла отображаем имя и кнопку для перехода в папку, содержащую данный файл
73+
#### Регистрация
7774

78-
### Остальное
75+
`POST /auth/sign-up`
7976

80-
- Страницы с формами регистрации и авторизации
77+
Тело запроса (`application/json`):
78+
```
79+
{
80+
"username": "user_1",
81+
"password": "password"
82+
}
83+
```
84+
85+
Ответ в случае успеха: `201 Created` со следующим телом:
86+
87+
```
88+
{
89+
"username": "user_1"
90+
}
91+
```
92+
93+
При регистрации юзеру сразу создаётся сессия и выставляется кука.
94+
95+
Коды ошибок:
96+
- 400 - ошибки валидации (пример - слишком короткий username)
97+
- 409 - username занят
98+
- 500 - неизвестная ошибка
99+
100+
#### Авторизация
101+
102+
`POST /auth/sign-in`
103+
104+
Тело запроса (`application/json`):
105+
```
106+
{
107+
"username": "user_1",
108+
"password": "password"
109+
}
110+
```
111+
112+
Тело ответа в случае успеха (`200 OK`):
113+
```
114+
{
115+
"username": "user_1"
116+
}
117+
```
118+
119+
Коды ошибок:
120+
- 400 - ошибки валидации (пример - слишком короткий username)
121+
- 401 - неверные данные (такого пользователя нет, или пароль неправильный)
122+
- 500 - неизвестная ошибка
123+
124+
#### Выход из аккаунта (логаут)
125+
126+
`POST /auth/sign-out`
127+
128+
Тела запроса нет.
129+
130+
Тело ответа в случае успеха (`204 No Content`) пустое.
131+
132+
Коды ошибок:
133+
- 401 - запрос исполняется неавторизованным юзером
134+
- 500 - неизвестная ошибка
135+
136+
### Пользователи
137+
138+
#### Текущий пользователь
139+
140+
`GET /user/me`
141+
142+
Ответ в случае успеха: `200 OK` со следующим телом:
143+
144+
```
145+
{
146+
"username": "user_1"
147+
}
148+
```
149+
150+
Коды ошибок:
151+
- 401 - пользователь не авторизован
152+
- 500 - неизвестная ошибка
153+
154+
### Работа с файлами и папками
155+
156+
Терминология:
157+
- Ресурс - файл или папка
158+
- Путь к ресурсу - полный путь состоит из иерархии папок, плюс имени ресурса
159+
- Пример для файла - `folder1/folder2/file.txt`
160+
- Пример для папки - `folder1/folder2`
161+
162+
#### Ресурсы
163+
164+
**Получение информации о ресурсе**
165+
166+
`GET /resource?path=$path`
167+
168+
Для всех запросов ниже, параметр path - полный путь к ресурсу в url-encoded формате. Путь к папке должен заканчиваться на `/`. Это необходимо, чтобы отличить папку и файл с одинаковым названием, которые могут сосуществовать вместе в одной корневой директории.
169+
170+
Ответ в случае успеха: `200 OK` со следующим телом (`appication/json`):
171+
172+
```
173+
{
174+
"path": "folder1/folder2", // путь к папке, в которой лежит ресурс
175+
"name": "file.txt",
176+
"size": 123, // размер файла в байтах. Если ресурс - папка, это поле отсутствует
177+
"type": "DIRECTORY" // DIRECTORY или FILE
178+
}
179+
```
180+
181+
Коды ошибок:
182+
- 400 - невалидный или отсутствующий путь
183+
- 401 - пользователь не авторизован
184+
- 404 - ресурс не найден
185+
- 500 - неизвестная ошибка
186+
187+
**Удаление ресурса**
188+
189+
`DELETE /resource?path=$path`
190+
191+
Ответ в случае успеха: `204 No Content` без тела:
192+
193+
Коды ошибок:
194+
- 400 - невалидный или отсутствующий путь
195+
- 401 - пользователь не авторизован
196+
- 404 - ресурс не найден
197+
- 500 - неизвестная ошибка
198+
199+
**Скачивание ресурса**
200+
201+
`GET /resource/download?path=$path`
202+
203+
Ответ в случае успеха - `200 OK` и бинарное содержимое файла с Content-Type: `application/octet-stream`.
204+
205+
Папка скачивается в формате zip архива её содержимого.
206+
207+
Коды ошибок:
208+
- 400 - невалидный или отсутствующий путь
209+
- 401 - пользователь не авторизован
210+
- 404 - ресурс не найден
211+
- 500 - неизвестная ошибка
212+
213+
**Переименование/перемещение ресурса**
214+
215+
`GET /resource/move?from=$from&to=$to`
216+
217+
GET параметры - старый и новый полные пути к ресурсу в URL-encoded формате.
218+
219+
- При переименовании меняется только имя файла
220+
- При перемещении меняется только путь к файлу
221+
222+
Ответ в случае успеха - `200 OK`. Тело (`application/json`):
223+
```
224+
{
225+
"path": "folder1/folder2", // путь к папке, в которой лежит перемещённый ресурс
226+
"name": "file.txt", // имя перемещённого ресурса
227+
"size": 123, // размер файла в байтах. Если ресурс - папка, это поле отсутствует
228+
"type": "DIRECTORY" // DIRECTORY или FILE
229+
}
230+
```
231+
232+
Коды ошибок:
233+
- 400 - невалидный или отсутствующий путь
234+
- 401 - пользователь не авторизован
235+
- 404 - ресурс не найден
236+
- 409 - ресурс, лежащий по пути `to` уже существует
237+
- 500 - неизвестная ошибка
238+
239+
**Поиск**
240+
241+
`GET /resource/search?query=$query`
242+
243+
GET параметр `query` - поисковый запрос в URL-encoded формате.
244+
245+
Ответ в случае успеха: `200 OK` со следующим телом (`appication/json`). Коллекция найденных ресурсов:
246+
247+
```
248+
[
249+
{
250+
"path": "folder1/folder2", // путь к папке, в которой лежит ресурс
251+
"name": "file.txt",
252+
"size": 123, // размер файла в байтах. Если ресурс - папка, это поле отсутствует
253+
"type": "DIRECTORY" // DIRECTORY или FILE
254+
}
255+
]
256+
```
257+
258+
Коды ошибок:
259+
- 400 - невалидный или отсутствующий поисковый запрос
260+
- 401 - пользователь не авторизован
261+
- 500 - неизвестная ошибка
262+
263+
**Аплоад**
264+
265+
POST `resource?path=$path`
266+
267+
GET параметр `path` - путь к папке, в которую мы загружаем ресурс(ы).
268+
269+
Тело запроса содержит данные из file input в формате MultipeartFile. Если в имени файла будет указана поддиректория (например, upload_folder/test.txt) - то при загрузке в storage_folder/ будет создана такая директория. В итоге файл после загрузки будет находиться в storage_folder/upload_folder/test.txt. Это позволяет загружать одним запросом файлы, целые папки и рекусривно вложенные подпапки одним запросом.
270+
271+
Ответ в случае успеха: `201 Created` со следующим телом (`appication/json`). Коллекция загруженных ресурсов:
272+
273+
```
274+
[
275+
{
276+
"path": "folder1/folder2", // путь к папке, в которой лежит ресурс
277+
"name": "file.txt",
278+
"size": 123, // размер файла в байтах. Если ресурс - папка, это поле отсутствует
279+
"type": "DIRECTORY" // DIRECTORY или FILE
280+
}
281+
]
282+
```
283+
284+
Коды ошибок:
285+
- 400 - невалидное тело запроса
286+
- 404 - папка, в которую мы загружаем ресурс(ы) не существует
287+
- 401 - пользователь не авторизован
288+
- 500 - неизвестная ошибка
289+
290+
**Папки**
291+
292+
Получение информации о содержимом содержимом папки
293+
294+
`GET /directory?path=$path`
295+
296+
Ответ в случае успеха: `200 OK` со следующим телом (`appication/json`). Коллекция ресурсов, лежащих в папке (не ресурсивно):
297+
298+
```
299+
[
300+
{
301+
"path": "folder1/folder2", // путь к папке, в которой лежит ресурс
302+
"name": "file.txt",
303+
"size": 123, // размер файла в байтах. Если ресурс - папка, это поле отсутствует
304+
"type": "DIRECTORY" // DIRECTORY или FILE
305+
}
306+
]
307+
```
308+
309+
Коды ошибок:
310+
- 400 - невалидный или отсутствующий путь
311+
- 401 - пользователь не авторизован
312+
- 404 - папка не существует
313+
- 500 - неизвестная ошибка
314+
315+
**Создание пустой папки**
316+
317+
`POST /directory?path=$path`
318+
319+
Ответ в случае успеха: `201 Created` со следующим телом (`appication/json`). Ресурс созданной папки:
320+
321+
```
322+
[
323+
{
324+
"path": "folder1/folder2", // путь к папке, в которой лежит ресурс
325+
"name": "folder3",
326+
"size": 123, // размер файла в байтах. Если ресурс - папка, это поле отсутствует
327+
"type": "DIRECTORY" // DIRECTORY или FILE
328+
}
329+
]
330+
```
331+
332+
Коды ошибок:
333+
- 400 - невалидный или отсутствующий путь к новой папке
334+
- 401 - пользователь не авторизован
335+
- 404 - Родительская папка не существует
336+
- 500 - неизвестная ошибка
81337

82338
## Работа с сессиями, авторизацией, регистрацией
83339

0 commit comments

Comments
 (0)