refactor + added client
Some checks failed
build and deploy kleinTodo / build (push) Failing after 28s
Some checks failed
build and deploy kleinTodo / build (push) Failing after 28s
This commit is contained in:
parent
aec751a7d1
commit
fcd0f88f52
2
.github/workflows/Deploy-docker.yml
vendored
2
.github/workflows/Deploy-docker.yml
vendored
@ -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
|
||||
|
||||
33
client/todo/main.go
Normal file
33
client/todo/main.go
Normal file
@ -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)
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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) {
|
||||
|
||||
11
go.mod
11
go.mod
@ -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
|
||||
@ -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 .
|
||||
12
server/go.mod
Normal file
12
server/go.mod
Normal file
@ -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
|
||||
)
|
||||
@ -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=
|
||||
@ -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
|
||||
}
|
||||
@ -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) {
|
||||
@ -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
|
||||
@ -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) {
|
||||
@ -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) {
|
||||
@ -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() {
|
||||
Loading…
x
Reference in New Issue
Block a user