From 8a273036709215241c637b8f756898adf1bdf1ae Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 21:56:06 +0000 Subject: [PATCH 01/16] Remove earthignore --- .earthignore | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 .earthignore diff --git a/.earthignore b/.earthignore deleted file mode 100644 index 622e4b4..0000000 --- a/.earthignore +++ /dev/null @@ -1,10 +0,0 @@ -build/ -.git/ -docker-compose.yml -README.md -Earthfile -config.example.json -.gitignore -.vscode/ -budgeteer -budgeteer.exe From c186a14644fe7cfbf8741b6475083a87a6ace73e Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 21:56:23 +0000 Subject: [PATCH 02/16] go mod tidy --- go.mod | 2 +- go.sum | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 240f1d9..957b246 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa ) -require github.com/DATA-DOG/go-txdb v0.1.5 // indirect +require github.com/DATA-DOG/go-txdb v0.1.5 require ( github.com/gin-contrib/sse v0.1.0 // indirect diff --git a/go.sum b/go.sum index 03f0d45..20995cb 100644 --- a/go.sum +++ b/go.sum @@ -74,6 +74,7 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= From fc249adc9e88a868255452d594eef050f2b0a84f Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 21:56:53 +0000 Subject: [PATCH 03/16] Remove Earthfile --- Earthfile | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 Earthfile diff --git a/Earthfile b/Earthfile deleted file mode 100644 index ffc0310..0000000 --- a/Earthfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM golang:1.17 -WORKDIR /src - -build: - COPY go.mod go.sum . - RUN go mod download - COPY . . - RUN --mount=type=cache,target=/root/.cache/go-build go build -o build/budgeteer ./cmd/budgeteer - SAVE ARTIFACT build/budgeteer /budgeteer AS LOCAL build/budgeteer - -docker: - WORKDIR /app - COPY +build/budgeteer . - ENTRYPOINT ["/app/budgeteer"] - SAVE IMAGE hub.javil.eu/budgeteer:latest - -run: - LOCALLY - WITH DOCKER --load=+docker - RUN docker-compose up -d - END From e8028dae349cca22bc10ceefadc4181c50991896 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 21:59:08 +0000 Subject: [PATCH 04/16] Remove woodpecker config --- .woodpecker.yml | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 .woodpecker.yml diff --git a/.woodpecker.yml b/.woodpecker.yml deleted file mode 100644 index 2476945..0000000 --- a/.woodpecker.yml +++ /dev/null @@ -1,23 +0,0 @@ -pipeline: - build: - name: Taskfile.dev - image: hub.javil.eu/budgeteer:dev - pull: true - commands: - - task ci - - docker: - image: plugins/docker - secrets: [ docker_username, docker_password ] - settings: - registry: hub.javil.eu - repo: hub.javil.eu/budgeteer - context: build - dockerfile: build/Dockerfile - tags: - - latest - when: - event: [push, tag, deployment] - -image_pull_secrets: -- hub.javil.eu From 390a04244155b0e362c1cdefe0fe035ebdcf134c Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:00:15 +0000 Subject: [PATCH 05/16] Rename development Dockerfile and build script --- Taskfile.yml | 2 +- docker/{Dockerfile => Dockerfile.dev} | 4 ++-- docker/{build.sh => dev.sh} | 0 3 files changed, 3 insertions(+), 3 deletions(-) rename docker/{Dockerfile => Dockerfile.dev} (94%) rename docker/{build.sh => dev.sh} (100%) diff --git a/Taskfile.yml b/Taskfile.yml index ac286ae..2e3cf85 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -96,7 +96,7 @@ tasks: - ./docker/build.sh - ./web/package.json cmds: - - docker build -t {{.IMAGE_NAME}}:dev . -f docker/Dockerfile + - docker build -t {{.IMAGE_NAME}}:dev . -f docker/Dockerfile.dev - docker push {{.IMAGE_NAME}}:dev run: diff --git a/docker/Dockerfile b/docker/Dockerfile.dev similarity index 94% rename from docker/Dockerfile rename to docker/Dockerfile.dev index 1775bfb..07183db 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile.dev @@ -6,7 +6,7 @@ RUN go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest FROM alpine RUN apk --no-cache add go nodejs yarn bash curl git git-perl tmux -ADD docker/build.sh / +ADD docker/dev.sh / RUN yarn global add @vue/cli ENV PATH="/root/.yarn/bin/:${PATH}" WORKDIR /src/web @@ -14,4 +14,4 @@ ADD web/package.json web/yarn.lock /src/web/ RUN yarn WORKDIR /src COPY --from=godeps /root/go/bin/task /root/go/bin/sqlc /root/go/bin/golangci-lint /usr/local/bin/ -CMD /build.sh +CMD /dev.sh diff --git a/docker/build.sh b/docker/dev.sh similarity index 100% rename from docker/build.sh rename to docker/dev.sh From 70edb382e1e5a33da6fbf2272c67669b37e89d6c Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:00:47 +0000 Subject: [PATCH 06/16] Move compose files to docker directory --- docker-compose.dev.yml => docker/docker-compose.dev.yml | 0 docker-compose.yml => docker/docker-compose.yml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename docker-compose.dev.yml => docker/docker-compose.dev.yml (100%) rename docker-compose.yml => docker/docker-compose.yml (100%) diff --git a/docker-compose.dev.yml b/docker/docker-compose.dev.yml similarity index 100% rename from docker-compose.dev.yml rename to docker/docker-compose.dev.yml diff --git a/docker-compose.yml b/docker/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to docker/docker-compose.yml From 6712af10d94b2795b2a376eee68e3c24c873c73a Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:01:03 +0000 Subject: [PATCH 07/16] Move production Dockerfile to docker directory --- {build => docker}/Dockerfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {build => docker}/Dockerfile (100%) diff --git a/build/Dockerfile b/docker/Dockerfile similarity index 100% rename from build/Dockerfile rename to docker/Dockerfile From d4287f8aace71861d371ac5145861b2eea526082 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:01:10 +0000 Subject: [PATCH 08/16] Remove example config --- config.example.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 config.example.json diff --git a/config.example.json b/config.example.json deleted file mode 100644 index 0a97561..0000000 --- a/config.example.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "DatabaseHost": "localhost", - "DatabaseUser": "user", - "DatabasePassword": "thisismypassword", - "DatabaseName": "budgeteer" -} \ No newline at end of file From 7fdd8bd9359953cfcc082e28265cc97a491d2d9f Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:06:58 +0000 Subject: [PATCH 09/16] Split jwt into two files --- jwt/{login.go => token-verifier.go} | 66 +++++------------------------ jwt/token.go | 49 +++++++++++++++++++++ 2 files changed, 60 insertions(+), 55 deletions(-) rename jwt/{login.go => token-verifier.go} (68%) create mode 100644 jwt/token.go diff --git a/jwt/login.go b/jwt/token-verifier.go similarity index 68% rename from jwt/login.go rename to jwt/token-verifier.go index 190ebd7..a10c7f9 100644 --- a/jwt/login.go +++ b/jwt/token-verifier.go @@ -12,31 +12,26 @@ import ( // TokenVerifier verifies Tokens. type TokenVerifier struct { - secret string + Expiration int + secret string } -var ErrEmptySecret = fmt.Errorf("secret is required") - func NewTokenVerifier(secret string) (*TokenVerifier, error) { if secret == "" { return nil, ErrEmptySecret } return &TokenVerifier{ - secret: secret, + Expiration: 72, + secret: secret, }, nil } -// Token contains everything to authenticate a user. -type Token struct { - username string - name string - expiry float64 - id uuid.UUID -} - -const ( - expiration = 72 +var ( + ErrUnexpectedSigningMethod = fmt.Errorf("unexpected signing method") + ErrInvalidToken = fmt.Errorf("token is invalid") + ErrTokenExpired = fmt.Errorf("token has expired") + ErrEmptySecret = fmt.Errorf("secret is required") ) // CreateToken creates a new token from username and name. @@ -48,7 +43,7 @@ func (tv *TokenVerifier) CreateToken(user *postgres.User) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "usr": user.Email, "name": user.Name, - "exp": time.Now().Add(time.Hour * expiration).Unix(), + "exp": time.Now().Add(time.Hour * time.Duration(tv.Expiration)).Unix(), "id": user.ID, }) @@ -61,13 +56,7 @@ func (tv *TokenVerifier) CreateToken(user *postgres.User) (string, error) { return t, nil } -var ( - ErrUnexpectedSigningMethod = fmt.Errorf("unexpected signing method") - ErrInvalidToken = fmt.Errorf("token is invalid") - ErrTokenExpired = fmt.Errorf("token has expired") -) - -// VerifyToken verifys a given string-token. +// VerifyToken verifies a given string-token. func (tv *TokenVerifier) VerifyToken(tokenString string) (budgeteer.Token, error) { //nolint:ireturn if tv.secret == "" { return nil, ErrEmptySecret @@ -96,36 +85,3 @@ func (tv *TokenVerifier) VerifyToken(tokenString string) (budgeteer.Token, error } return tkn, nil } - -func verifyToken(token *jwt.Token) (jwt.MapClaims, error) { - if !token.Valid { - return nil, ErrInvalidToken - } - - claims, ok := token.Claims.(jwt.MapClaims) - if !ok { - return nil, ErrInvalidToken - } - - if !claims.VerifyExpiresAt(time.Now().Unix(), true) { - return nil, ErrTokenExpired - } - - return claims, nil -} - -func (t *Token) GetName() string { - return t.name -} - -func (t *Token) GetUsername() string { - return t.username -} - -func (t *Token) GetExpiry() float64 { - return t.expiry -} - -func (t *Token) GetID() uuid.UUID { - return t.id -} diff --git a/jwt/token.go b/jwt/token.go new file mode 100644 index 0000000..c9537cd --- /dev/null +++ b/jwt/token.go @@ -0,0 +1,49 @@ +package jwt + +import ( + "time" + + "github.com/dgrijalva/jwt-go" + "github.com/google/uuid" +) + +// Token contains everything to authenticate a user. +type Token struct { + username string + name string + expiry float64 + id uuid.UUID +} + +func verifyToken(token *jwt.Token) (jwt.MapClaims, error) { + if !token.Valid { + return nil, ErrInvalidToken + } + + claims, ok := token.Claims.(jwt.MapClaims) + if !ok { + return nil, ErrInvalidToken + } + + if !claims.VerifyExpiresAt(time.Now().Unix(), true) { + return nil, ErrTokenExpired + } + + return claims, nil +} + +func (t *Token) GetName() string { + return t.name +} + +func (t *Token) GetUsername() string { + return t.username +} + +func (t *Token) GetExpiry() float64 { + return t.expiry +} + +func (t *Token) GetID() uuid.UUID { + return t.id +} From 0c5f68ed80753e326de2cbdd6ec4744e89d6e9b5 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:10:17 +0000 Subject: [PATCH 10/16] Hide files generated by sqlc --- .vscode/settings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b61973e..19b993c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,8 @@ { "files.exclude": { "**/node_modules": true, - "**/vendor": true + "**/vendor": true, + "**/*.sql.go": true }, "gopls": { "formatting.gofumpt": true, From f3a50c790b6ceea7a8def2946f680a06be12e754 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:16:20 +0000 Subject: [PATCH 11/16] Hide .task, build and dist folders --- .vscode/settings.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 19b993c..1820a53 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,10 @@ "files.exclude": { "**/node_modules": true, "**/vendor": true, - "**/*.sql.go": true + "**/*.sql.go": true, + ".task/": true, + "build/": true, + "web/dist/": true }, "gopls": { "formatting.gofumpt": true, From 4c93e4635d8cc01a60e9258ee1e63d249fc69352 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:16:32 +0000 Subject: [PATCH 12/16] Extract const for default expiration --- jwt/token-verifier.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/jwt/token-verifier.go b/jwt/token-verifier.go index a10c7f9..a2af4f4 100644 --- a/jwt/token-verifier.go +++ b/jwt/token-verifier.go @@ -12,17 +12,19 @@ import ( // TokenVerifier verifies Tokens. type TokenVerifier struct { - Expiration int + Expiration time.Duration secret string } +const DEFAULT_EXPIRATION = time.Hour * time.Duration(72) + func NewTokenVerifier(secret string) (*TokenVerifier, error) { if secret == "" { return nil, ErrEmptySecret } return &TokenVerifier{ - Expiration: 72, + Expiration: time.Hour * time.Duration(72), secret: secret, }, nil } @@ -43,7 +45,7 @@ func (tv *TokenVerifier) CreateToken(user *postgres.User) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "usr": user.Email, "name": user.Name, - "exp": time.Now().Add(time.Hour * time.Duration(tv.Expiration)).Unix(), + "exp": time.Now().Add(tv.Expiration).Unix(), "id": user.ID, }) From 9ce0da0182f327b9262c07755d19b0db82d266bd Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:17:01 +0000 Subject: [PATCH 13/16] Move CSS to _index.css --- web/src/App.vue | 10 +--------- web/src/index.css | 6 ++++++ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/web/src/App.vue b/web/src/App.vue index 5c97623..0a206c1 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -54,12 +54,4 @@ export default defineComponent({ - - - + \ No newline at end of file diff --git a/web/src/index.css b/web/src/index.css index ee11269..345b41c 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -8,4 +8,10 @@ h1 { a { text-decoration: underline; +} + +#app { + font-family: Avenir, Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } \ No newline at end of file From 946f14c1cca611bb49e48e66e76d0c4ae6c89ab4 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:18:47 +0000 Subject: [PATCH 14/16] Fix const --- jwt/token-verifier.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jwt/token-verifier.go b/jwt/token-verifier.go index a2af4f4..e247f12 100644 --- a/jwt/token-verifier.go +++ b/jwt/token-verifier.go @@ -16,7 +16,7 @@ type TokenVerifier struct { secret string } -const DEFAULT_EXPIRATION = time.Hour * time.Duration(72) +const DefaultExpiration = time.Hour * time.Duration(72) func NewTokenVerifier(secret string) (*TokenVerifier, error) { if secret == "" { @@ -24,7 +24,7 @@ func NewTokenVerifier(secret string) (*TokenVerifier, error) { } return &TokenVerifier{ - Expiration: time.Hour * time.Duration(72), + Expiration: DefaultExpiration, secret: secret, }, nil } From 971c3d3be5dd5ded1aef4363c77f80c50cd8e615 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:37:43 +0000 Subject: [PATCH 15/16] Improve sidebar and show next to appbar instead of below --- web/src/App.vue | 37 +++++++++++++++++++-------------- web/src/pages/BudgetSidebar.vue | 24 ++++++++++----------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/web/src/App.vue b/web/src/App.vue index 0a206c1..83b0eed 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -28,29 +28,34 @@ export default defineComponent({ From 38e21786a7816fdafc2c9a1794d0056fd20fcf33 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 2 Mar 2022 22:48:16 +0000 Subject: [PATCH 16/16] Fix app bar for small screens --- web/index.html | 2 +- web/src/App.vue | 52 ++++++++++++++++----------------- web/src/pages/BudgetSidebar.vue | 2 +- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/web/index.html b/web/index.html index 791426e..b2535d4 100644 --- a/web/index.html +++ b/web/index.html @@ -6,7 +6,7 @@ Vite App - +
diff --git a/web/src/App.vue b/web/src/App.vue index 83b0eed..2345236 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -27,35 +27,33 @@ export default defineComponent({