handlers

package
v0.0.0-...-832d8e4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 22, 2022 License: MIT Imports: 13 Imported by: 0

Documentation

Index

Examples

Constants

This section is empty.

Variables

View Source
var (
	ErrLinkIsAlreadyShortened = errors.New("link is already shortened")
	ErrEmptyBatchToShort      = errors.New("nothing to short")
	ErrLinkIsDeleted          = errors.New("link is deleted")
	ErrMethodNotAllowed       = errors.New("method is not allowed, read task description carefully")
	ErrProperJSONIsExpected   = errors.New("proper JSON is expected, read task description carefully")
)

Functions

func MapToBucket

func MapToBucket(baseURL string, m map[string]string) *[]BucketItem

MapToBucket создает корзину ссылок из `map[string]string`

Types

type BucketItem

type BucketItem struct {
	ShortURL    string `json:"short_url"`
	OriginalURL string `json:"original_url"`
}

BucketItem представляет собой структуру, в которой требуется сериализовать список ссылок

[
  {
    "short_url": "https://...",
    "original_url": "https://..."
  }, ...
]

type Repository

type Repository interface {
	// Store сохраняет оригинальную ссылку и возвращает id (токен) сокращенного варианта.
	Store(ctx context.Context, user string, link string) (id string, err error)
	// Restore возвращает оригинальную ссылку по его id.
	// если error == ErrLinkIsDeleted значит короткая ссылка (id) была удалена.
	Restore(ctx context.Context, id string) (link string, err error)
	// Unstore - помечает ссылки удаленными.
	// Согласно заданию - результат работы пользователю не возвращается.
	Unstore(ctx context.Context, user string, ids []string)
	// GetUserStorage возвращает массив всех ранее сокращенных пользователей ссылок.
	GetUserStorage(ctx context.Context, user string) map[string]string
	// StoreBatch сохраняет пакет ссылок в хранилище и возвращает список пакет id.
	// batchIn = map[correlation_id]original_link
	// batchOut= map[correlation_id]short_link
	// если error == ErrLinkIsAlreadyShortened значит среди пакета были ранее сокращенные ссылки.
	StoreBatch(ctx context.Context, user string, batchIn map[string]string) (batchOut map[string]string, err error)
	// Ping проверяет готовность к работе репозитория.
	Ping(context.Context) error
	// Close завершает работу репозитория в стиле graceful shutdown.
	Close() error
}

Repository описывает контракт работы с хранилищем. Используется для удобства тестирования и для дальнейшей легкой миграции на другой "движок".

type URLID

type URLID string

type URLShortenCorrelatedRequest

type URLShortenCorrelatedRequest struct {
	CorrelationID string `json:"correlation_id"`
	OriginalURL   string `json:"original_url"`
}

URLShortenCorrelatedRequest представляет собой структуру, в которую требуется дериализовать список ссылок для сокращения [

{
  "correlation_id": "4444",
  "original_url": "https://..."
}, ...

]

type URLShortenCorrelatedResponse

type URLShortenCorrelatedResponse struct {
	CorrelationID string `json:"correlation_id"`
	ShortURL      string `json:"short_url"`
}

URLShortenCorrelatedResponse представляет собой структуру, в которой требуется сериализовать список ссылок

[
  {
    "correlation_id": "4444",
    "short_url": "https://..."
  }, ...
]

type URLShortenRequest

type URLShortenRequest struct {
	URL string `json:"url"`
}

URLShortenRequest represents JSON {"url":"<some_url>"}

type URLShortenResponse

type URLShortenResponse struct {
	Result string `json:"result"`
}

URLShortenResponse represents JSON {"result":"<shorten_url>"}

type URLShortener

type URLShortener struct {
	// contains filtered or unexported fields
}

URLShortener - реализует набор методов для сокращения ссылок, хранение их оригинального состояние и открытие по сокращенному варианту. Обеспечивается контроль авторства сокращенных ссылок.

func NewURLShortener

func NewURLShortener(base string, repo Repository) *URLShortener

NewURLShortener создает URLShortener и инициализирует его адресом, по которому будут доступны методы, и репозиторием хранения ссылок.

func (URLShortener) HandleDelete

func (s URLShortener) HandleDelete(w http.ResponseWriter, r *http.Request)

HandleDelete - метод для удаления раннее созданных коротких ссылок. На вход принимается json массив токенов коротких ссылок для удаления.

Example

Пример использования HandleDelete

reader := strings.NewReader(`["111","222"]`)
request := httptest.NewRequest(http.MethodDelete, "/", reader)
w := httptest.NewRecorder()
h := NewURLShortener("http://localhost:8080/", RepoMock{})
h.HandleDelete(w, request)
result := w.Result()
err := result.Body.Close()
if err != nil {
	panic(err)
}
Output:

func (URLShortener) HandleGet

func (s URLShortener) HandleGet(w http.ResponseWriter, r *http.Request)

HandleGet - метод для открытия оригинальной ссылки по короткому варианту.

func (URLShortener) HandleGetUserURLsBucket

func (s URLShortener) HandleGetUserURLsBucket(w http.ResponseWriter, r *http.Request)

HandleGetUserURLsBucket - метод для получения всех сокращенных пользователем ссылок.

func (URLShortener) HandleMethodNotAllowed

func (s URLShortener) HandleMethodNotAllowed(w http.ResponseWriter, _ *http.Request)

HandleMethodNotAllowed обрабатывает не валидный HTTP метод

func (URLShortener) HandleNotFound

func (s URLShortener) HandleNotFound(w http.ResponseWriter, _ *http.Request)

HandleNotFound обрабатывает не найденный путь

func (URLShortener) HandlePostShortenBatch

func (s URLShortener) HandlePostShortenBatch(w http.ResponseWriter, r *http.Request)

HandlePostShortenBatch - метод для создания коротких ссылок одним пакетом, где оригинальные ссылки передаются через JSON.

func (URLShortener) HandlePostShortenJSON

func (s URLShortener) HandlePostShortenJSON(w http.ResponseWriter, r *http.Request)

HandlePostShortenJSON - метод для создания короткой ссылки, где оригинальная ссылка передается с помощью JSON.

func (URLShortener) HandlePostShortenPlain

func (s URLShortener) HandlePostShortenPlain(w http.ResponseWriter, r *http.Request)

HandlePostShortenPlain - метод для создания короткой ссылки, где оригинальная ссылка передается через Text Body.

Example

Пример использования HandlePostShortenPlain

reader := strings.NewReader(`https://habr.com/ru/post/66931/`)
request := httptest.NewRequest(http.MethodPost, "/", reader)
w := httptest.NewRecorder()
h := NewURLShortener("http://localhost:8080/", RepoMock{})
h.HandlePostShortenPlain(w, request)
result := w.Result()

urlResult, err := io.ReadAll(result.Body)
if err != nil {
	panic(err)
}
err = result.Body.Close()
if err != nil {
	panic(err)
}
fmt.Println(string(urlResult))
Output:

http://localhost:8080/1111

func (URLShortener) HeartBeat

func (s URLShortener) HeartBeat(w http.ResponseWriter, r *http.Request)

HeartBeat - метод для проверки, что подключение к репозиторию живое.

Directories

Path Synopsis
Package mock_handlers is a generated GoMock package.
Package mock_handlers is a generated GoMock package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL