Golastic is a web API offering full text search and CRUD operations on a book collection via Elasticsearch.
You must be able to run Docker and Docker Compose on your local machine to run this app. Refer to the Get Docker and Install Docker Compose docs for their installation.
The app is fully dockerized. To start all required containers, simply run:
make
# alias to:
# docker-compose --env-file ./.env.docker up --build
That's it! The app is ready to be used. See Test with queries to learn about our available queries.
To shut down the containers, run:
make down
# equivalent to:
# docker-compose down
Go 1.16 minimum is required due to the use of newer features (notably go:embed
).
To start the server locally with Elasticsearch containers in the background, run:
make local
# alias to:
# docker-compose --env-file ./.env.local up --detach elasticsearch kibana && \
# go run cmd/main.go --env-file ./.env.local
Alternatively, if you wish to keep track of elasticsearch containers output:
# Terminal window 1 - run elasticsearch containers
make local-env
# alias to:
# docker-compose --env-file ./.env.local up elasticsearch kibana
# Terminal window 2 - run web server
make local-server
# alias to:
# go run cmd/main.go --env-file ./.env.local
You may also want to populate Elasticsearch index with dummy data. See Populate with dummies for more on this.
Run all tests:
make test
# alias to:
# go test -v -timeout 30s ./...
Run a specific test with t
to specify a test and p
to specify a package (parameters are independent):
make test t=TestMarshaling p=pkg/golastic
# alias to:
# go test -v -timeout 30s -run TestMarshaling ./pkg/golastic
Run the linter:
We use golangci-lint in our CI. It runs on each push to a branch with an open PR.
make lint
# alias to:
# golangci-lint run
You may use a CLI flag to populate Elasticsearch's index on start-up. To use it, simply run:
go run cmd/main.go -p
Only the first run (or any run following an erasure of the Docker volume) requires the use of this flag, as the dummy data will not be overwritten.
Refer to the routes specifition for detailed requests queries and responses data. It comes with handy CURL commands to quickly test the routes at runtime.
The main functional packages for the project are:
.
├── cmd
├── internal
│ ├── http
│ └── repository
└── pkg
├── golastic
└── ...
The main application code. It defines domain related entities at its root and its child packages are grouped by dependencies (data access and transport).
Purposeful and reusable library code. It does not import any types from internal
and does not rely on it to work. There is no domain logic inside this directory.
Main application for the project. A main
function imports and call code from internal
or pkg
. It ties all dependencies together and injects runtime variables.
Sub-packages have their own documentation when it is relevant. You may refer to these docs:
Moreover, all types, functions and methods are documented.
This project is part of an school assignement. Our team members are:
- Gregory Albouy
- Thomas Moreira
- Damien Mathieu