Skip to content

Commit 6fca2c4

Browse files
committed
Initial Commit
0 parents  commit 6fca2c4

File tree

5 files changed

+309
-0
lines changed

5 files changed

+309
-0
lines changed

.gitignore

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
.env
3+
node_modules
4+
5+
# Compiled Object files, Static and Dynamic libs (Shared Objects)
6+
*.o
7+
*.a
8+
*.so
9+
10+
# Folders
11+
_obj
12+
_test
13+
vendor/
14+
15+
# logs
16+
*.log
17+
18+
# Compiled binary files
19+
*.exe
20+
*.out
21+
22+
# macOS specific files
23+
.DS_Store
24+
25+
# Go specific files
26+
# Compiled binary for packages and commands
27+
/bin/
28+
# Output of the go coverage tool, specifically when used with LiteIDE
29+
*.out
30+
31+
# Dependency directories (remove the comment below if you are using dep)

air.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
root = "." # The root directory of the project
2+
tmp_dir = "tmp" # The temporary directory where air will store its temporary files
3+
4+
[build] # The build configuration
5+
bin = "main" # The name of the binary file to be generated after building the project
6+
cmd = "go build -o {{.Output}} {{.Input}}" # The command to build the project
7+
exclude = ["tmp/*", "client/*"] # Specifies the directories to be excluded from monitoring for changes
8+
include = ["**/*.go"] # Specifies the file patterns to be included for monitoring.
9+
ignore = ["tmp/*"] # Specifies the files or directories to be ignored when triggering a build.

go.mod

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module github.com/vigneshs-dev/golang-to-do-app
2+
3+
go 1.23.0
4+
5+
require (
6+
github.com/gofiber/fiber/v2 v2.52.5
7+
github.com/joho/godotenv v1.5.1
8+
go.mongodb.org/mongo-driver v1.17.1
9+
)
10+
11+
require (
12+
github.com/andybalholm/brotli v1.0.5 // indirect
13+
github.com/golang/snappy v0.0.4 // indirect
14+
github.com/google/uuid v1.5.0 // indirect
15+
github.com/klauspost/compress v1.17.0 // indirect
16+
github.com/mattn/go-colorable v0.1.13 // indirect
17+
github.com/mattn/go-isatty v0.0.20 // indirect
18+
github.com/mattn/go-runewidth v0.0.15 // indirect
19+
github.com/montanaflynn/stats v0.7.1 // indirect
20+
github.com/rivo/uniseg v0.2.0 // indirect
21+
github.com/valyala/bytebufferpool v1.0.0 // indirect
22+
github.com/valyala/fasthttp v1.51.0 // indirect
23+
github.com/valyala/tcplisten v1.0.0 // indirect
24+
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
25+
github.com/xdg-go/scram v1.1.2 // indirect
26+
github.com/xdg-go/stringprep v1.0.4 // indirect
27+
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
28+
golang.org/x/crypto v0.26.0 // indirect
29+
golang.org/x/sync v0.8.0 // indirect
30+
golang.org/x/sys v0.23.0 // indirect
31+
golang.org/x/text v0.17.0 // indirect
32+
)

go.sum

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
2+
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
3+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5+
github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo=
6+
github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
7+
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
8+
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
9+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
10+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
11+
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
12+
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
13+
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
14+
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
15+
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
16+
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
17+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
18+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
19+
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
20+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
21+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
22+
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
23+
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
24+
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
25+
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
26+
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
27+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
28+
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
29+
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
30+
github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA=
31+
github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g=
32+
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
33+
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
34+
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
35+
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
36+
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
37+
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
38+
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
39+
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
40+
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
41+
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
42+
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
43+
go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM=
44+
go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4=
45+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
46+
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
47+
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
48+
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
49+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
50+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
51+
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
52+
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
53+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
54+
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
55+
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
56+
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
57+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
58+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
59+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
60+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
61+
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
62+
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
63+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
64+
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
65+
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
66+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
67+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
68+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
69+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
70+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
71+
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
72+
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
73+
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
74+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
75+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
76+
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
77+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

