ClickURL / py-clickurls

0 stars 0 forks source link

ShortURL варіант без авторизації #1

Open YaroslavPodorvanov opened 1 year ago

YaroslavPodorvanov commented 1 year ago

Побажання

  1. Міграції й запити до БД мають бути у форматі SQL (без ORM)
  2. Контролери можуть бути у різних пакетах, але маршрутизація має бути у одному місці
  3. Задачу треба робити у новій Git-гілці (скористуватись функціоналом GitHub на цій сторінці)
  4. Кожен Git-коміт має містити в повідомленні посилання на цю задачу Linking a pull request to an issue
  5. Цього разу потрібно задеплоїти на https://railway.app/?referralCode=Yaroslav

Логіка роботи сервісу sh.example.com

Є original_url, short_url, secret_access_token, та статистика переглядів hour_views, secret_access_token буде використаний для перегляду статистики переходів по short_url

  1. Користувач заходить на головну сторінку й бачить поле для вводу original_url та кнопку "створити"
  2. Після натиснення "створити" користувача перенаправляє на сторінку "https://sh.example.com/edit/{secret_access_token}" яка містить 1. "https://sh.example.com/{short_url}" (з кнопкою копіювання), 2. "https://sh.example.com/edit/{secret_access_token}" (з кнопкою копіювання), 3. кнопку "Оновити статистику" та 4. графік статистики переходів по "https://sh.example.com/{short_url}"
  3. Коли користувач переходить по "https://sh.example.com/{short_url}" то користувача має перенаправляти на original_url, а в таблицю статистики hour_views має зберігатись link_id та time
  4. Має бути API яке повертає статистику переходів за місяць згуповану по годинам "https://sh.example.com/api/v1/{secret_access_token}/stats.json"
  5. Кнопка "Оновити статистику" має робити запит на API "https://sh.example.com/api/v1/{secret_access_token}/stats.json" й відмальовувати графік переходів, приклад графіку https://u8views.com/github/YaroslavPodorvanov
  6. Міграції мають містити 3 створених short_url-и, які потрібно буде додати у коментарях до задачі у вигляді таблиці | "https://sh.example.com/edit/{secret_access_token}" | "https://sh.example.com/{short_url}" | original_url (почитай про Markdown таблиці)
  7. У фікстурах має бути список доменів та сайтів на які заборонено створювати short_url-и

Навчальні матеріали

  1. Design URL shortener
  2. https://docs.railway.app/databases/postgresql
  3. https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue
  4. https://drawsql.app/templates/polr

Специфіка

Це перша задача, а друга задача буде містити зміни, які було б краще зробити відразу, але то навмисно, щоб бути наближеним до реальних задач

База даних в docker-compose має співпадати з базою хостингу

MykhailoRospopchuk commented 1 year ago

Що, в пункті №4, апі повинно в респонсі повернути? Файл .json в якому буде статистика переглядів чи дані в форматі json?

YaroslavPodorvanov commented 1 year ago

Що, в пункті №4, апі повинно в респонсі повернути? Файл .json в якому буде статистика переглядів чи дані в форматі json?

{
    "views_stats": [
        {
            "date": "2023-03-01",
            "views_count": 1
        },
        // ... 2023-03-02
        // ... 2023-03-..
        // ... 2023-03-22
        {
            "date": "2023-03-23",
            "views_count": 123
        }
    ]
}
MykhailoRospopchuk commented 1 year ago
edit url short url original url
https://py-clickurls.up.railway.app/edit/a8098c1a-f86e-11da-bd1a-00112444be1e https://py-clickurls.up.railway.app/12345 https://fastapi.tiangolo.com/
https://py-clickurls.up.railway.app/edit/a8098c1a-f86e-11da-bd1a-00112444be2e https://py-clickurls.up.railway.app/54321 https://plotly.com/graphing-libraries/
https://py-clickurls.up.railway.app/edit/a8098c1a-f86e-11da-bd1a-00112444be3e https://py-clickurls.up.railway.app/qwert https://docs.pydantic.dev/
YaroslavPodorvanov commented 1 year ago
SELECT g.time                         AS time,
       COALESCE(rcs.count, 0)::BIGINT AS count
FROM (
    SELECT time::TIMESTAMP
    FROM generate_series(
        (DATE_TRUNC('DAY', NOW()) - INTERVAL '1 MONTH')::TIMESTAMP,
        (DATE_TRUNC('DAY', NOW()))::TIMESTAMP,
        '1 DAY'::INTERVAL
    ) AS time
) AS g
    LEFT JOIN (
        SELECT DATE_TRUNC('DAY', created_at) AS time,
               COUNT(*)                      AS count
        FROM users
        WHERE created_at >= (DATE_TRUNC('DAY', NOW()) - INTERVAL '1 MONTH')::TIMESTAMP
        GROUP BY time
    ) AS rcs ON (g.time = rcs.time)
ORDER BY g.time;
MykhailoRospopchuk commented 1 year ago
edit url short url original url
http://localhost:8080/edit/a8098c1a-f86e-11da-bd1a-00112444be1e http://localhost:8080/12345 https://fastapi.tiangolo.com/
http://localhost:8080/edit/a8098c1a-f86e-11da-bd1a-00112444be2e http://localhost:8080/54321 https://plotly.com/graphing-libraries/
http://localhost:8080/edit/a8098c1a-f86e-11da-bd1a-00112444be3e http://localhost:8080/qwert https://docs.pydantic.dev/