Skip to content

Latest commit

 

History

History
134 lines (95 loc) · 3.67 KB

README.md

File metadata and controls

134 lines (95 loc) · 3.67 KB

API Cache

Test task taken somewhere from the internet.

Goal

Write server application that has an HTTP API for working with string key-value storage in RAM.

Each key must have its own lifetime, which is extended when the key value changes. If the time has expired, then the key with the value is deleted from the storage regardless of user requests.

Need implement the WEB API that allows to work with the key-value storage:

  • set the value for the given key (if the key already exists, then it is updated, if not, it is added)
  • return the value for the given key (if there is no value, an error is returned)
  • delete the value for the given key (if there is no value, do nothing)

Constraints: there can be any number of network connections, but a limited number of goroutines accessing the storage inside the application. That's why was selected another approach than simple rate limiter because rate limiter must limit network connections, not internal.

System Requirements

go version
# go version go1.22 ...

redis-server --version
# Redis server v=7.2.5 ...

memcached --version
# memcached 1.6.29 ...

Environment

Note: use prefix APICACHE_ for enable variable to be caught in runtime.

Variable Type Description
DEBUG bool Enable debug mode or not
DRIVER_NAME ["machine", "memcached", "redis"] Driver type (supported)
DRIVER_ADDRESS string Driver DSN address
DRIVER_MAX_CONN int Maximum number of simultaneous connections to the API
DRIVER_CONN_TIMEOUT time.Duration Connection timeout for application

Development

Download sources

export PROJECT_ROOT=apicache
git clone https://github.com/therenotomorrow/apicache.git ${PROJECT_ROOT}
cd ${PROJECT_ROOT}

Setup project requirements

# setup requirements
go mod download
go mod verify

# lint GO code
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.59.1

# create documentation on API
go install github.com/swaggo/swag/cmd/swag@v1.16.3

Setup project environment

cp ./configs/.env.example .env
vim .env

Taste it ❤️

# check code integrity
make docs code test/smoke

# run application
go run cmd/app/main.go

# check everything works
open 'http://127.0.0.1:8080/api/docs/'

Setup safe development

./scripts/pre-commit.sh

Testing

Controls by test.sh or Makefile and contains:

# fast unit tests to be sure that no regression was 
make test/smoke

# same as test/smoke but with -race condition check
make test/unit

# integration (driver, etc.) tests that needed external resources, also with -race condition
# ATTENTION: before run make sure that redis and memcached are available
make driver/redis &
make driver/memcached &
make test/integration

# combines both (test/unit and test/integration) to create local coverage report in HTML
make test/coverage

Docker

You could use Dockerfile for build and development.

docker build -f builds/app/Dockerfile -t apicache .

docker run -p 8080:8080 --env-file .env apicache