main.go

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"os"
8+
9+
"github.com/gofiber/fiber/v2"
10+
"github.com/joho/godotenv"
11+
"go.mongodb.org/mongo-driver/bson"
12+
"go.mongodb.org/mongo-driver/bson/primitive"
13+
"go.mongodb.org/mongo-driver/mongo"
14+
"go.mongodb.org/mongo-driver/mongo/options"
15+
)
16+
17+
type Todo struct {
18+
ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
19+
Completed bool `json:"completed"`
20+
Body string `json:"body"`
21+
}
22+
23+
var collection *mongo.Collection
24+
25+
func main() {
26+
fmt.Println("hello world")
27+
28+
if os.Getenv("ENV") != "production" {
29+
// Load the .env file if not in production
30+
err := godotenv.Load(".env")
31+
if err != nil {
32+
log.Fatal("Error loading .env file:", err)
33+
}
34+
}
35+
36+
MONGODB_URI := os.Getenv("MONGODB_URI")
37+
clientOptions := options.Client().ApplyURI(MONGODB_URI)
38+
client, err := mongo.Connect(context.Background(), clientOptions)
39+
40+
if err != nil {
41+
log.Fatal(err)
42+
}
43+
44+
defer client.Disconnect(context.Background())
45+
46+
err = client.Ping(context.Background(), nil)
47+
if err != nil {
48+
log.Fatal(err)
49+
}
50+
51+
fmt.Println("Connected to MONGODB ATLAS")
52+
53+
collection = client.Database("golang_db").Collection("todos")
54+
55+
app := fiber.New()
56+
57+
// app.Use(cors.New(cors.Config{
58+
// AllowOrigins: "http://localhost:5173",
59+
// AllowHeaders: "Origin,Content-Type,Accept",
60+
// }))
61+
62+
app.Get("/api/todos", getTodos)
63+
app.Post("/api/todos", createTodo)
64+
app.Patch("/api/todos/:id", updateTodo)
65+
app.Delete("/api/todos/:id", deleteTodo)
66+
67+
port := os.Getenv("PORT")
68+
if port == "" {
69+
port = "5000"
70+
}
71+
72+
if os.Getenv("ENV") == "production" {
73+
app.Static("/", "./client/dist")
74+
}
75+
76+
log.Fatal(app.Listen("0.0.0.0:" + port))
77+
78+
}
79+
80+
func getTodos(c *fiber.Ctx) error {
81+
var todos []Todo
82+
83+
cursor, err := collection.Find(context.Background(), bson.M{})
84+
85+
if err != nil {
86+
return err
87+
}
88+
89+
defer cursor.Close(context.Background())
90+
91+
for cursor.Next(context.Background()) {
92+
var todo Todo
93+
if err := cursor.Decode(&todo); err != nil {
94+
return err
95+
}
96+
todos = append(todos, todo)
97+
}
98+
99+
return c.JSON(todos)
100+
}
101+
102+
func createTodo(c *fiber.Ctx) error {
103+
todo := new(Todo)
104+
// {id:0,completed:false,body:""}
105+
106+
if err := c.BodyParser(todo); err != nil {
107+
return err
108+
}
109+
110+
if todo.Body == "" {
111+
return c.Status(400).JSON(fiber.Map{"error": "Todo body cannot be empty"})
112+
}
113+
114+
insertResult, err := collection.InsertOne(context.Background(), todo)
115+
if err != nil {
116+
return err
117+
}
118+
119+
todo.ID = insertResult.InsertedID.(primitive.ObjectID)
120+
121+
return c.Status(201).JSON(todo)
122+
}
123+
124+
func updateTodo(c *fiber.Ctx) error {
125+
id := c.Params("id")
126+
objectID, err := primitive.ObjectIDFromHex(id)
127+
128+
if err != nil {
129+
return c.Status(400).JSON(fiber.Map{"error": "Invalid todo ID"})
130+
}
131+
132+
filter := bson.M{"_id": objectID}
133+
update := bson.M{"$set": bson.M{"completed": true}}
134+
135+
_, err = collection.UpdateOne(context.Background(), filter, update)
136+
if err != nil {
137+
return err
138+
}
139+
140+
return c.Status(200).JSON(fiber.Map{"success": true})
141+
142+
}
143+
144+
func deleteTodo(c *fiber.Ctx) error {
145+
id := c.Params("id")
146+
objectID, err := primitive.ObjectIDFromHex(id)
147+
148+
if err != nil {
149+
return c.Status(400).JSON(fiber.Map{"error": "Invalid todo ID"})
150+
}
151+
152+
filter := bson.M{"_id": objectID}
153+
_, err = collection.DeleteOne(context.Background(), filter)
154+
155+
if err != nil {
156+
return err
157+
}
158+
159+
return c.Status(200).JSON(fiber.Map{"success": true})
160+
}

0 commit comments

Comments
 (0)