doo is a yet another ToDo app. It implements a REST API that allows creating entries, tagging them and commenting on them, as well as marking them as completed.
doo is implemented in Go and uses Gin web framework and GORM ORM. Database backend of choice is PostgreSQL.
doo can run in Docker. Images are available here.
The easiest way to run doo locally is with docker-compose. Make sure you have it installed, and execute
$ make startall
This will start the database and the REST API server, which will be listening on http://localhost:8080.
The REST API server itself can also run outside of Docker, which can be used for debugging purposes. The database server can be started with
$ make startdb
after which executing
$ make run
will start the REST API server.
The examples below use HTTPie. Check out here for more info on how it works with JSON.
$ http localhost:8080/entries
HTTP/1.1 200 OK
Content-Length: 348
Content-Type: application/json; charset=utf-8
Date: Wed, 17 Feb 2021 18:21:42 GMT
[
{
"Comments": [],
"CompletedAt": 1613585629,
"CreatedAt": 1613585401656,
"ID": 2,
"Tags": [
{
"Entries": null,
"Name": "food"
},
{
"Entries": null,
"Name": "cooking"
}
],
"Text": "Buy Szechuan Sauce. Real quick!",
"UpdatedAt": 1613585629348
},
{
"Comments": [
{
"CreatedAt": 1613586152801,
"EntryID": 1,
"ID": 2,
"Text": "Can't wait to taste it again!",
"UpdatedAt": 1613586152801
}
],
"CompletedAt": null,
"CreatedAt": 1613585231995,
"ID": 1,
"Tags": [],
"Text": "Buy Szechuan Sauce",
"UpdatedAt": 1613586152800
}
]
$ http localhost:8080/entries/1
HTTP/1.1 200 OK
Content-Length: 242
Content-Type: application/json; charset=utf-8
Date: Wed, 17 Feb 2021 18:23:52 GMT
{
"Comments": [
{
"CreatedAt": 1613586152801,
"EntryID": 1,
"ID": 2,
"Text": "Can't wait to taste it again!",
"UpdatedAt": 1613586152801
}
],
"CompletedAt": null,
"CreatedAt": 1613585231995,
"ID": 1,
"Tags": [],
"Text": "Buy Szechuan Sauce",
"UpdatedAt": 1613586152800
}
$ http POST localhost:8080/entries Text="Buy Szechuan Sauce"
HTTP/1.1 201 Created
Content-Length: 135
Content-Type: application/json; charset=utf-8
Date: Wed, 17 Feb 2021 18:07:11 GMT
{
"Comments": null,
"CompletedAt": null,
"CreatedAt": 1613585231995,
"ID": 1,
"Tags": null,
"Text": "Buy Szechuan Sauce",
"UpdatedAt": 1613585231995
}
Entries can also be created with tags
$ http POST localhost:8080/entries Text="Buy Szechuan Sauce" Tags:='[{"Name": "food"}, {"Name": "cooking"}]'
HTTP/1.1 201 Created
Content-Length: 197
Content-Type: application/json; charset=utf-8
Date: Wed, 17 Feb 2021 18:10:01 GMT
{
"Comments": null,
"CompletedAt": null,
"CreatedAt": 1613585401656,
"ID": 2,
"Tags": [
{
"Entries": null,
"Name": "food"
},
{
"Entries": null,
"Name": "cooking"
}
],
"Text": "Buy Szechuan Sauce",
"UpdatedAt": 1613585401656
}
$ http PUT localhost:8080/entries/2 Text="Buy Szechuan Sauce. Real quick!"
HTTP/1.1 200 OK
Content-Length: 148
Content-Type: application/json; charset=utf-8
Date: Wed, 17 Feb 2021 18:11:22 GMT
{
"Comments": null,
"CompletedAt": null,
"CreatedAt": 1613585401656,
"ID": 2,
"Tags": null,
"Text": "Buy Szechuan Sauce. Real quick!",
"UpdatedAt": 1613585482084
}
$ http POST localhost:8080/entries/2/complete
HTTP/1.1 200 OK
Content-Length: 214
Content-Type: application/json; charset=utf-8
Date: Wed, 17 Feb 2021 18:13:49 GMT
{
"Comments": [],
"CompletedAt": 1613585629,
"CreatedAt": 1613585401656,
"ID": 2,
"Tags": [
{
"Entries": null,
"Name": "food"
},
{
"Entries": null,
"Name": "cooking"
}
],
"Text": "Buy Szechuan Sauce. Real quick!",
"UpdatedAt": 1613585629348
}
$ http POST localhost:8080/entries/1/comments Text="Can't wait to taste it again!"
HTTP/1.1 201 Created
Content-Length: 111
Content-Type: application/json; charset=utf-8
Date: Wed, 17 Feb 2021 18:16:26 GMT
{
"CreatedAt": 1613585786227,
"EntryID": 1,
"ID": 1,
"Text": "Can't wait to taste it again!",
"UpdatedAt": 1613585786227
}
$ http DELETE localhost:8080/entries/1/comments/1
HTTP/1.1 200 OK
Content-Length: 0
Date: Wed, 17 Feb 2021 18:18:03 GMT
$ http localhost:8080/tags
HTTP/1.1 200 OK
Content-Length: 539
Content-Type: application/json; charset=utf-8
Date: Wed, 17 Feb 2021 18:26:53 GMT
[
{
"Entries": [
{
"Comments": null,
"CompletedAt": 1613585629,
"CreatedAt": 1613585401656,
"ID": 2,
"Tags": null,
"Text": "Buy Szechuan Sauce. Real quick!",
"UpdatedAt": 1613585629348
}
],
"Name": "food"
},
{
"Entries": [
{
"Comments": null,
"CompletedAt": 1613585629,
"CreatedAt": 1613585401656,
"ID": 2,
"Tags": null,
"Text": "Buy Szechuan Sauce. Real quick!",
"UpdatedAt": 1613585629348
}
],
"Name": "cooking"
},
{
"Entries": [
{
"Comments": null,
"CompletedAt": null,
"CreatedAt": 1613586403406,
"ID": 3,
"Tags": null,
"Text": "Go to Gazorpazorp",
"UpdatedAt": 1613586403406
}
],
"Name": "adventures"
}
]
$ http localhost:8080/tags/adventures
HTTP/1.1 200 OK
Content-Length: 168
Content-Type: application/json; charset=utf-8
Date: Wed, 17 Feb 2021 18:27:43 GMT
{
"Entries": [
{
"Comments": null,
"CompletedAt": null,
"CreatedAt": 1613586403406,
"ID": 3,
"Tags": null,
"Text": "Go to Gazorpazorp",
"UpdatedAt": 1613586403406
}
],
"Name": "adventures"
}
$ echo '[{"Name": "spacetravel"}]' | http POST localhost:8080/entries/3/tag
HTTP/1.1 200 OK
Content-Length: 0
Date: Wed, 17 Feb 2021 18:32:32 GMT
$ http DELETE localhost:8080/entries/3/tags/spacetravel
HTTP/1.1 200 OK
Content-Length: 0
Date: Wed, 17 Feb 2021 18:33:41 GMT
$ http DELETE localhost:8080/entries/3
HTTP/1.1 200 OK
Content-Length: 0
Date: Wed, 17 Feb 2021 18:34:19 GMT
To run all tests execute
$ make test
doo is UNLICENSEd. See UNLICENSE
Content type
Image
Digest
Size
11.4 MB
Last updated
over 5 years ago
docker pull ch00k/doo