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: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Build the Docker image - 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 - name: Docker login
run: docker login gitea.kleinsense.nl -p ${{secrets.docker_password}} -u ${{secrets.docker_username}} run: docker login gitea.kleinsense.nl -p ${{secrets.docker_password}} -u ${{secrets.docker_username}}
- name: Docker push - 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 ( import (
"fmt" "fmt"
bolt "go.etcd.io/bbolt"
"sync" "sync"
bolt "go.etcd.io/bbolt"
) )
type DataStore interface { type DataStore interface {
@ -157,3 +158,21 @@ func (s *BoltStore) EmptyBucket(bucket string) error {
return nil 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 package common
import ( import (
"golang.org/x/crypto/bcrypt"
"log/slog" "log/slog"
"golang.org/x/crypto/bcrypt"
) )
func HashPassword(password string) (string, error) { func HashPassword(password string) (string, error) {

View File

@ -1,9 +1,10 @@
package jwt package jwt
import ( import (
"github.com/golang-jwt/jwt/v5"
"os" "os"
"time" "time"
"github.com/golang-jwt/jwt/v5"
) )
func CreateUserJWT(name string) string { func CreateUserJWT(name string) string {

View File

@ -2,11 +2,12 @@ package jwt
import ( import (
_ "context" _ "context"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
"github.com/golang-jwt/jwt/v5"
"net/http" "net/http"
"os" "os"
"strings" "strings"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
"github.com/golang-jwt/jwt/v5"
) )
func GetVerifiedUser(r *http.Request) (string, error) { 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 # Download and install any required dependencies
RUN go mod download RUN go mod download
COPY . . COPY .. .
# Build the Go app # Build the Go app
RUN go build . 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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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= github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0=

View File

@ -1,7 +1,6 @@
package handler package handler
import ( import (
"log"
"log/slog" "log/slog"
"net/http" "net/http"
) )
@ -33,7 +32,7 @@ func NotImplementedHandler(w http.ResponseWriter) {
func setError(w http.ResponseWriter, httpStatus int, errorMessage string) { func setError(w http.ResponseWriter, httpStatus int, errorMessage string) {
w.WriteHeader(httpStatus) w.WriteHeader(httpStatus)
if _, err := w.Write([]byte(errorMessage)); err != nil { if _, err := w.Write([]byte(errorMessage)); err != nil {
log.Println(err) slog.Error(err.Error())
} }
return return
} }

View File

@ -3,9 +3,10 @@ package handler
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"net/http"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common" "gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt" "gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt"
"net/http"
) )
func LoginHandler(w http.ResponseWriter, r *http.Request) { func LoginHandler(w http.ResponseWriter, r *http.Request) {

View File

@ -2,8 +2,10 @@ package handler
import ( import (
"encoding/json" "encoding/json"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common" "log"
"net/http" "net/http"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
) )
func RegisterHandler(w http.ResponseWriter, r *http.Request) { func RegisterHandler(w http.ResponseWriter, r *http.Request) {
@ -19,7 +21,8 @@ func RegisterHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
// Check if user exists // 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.WriteHeader(http.StatusUnprocessableEntity)
w.Write([]byte(`{"error":"user already exists"}`)) w.Write([]byte(`{"error":"user already exists"}`))
return return

View File

@ -2,9 +2,10 @@ package handler
import ( import (
"encoding/json" "encoding/json"
"net/http"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common" "gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt" "gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt"
"net/http"
) )
func StoreHandler(w http.ResponseWriter, r *http.Request) { func StoreHandler(w http.ResponseWriter, r *http.Request) {

View File

@ -2,10 +2,11 @@ package handler
import ( import (
"encoding/json" "encoding/json"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt"
"net/http" "net/http"
"reflect" "reflect"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt"
) )
func SyncHandler(w http.ResponseWriter, r *http.Request) { func SyncHandler(w http.ResponseWriter, r *http.Request) {

View File

@ -2,12 +2,13 @@ package main
import ( import (
"fmt" "fmt"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/handler"
"log" "log"
"net/http" "net/http"
"os" "os"
"time" "time"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/server/handler"
) )
func main() { func main() {