Skip to content

Commit 57232e4

Browse files
authored
Initial commit
0 parents  commit 57232e4

File tree

11 files changed

+157
-0
lines changed

11 files changed

+157
-0
lines changed

.github/workflows/app-testing.yml

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: build-and-test
2+
3+
on:
4+
push:
5+
branches: [ main ]
6+
pull_request:
7+
branches: [ main ]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
strategy:
13+
matrix:
14+
python-version: ["3.9", "3.10", "3.11"]
15+
steps:
16+
- uses: actions/checkout@v2
17+
- name: Set up Python ${{ matrix.python-version }}
18+
uses: actions/setup-python@v2
19+
with:
20+
python-version: ${{ matrix.python-version }}
21+
- name: Install dependencies
22+
run: |
23+
python -m pip install --upgrade pip
24+
pip install flake8 pytest
25+
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
26+
- name: Lint with flake8
27+
run: |
28+
# stop the build if there are Python syntax errors or undefined names
29+
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
30+
# exit-zero treats all errors as warnings
31+
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=119 --statistics --config=setup.cfg

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
.idea/
3+
__pycache__/
4+
*.pyc

README.md

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# Проектное задание четвёртого спринта
2+
3+
Спроектируйте и реализуйте сервис для создания сокращённой формы передаваемых URL и анализа активности их использования.
4+
5+
Кроме этого, выберите из списка дополнительные требования и тоже реализуйте их. У каждого задания есть определённая сложность, от которой зависит количество баллов. Вам необходимо выбрать такое количество заданий, чтобы общая сумма баллов была больше 4. Выбор заданий никак не ограничен: можно выбрать все простые или одно среднее и два простых, или одно продвинутое, или решить все.
6+
7+
## Описание задания
8+
9+
Реализовать `http`-сервис, который обрабатывает поступающие запросы. Сервер стартует по адресу `http://127.0.0.1:8080` (значение по умолчанию, можно изменять).
10+
11+
<details>
12+
<summary> Список возможных эндпойнтов (можно изменять) </summary>
13+
14+
1. Получить сокращённый вариант переданного URL.
15+
16+
```python
17+
POST /
18+
```
19+
20+
Метод принимает в теле запроса строку URL для сокращения и возвращает ответ с кодом `201`.
21+
22+
2. Вернуть оригинальный URL.
23+
24+
```python
25+
GET /<shorten-url-id>
26+
```
27+
28+
Метод принимает в качестве параметра идентификатор сокращённого URL и возвращает ответ с кодом `307` и оригинальным URL в заголовке `Location`.
29+
30+
3. Вернуть статус использования URL.
31+
32+
```python
33+
GET /<shorten-url-id>/status?[full-info]&[max-result=10]&[offset=0]
34+
```
35+
36+
Метод принимает в качестве параметра идентификатор сокращённого URL и возвращает информацию о количестве переходов, совершенных по ссылке.
37+
38+
В ответе может содержаться как общее количество совершенных переходов, так и дополнительная детализированная информация о каждом переходе (наличие **query**-параметра **full-info** и параметров пагинации):
39+
- дата и время перехода/использования ссылки;
40+
- информация о клиенте, выполнившем запрос;
41+
42+
</details>
43+
44+
45+
## Дополнительные требования (отметьте [Х] выбранные пункты):
46+
47+
- [ ] (1 балл) Реализуйте метод `GET /ping`, который возвращает информацию о статусе доступности БД.
48+
- [ ] (1 балл) Реализуйте возможность «удаления» сохранённого URL. Запись должна остаться, но помечаться как удалённая. При попытке получения полного URL возвращать ответ с кодом `410 Gone`.
49+
- [ ] (2 балла) Реализуйте middlware, блокирующий доступ к сервису из запрещённых подсетей (black list).
50+
- [ ] (2 балла) Реализуйте возможность передавать ссылки пачками (batch upload).
51+
52+
<details>
53+
<summary> Описание изменений </summary>
54+
55+
- Метод `POST /shorten` принимает в теле запроса список URL в формате:
56+
57+
```python
58+
[
59+
{
60+
"original-url": "<URL-for-shorten>"
61+
},
62+
...
63+
]
64+
65+
```
66+
... и возвращает данные в следующем формате:
67+
68+
```python
69+
[
70+
{
71+
"short-id": "<shoten-id>",
72+
"short-url": "http://...",
73+
},
74+
...
75+
]
76+
```
77+
</details>
78+
79+
80+
- [ ] (3 балла) Реализуйте взаимодействие с сервисом авторизованного пользователя. Пользователь может создавать как приватные, так и публичные ссылки или изменять видимость ссылок. Вызов метода `GET /user/status` возвращает все созданные ранее ссылки в формате:
81+
82+
```
83+
[
84+
{
85+
"short-id": "<text-id>",
86+
"short-url": "http://...",
87+
"original-url": "http://...",
88+
"type": "<public|private>"
89+
},
90+
...
91+
]
92+
```
93+
94+
- [ ] **(5 баллов) Реализуйте кастомное взаимодействия с БД. Необходимо учесть возможность работы с транзакциями.
95+
96+
97+
## Требования к решению
98+
99+
1. Используйте фреймворк FastAPI. В качестве СУБД используйте PostgreSQL (не ниже 10 версии).
100+
2. Используйте концепции ООП.
101+
3. Предусмотрите обработку исключительных ситуаций.
102+
4. Приведите стиль кода в соответствие pep8, flake8, mypy.
103+
5. Логируйте результаты действий.
104+
6. Покройте написанный код тестами.

requirements.txt

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
fastapi==0.79.0
3+
orjson==3.4.1
4+
pydantic==1.9.0
5+
uvicorn==0.18.2
6+
uvloop==0.14.0; sys_platform != "win32" and implementation_name == "cpython"

setup.cfg

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[flake8]
2+
ignore =
3+
W503,
4+
F811
5+
exclude =
6+
tests/,
7+
*/migrations/,
8+
venv/,
9+
env/
10+
per-file-ignores =
11+
*/settings.py:E501
12+
max-complexity = 10

src/api/__init__.py

Whitespace-only changes.

src/core/__init__.py

Whitespace-only changes.

src/db/__init__.py

Whitespace-only changes.

src/main.py

Whitespace-only changes.

src/models/__init__.py

Whitespace-only changes.

src/services/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)