https://github.com/debrajhyper/todo-space
Develop a TODO API using Golang and ScyllaDB that supports basic CRUD operations and includes pagination functionality for the list endpoint.
https://github.com/debrajhyper/todo-space
golang golang-application scylladb
Last synced: about 1 year ago
JSON representation
Develop a TODO API using Golang and ScyllaDB that supports basic CRUD operations and includes pagination functionality for the list endpoint.
- Host: GitHub
- URL: https://github.com/debrajhyper/todo-space
- Owner: debrajhyper
- Created: 2024-06-04T17:08:41.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-06-11T10:31:10.000Z (almost 2 years ago)
- Last Synced: 2025-02-15T01:44:25.337Z (over 1 year ago)
- Topics: golang, golang-application, scylladb
- Language: Go
- Homepage:
- Size: 531 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: Readme.md
Awesome Lists containing this project
README
Todo Space 📑
## 💡 Objective
Develop a TODO API using Golang and ScyllaDB that supports basic CRUD operations and includes
pagination functionality for the list endpoint.
## 📒 Requirements
- 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).
## ⚙️ API Documentation
### `POST` /v1/todo
Create a new todo item.
- **URL:** `http://localhost:8080/v1/todo`
- **Method:** POST
- **Body:** json
```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"
}

### `PUT` /v1/todo/:id
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` /v1/todo/:id
Delete a specific todo item.
- **URL:** `http://localhost:8080/v1/todo/:id`
- **Method:** DELETE
- **URL Parameters:**
- `id`: ID of the todo item to delete

### `GET` /v1/todo/:id
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

### `GET` /v1/todo
Retrieve all todo items based on filters.
- **URL:** `http://localhost:8080/v1/todo`
- **Method:** GET
- **Query Parameters:**
- `status`: Filter by status (`pending` or `completed`)
- `size`: Number of items to retrieve (default 10)
- `lastPageToken`: Offset for pagination (default 0)


## 🏃♂️ Run Locally
- Clone this repository.
```js
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 run `go 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.
```bash
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:
```bash
CREATE KEYSPACE todo WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
```
- Now enter the command to use the ``todo KEYSPACE``
```bash
use todo;
```
- Now create the ``todos`` table from the below query
```sql
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));
```
## Features Implemented:
- 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).
## Current Architecture:
- 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.
## Future Scope:
- 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.
## 👨🏻💻 Developer's Talk
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.
---