refactor + added client
Some checks failed
build and deploy kleinTodo / build (push) Failing after 28s

This commit is contained in:
Darius klein 2025-08-23 13:28:48 +02:00
parent aec751a7d1
commit fcd0f88f52
16 changed files with 92 additions and 28 deletions

View File

@ -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
View 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)
}
}

View File

@ -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
}

View File

@ -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) {

View File

@ -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 {

View File

@ -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
View File

@ -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

View File

@ -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
View 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
)

View File

@ -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=

View File

@ -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
}

View File

@ -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) {

View File

@ -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

View File

@ -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) {

View File

@ -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) {

View File

@ -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() {