diff --git a/.github/workflows/Deploy-docker.yml b/.github/workflows/Deploy-docker.yml index 82443f7..0d584b3 100644 --- a/.github/workflows/Deploy-docker.yml +++ b/.github/workflows/Deploy-docker.yml @@ -15,7 +15,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Build the Docker image - run: docker build -t gitea.kleinsense.nl/dariusklein/klein_todo:latest . + run: docker build -t gitea.kleinsense.nl/dariusklein/klein_todo:latest ./server/. - name: Docker login run: docker login gitea.kleinsense.nl -p ${{secrets.docker_password}} -u ${{secrets.docker_username}} - name: Docker push diff --git a/client/todo/main.go b/client/todo/main.go new file mode 100644 index 0000000..05ac803 --- /dev/null +++ b/client/todo/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "context" + "log" + "net/mail" + "os" + + "github.com/urfave/cli/v3" +) + +func main() { + + app := &cli.Command{ + Name: "Todo", + Usage: "kleinTodo client", + UsageText: "Todo [category] [command] [arguments...]", + Version: "v0.1.0", + HideVersion: true, + Authors: []any{ + mail.Address{ + Name: "Darius", + Address: "darius.klein@dariusklein.nl", + }, + }, + DefaultCommand: "help", + Commands: []*cli.Command{}, + } + + if err := app.Run(context.Background(), os.Args); err != nil { + log.Fatal(err) + } +} diff --git a/common/bolt.go b/common/bolt.go index 634857e..aa247c3 100644 --- a/common/bolt.go +++ b/common/bolt.go @@ -2,8 +2,9 @@ package common import ( "fmt" - bolt "go.etcd.io/bbolt" "sync" + + bolt "go.etcd.io/bbolt" ) type DataStore interface { @@ -157,3 +158,21 @@ func (s *BoltStore) EmptyBucket(bucket string) error { return nil }) } + +// ExistsByKey returns bool if key already exists +func (s *BoltStore) ExistsByKey(bucket, key string) (bool, error) { + var exists bool + err := s.DB.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(bucket)) + if b == nil { + return nil // Bucket doesn't exist, nothing to do + } + // Get returns nil if the key doesn't exist + valBytes := b.Get([]byte(key)) + if valBytes != nil { + exists = string(valBytes) == key + } + return nil + }) + return exists, err +} diff --git a/common/hash.go b/common/hash.go index 6728901..c3d150b 100644 --- a/common/hash.go +++ b/common/hash.go @@ -1,8 +1,9 @@ package common import ( - "golang.org/x/crypto/bcrypt" "log/slog" + + "golang.org/x/crypto/bcrypt" ) func HashPassword(password string) (string, error) { diff --git a/common/jwt/create.go b/common/jwt/create.go index a7b5ac2..02a9f51 100644 --- a/common/jwt/create.go +++ b/common/jwt/create.go @@ -1,9 +1,10 @@ package jwt import ( - "github.com/golang-jwt/jwt/v5" "os" "time" + + "github.com/golang-jwt/jwt/v5" ) func CreateUserJWT(name string) string { diff --git a/common/jwt/verify.go b/common/jwt/verify.go index 3f1a29e..e5ae74d 100644 --- a/common/jwt/verify.go +++ b/common/jwt/verify.go @@ -2,11 +2,12 @@ package jwt import ( _ "context" - "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" - "github.com/golang-jwt/jwt/v5" "net/http" "os" "strings" + + "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" + "github.com/golang-jwt/jwt/v5" ) func GetVerifiedUser(r *http.Request) (string, error) { diff --git a/go.mod b/go.mod deleted file mode 100644 index dc0dcca..0000000 --- a/go.mod +++ /dev/null @@ -1,11 +0,0 @@ -module gitea.kleinsense.nl/DariusKlein/kleinTodo - -go 1.24.4 - -require ( - github.com/golang-jwt/jwt/v5 v5.2.3 - go.etcd.io/bbolt v1.4.2 - golang.org/x/crypto v0.40.0 -) - -require golang.org/x/sys v0.34.0 // indirect diff --git a/Dockerfile b/server/Dockerfile similarity index 97% rename from Dockerfile rename to server/Dockerfile index 6679845..82e0d35 100644 --- a/Dockerfile +++ b/server/Dockerfile @@ -9,7 +9,7 @@ COPY go.sum . # Download and install any required dependencies RUN go mod download -COPY . . +COPY .. . # Build the Go app RUN go build . diff --git a/server/go.mod b/server/go.mod new file mode 100644 index 0000000..e4ef449 --- /dev/null +++ b/server/go.mod @@ -0,0 +1,12 @@ +module gitea.kleinsense.nl/DariusKlein/kleinTodo/server + +go 1.24.4 + +require gitea.kleinsense.nl/DariusKlein/kleinTodo v0.0.0-20250726220241-aec751a7d11c + +require ( + github.com/golang-jwt/jwt/v5 v5.2.3 // indirect + go.etcd.io/bbolt v1.4.2 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/sys v0.34.0 // indirect +) diff --git a/go.sum b/server/go.sum similarity index 85% rename from go.sum rename to server/go.sum index 02e8c4d..0631cb1 100644 --- a/go.sum +++ b/server/go.sum @@ -1,3 +1,5 @@ +gitea.kleinsense.nl/DariusKlein/kleinTodo v0.0.0-20250726220241-aec751a7d11c h1:RgWKGza/JhMdQ9J21vMr0UScUtmfVPV6mWIrqKn3qMk= +gitea.kleinsense.nl/DariusKlein/kleinTodo v0.0.0-20250726220241-aec751a7d11c/go.mod h1:7YK1WqIWutf5OWwn2EbfOu/ZfZXX3z5hcpgR1dShUlQ= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0= diff --git a/handler/errorHandlers.go b/server/handler/errorHandlers.go similarity index 98% rename from handler/errorHandlers.go rename to server/handler/errorHandlers.go index 0fc6dad..728eb5d 100644 --- a/handler/errorHandlers.go +++ b/server/handler/errorHandlers.go @@ -1,7 +1,6 @@ package handler import ( - "log" "log/slog" "net/http" ) @@ -33,7 +32,7 @@ func NotImplementedHandler(w http.ResponseWriter) { func setError(w http.ResponseWriter, httpStatus int, errorMessage string) { w.WriteHeader(httpStatus) if _, err := w.Write([]byte(errorMessage)); err != nil { - log.Println(err) + slog.Error(err.Error()) } return } diff --git a/handler/loginHandler.go b/server/handler/loginHandler.go similarity index 99% rename from handler/loginHandler.go rename to server/handler/loginHandler.go index 5e285a2..a3a4f91 100644 --- a/handler/loginHandler.go +++ b/server/handler/loginHandler.go @@ -3,9 +3,10 @@ package handler import ( "encoding/json" "errors" + "net/http" + "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" "gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt" - "net/http" ) func LoginHandler(w http.ResponseWriter, r *http.Request) { diff --git a/handler/registerHandler.go b/server/handler/registerHandler.go similarity index 87% rename from handler/registerHandler.go rename to server/handler/registerHandler.go index df16b3e..29104dd 100644 --- a/handler/registerHandler.go +++ b/server/handler/registerHandler.go @@ -2,8 +2,10 @@ package handler import ( "encoding/json" - "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" + "log" "net/http" + + "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" ) func RegisterHandler(w http.ResponseWriter, r *http.Request) { @@ -19,7 +21,8 @@ func RegisterHandler(w http.ResponseWriter, r *http.Request) { return } // Check if user exists - if len(db.GetFromBucketByKey(common.UserBucket, user.Username)) > 0 { + if exists, err := db.ExistsByKey(common.UserBucket, user.Username); exists || err != nil { + log.Println(err.Error()) w.WriteHeader(http.StatusUnprocessableEntity) w.Write([]byte(`{"error":"user already exists"}`)) return diff --git a/handler/storeHandler.go b/server/handler/storeHandler.go similarity index 99% rename from handler/storeHandler.go rename to server/handler/storeHandler.go index c2ae0e7..e472a5d 100644 --- a/handler/storeHandler.go +++ b/server/handler/storeHandler.go @@ -2,9 +2,10 @@ package handler import ( "encoding/json" + "net/http" + "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" "gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt" - "net/http" ) func StoreHandler(w http.ResponseWriter, r *http.Request) { diff --git a/handler/syncHandler.go b/server/handler/syncHandler.go similarity index 99% rename from handler/syncHandler.go rename to server/handler/syncHandler.go index 1777d6f..92f5e76 100644 --- a/handler/syncHandler.go +++ b/server/handler/syncHandler.go @@ -2,10 +2,11 @@ package handler import ( "encoding/json" - "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" - "gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt" "net/http" "reflect" + + "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" + "gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt" ) func SyncHandler(w http.ResponseWriter, r *http.Request) { diff --git a/main.go b/server/main.go similarity index 95% rename from main.go rename to server/main.go index 44a0209..c64b944 100644 --- a/main.go +++ b/server/main.go @@ -2,12 +2,13 @@ package main import ( "fmt" - "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" - "gitea.kleinsense.nl/DariusKlein/kleinTodo/handler" "log" "net/http" "os" "time" + + "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" + "gitea.kleinsense.nl/DariusKlein/kleinTodo/server/handler" ) func main() {