Develop a TODO API using Golang and ScyllaDB that supports basic CRUD operations and includes
pagination functionality for the list endpoint.
- Set up a Golang project and integrate ScyllaDB as the database for storing TODO items. Ensure that items in the database are stored user-wise.
- Implement endpoints for creating, reading, updating, and deleting TODO items for a single user at a time. Each TODO item should have at least the following properties: id, user_id, title, description, status, created, updated.
- Implement a paginated list endpoint to retrieve TODO items.
- Provide support for filtering based on TODO item status (e.g., pending, completed).
Create a new todo item.
- URL:
http://localhost:8080/v1/todo
- Method: POST
- Body: json
{ "id": "004599c1-69d7-47b8-8306-a144d7265538", "user_id": "004599c1-69d7-47b8-8306-a144d7265538", "title": "Complete project tasks", "description": "Finish coding the backend and write documentation", "status": "Complete", "created": "2024-06-10T12:00:00Z", "updated": "2024-06-10T12:00:00Z" }
Update a specific todo item.
- URL:
http://localhost:8080/v1/todo/:id
- Method: PUT
- URL Parameters:
id
: ID of the todo item to update
Delete a specific todo item.
- URL:
http://localhost:8080/v1/todo/:id
- Method: DELETE
- URL Parameters:
id
: ID of the todo item to delete
Retrieve details of a specific todo item.
- URL:
http://localhost:8080/v1/todo/:id
- Method: GET
- URL Parameters:
id
: ID of the todo item to retrieve
Retrieve all todo items based on filters.
- URL:
http://localhost:8080/v1/todo
- Method: GET
- Query Parameters:
status
: Filter by status (pending
orcompleted
)size
: Number of items to retrieve (default 10)lastPageToken
: Offset for pagination (default 0)
- Clone this repository.
https://github.com/debrajhyper/Todo-Space.git
- Install Docker Desktop.
- Run
docker-compose -f todospace-api.yml up
to initialize a Scylla-DB instance running on port 9042. - Go from the main directory to
\cmd\api
and then rungo run main.go
to start the service.
Note: If you are facing issue while connecting the golang backend services with the ScyllaDB then run the below steps.
- open
cmd
and enter the command to execute the cqlsh in the scylla-db instance.
docker exec -it scylla-db cqlsh
Note down the IP(172.23.0.2)
(might be change according to your docker configuration) and change it to the scylladb.go
file.
- Now in the cqlsh terminal create the
KEYSPACE
manually by the following command:
CREATE KEYSPACE todo WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
- Now enter the command to use the
todo KEYSPACE
use todo;
- Now create the
todos
table from the below query
CREATE TABLE IF NOT EXISTS todos (id UUID,user_id UUID,title TEXT,description TEXT,status TEXT,created TEXT,updated TEXT,PRIMARY KEY (id, user_id));
- Implemented CRUD routes for interaction b/w server and ScyllaDB.
- The API's are paginated for easy data retrieval.
- The application's DB part is Dockerized and is stateful through volumes.
- Support for filtering based on TODO item status (e.g., pending, completed).
- Containerized approach to solving the problem statement.
- Two Interfaces one for the server and one for db are interacting between each other for the backend application.
- The current architecture is a very basic implementation of the problem statement.
- Depending upon the scale, the entire architecture can be scaled horizontally using nginx load balancing.
- Web can use a queueing mechanism like Rabbit or BullMQ to introduce pub-sub architecture to improve performance.
- The Go-Server could be containerized to improve deployment.
- Introduction to goroutines would increase the overall throughput of the service.
Developed by Debraj Karmakar
This is a small effort from my side to build a small scale project using Golang and ScyllaDB technologies. The experience taught me so many things, as well as the challenges involved in overcoming problems encountered during the development phase. I consider this project very relevant to me as a full-stack developer.