Перейти к содержимому

Clearway Integration (clearway.ru)

Актуальность: 1 кв 2025

Задача: Тестовое задание: Необходимо разработать web-сервис по закачке/скачке данных. В БД есть таблица со списком зарегистрированных пользователей. Пользователь передает на сервер логин/пароль и получает авторизационный токен (session-id) для доступа к API. security/auth

Заголовок раздела «Задача: Тестовое задание: Необходимо разработать web-сервис по закачке/скачке данных. В БД есть таблица со списком зарегистрированных пользователей. Пользователь передает на сервер логин/пароль и получает авторизационный токен (session-id) для доступа к API. security/auth»
$ curl -d '{"login ":"alice ","password ":"secret "} http://myhost.com/api/auth
{"token ":"2bdbbb11806cd18a90d730e61fbb54b5 "}

Задача: Используя токен, пользователь может закачивать данные на сервер: security/auth

Заголовок раздела «Задача: Используя токен, пользователь может закачивать данные на сервер: security/auth»
$ curl -X POST -H 'Authorization: Bearer 2bdbbb11806cd18a90d730e61fbb54b5 '-d
'Hello, Alice!'http://myhost.com/api/upload-asset/hello
{"status ":"ok "}
$ curl -H 'Authorization: Bearer 2bdbbb11806cd18a90d730e61fbb54b5 'http://myhost.com/api/asset/hello
Hello, Alice!

Для реализации микросервиса можно пользоваться только стандартной библиотекой Go (последней версии) и библиотекой pgx для доступа к БД.

  • 200 OK - порядок network/http
  • 400 Bad Request - Некорректный запрос. Например, отсутствует необходимое поле или запрос имеет не валидный JSON формат. network/http
  • 401 Unauthorized - Отсутствует авторизационный токен. Авторизационный токен не валидный/просроченный. security/auth
  • 403 Forbidden - Доступ запрещен. Попытка обратиться к ресурсу, принадлежащему другому пользователю. network/http
  • 404 Not Found - Запрашиваемый ресурс не найден. network/http
  • 500 Internal Server Error - Ошибка сервера. Какая-то непредвиденная ошибка. Например БД недоступна. go/errors-panic

{«error»:«description»}

Сервис всегда возвращает данные в формате JSON, кроме случаев, когда явно необходим другой формат данных.

POST /api/auth

Request:
Body: any-data
Response:
{"status ":"ok "}

GET /api/asset/{asset-name}

Response:
asset-body

schema.sql

CREATE extension IF NOT EXISTS pgcrypto;
-- таблица с пользователями
CREATE TABLE IF NOT EXISTS users (
id bigserial PRIMARY KEY,
login text NOT NULL UNIQUE,
password_hash text NOT NULL,
created_at timestamptz NOT NULL DEFAULT NOW()
);
-- таблица сессий
CREATE TABLE IF NOT EXISTS sessions (
id text PRIMARY KEY DEFAULT encode(gen_random_bytes(16), 'hex '),
uid bigint NOT NULL, -- user id
created_at timestamptz NOT NULL DEFAULT NOW()
);
-- таблица с файлами
CREATE TABLE IF NOT EXISTS assets (
name text NOT NULL,
uid bigint NOT NULL, -- user id
data bytea NOT NULL,
created_at timestamptz NOT NULL DEFAULT NOW(),
PRIMARY KEY(name, uid)
);
-- тестовый пользователь
INSERT INTO
users (login, password_hash)
VALUES
('alice ', encode(digest('secret ','md5 '), 'hex ')) ON conflict DO nothing;
  • Что можно улучшить в схеме БД? sql/schema-design
  • Доработайте механизм авторизации таким образом, чтобы в каждый момент времени у пользователя была активна только одна (последняя) сессия; security/auth
  • Ограничьте максимальное время пользовательской сессии до 24-х часов; security/auth
  • Добавьте в БД данные об IP адресе авторизованного пользователя; security/auth
  • Реализуйте методы API для получения списка всех закаченных файлов; network/http
  • Реализуйте методы API для удаления файлов; network/http
  • Реализуйте работу сервера по протоколу HTTPS. network/http