You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Первый проект, где студент самостоятельно разрабатывает структуру БД
33
33
- Знакомство с NoSQL хранилищами - S3 для файлов, Redis для сессий
34
+
- Интеграция по REST с одностраничным frontend приложением на React
34
35
35
36
## Функционал приложения
36
37
@@ -45,39 +46,294 @@ weight = 6
45
46
- Загрузка (upload) файлов и папок
46
47
- Создание новой пустой папки (аналогично созданию новой папки в проводнике)
47
48
- Удаление
48
-
- Переименование
49
+
- Переименование и перемещение
49
50
- Скачивание файлов и папок
50
51
51
-
## Интерфейс приложения
52
+
## REST API
52
53
53
-
### Главная страница
54
+
- Архитектурный стиль - RPC для авторизации и регистрации, REST для всего остального
55
+
- Механизм авторизации - сессии
56
+
- Формат запросов и ответов - JSON, кроме скачивания и аплоада файлов
54
57
55
-
Адрес - `/?path=$path_to_subdirectory`. Параметр `$path` задаёт путь просматриваемой папки. Если параметр отсутствует, подразумевается корневая папка. Пример - `/path=Projects%2FJava%2FCloudFileStorage` (параметр закодирован через URL Encode).
58
+
### Ответ в случае ошибки
56
59
57
-
- Заголовок
58
-
- Для неавторизованных пользователей - кнопки регистрации и авторизации
59
-
- Для авторизованных пользователей - логин текущего пользователя и кнопка Logout
60
-
- Контент (только для авторизованных пользователей)
61
-
- Форма поиска файлов и папок по названию
62
-
- Навигационная цепочка (breadcrumbs), содержащая путь из папок до текущей папки. Каждый элемент является ссылкой на свою папку. Пример - цепочка из папок, ведущая к - `Projects/Java/CloudFileStorage` содержала бы 3 папки - корневую, `Projects` и `Projects/Java`
63
-
- Список файлов в текущей директории. Для каждого файла отображаем имя и кнопку, вызывающее меню действий (удаление, переименование)
64
-
- Формы (или drop areas) для загрузки файлов и папок
60
+
Актуально для всех методов.
65
61
66
-
### Страница поиска файлов
62
+
Тело ответа:
63
+
```
64
+
{
65
+
"message": "Текст ошибки"
66
+
}
67
+
```
67
68
68
-
Адрес - `/search/?query=$search_query`.
69
+
Тело ответа может содержать другие поля (которые по-умолчанию отправляет Spring).
69
70
70
-
Неавторизованные пользователя не имеют доступа к данной странице, приложение должно редиректить их на форму авторизации.
71
+
### Регистрация и авторизация
71
72
72
-
- Заголовок
73
-
- Логин текущего пользователя и кнопка Logout
74
-
- Контент
75
-
- Форма поиска файлов и папок по названию
76
-
- Список найденных файлов. Для каждого найденного файла отображаем имя и кнопку для перехода в папку, содержащую данный файл
73
+
#### Регистрация
77
74
78
-
### Остальное
75
+
`POST /auth/sign-up`
79
76
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`) пустое.
Ответ в случае успеха: `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 - невалидный или отсутствующий путь к новой папке
0 commit comments