From e7f6983a22274f4297dbdcdf7844d63941f700ac Mon Sep 17 00:00:00 2001 From: vinchent Date: Tue, 13 Aug 2024 22:00:07 +0200 Subject: [PATCH] Saving token to DB --- cmd/api/handlers-api.go | 24 ++++++++++++++++--- internal/models/tokens.go | 23 ++++++++++++++++++ ...240813194454_create_tokens_table.down.fizz | 2 ++ ...20240813194454_create_tokens_table.up.fizz | 11 +++++++++ 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 migrations/20240813194454_create_tokens_table.down.fizz create mode 100644 migrations/20240813194454_create_tokens_table.up.fizz diff --git a/cmd/api/handlers-api.go b/cmd/api/handlers-api.go index 93a1b4e..2767fd6 100644 --- a/cmd/api/handlers-api.go +++ b/cmd/api/handlers-api.go @@ -2,10 +2,12 @@ package main import ( "encoding/json" + "fmt" "myapp/internal/cards" "myapp/internal/models" "net/http" "strconv" + "time" "github.com/go-chi/chi/v5" "github.com/stripe/stripe-go/v79" @@ -266,16 +268,32 @@ func (app *application) CreateAuthToken(w http.ResponseWriter, r *http.Request) } // generate the token + token, err := models.GenerateToken(user.ID, 24*time.Hour, models.ScopeAuthentication) + if err != nil { + app.errorLog.Println(err) + app.badRequest(w, r, err) + return + } + + // save to DB + err = app.DB.InsertToken(token, user) + if err != nil { + app.errorLog.Println(err) + app.badRequest(w, r, err) + return + } // send response var payload struct { - Error bool `json:"error"` - Message string `json:"message"` + Error bool `json:"error"` + Message string `json:"message"` + Token *models.Token `json:"authentication_token"` } payload.Error = false - payload.Message = "Success!" + payload.Message = fmt.Sprintf("token for %s created", userInput.Email) + payload.Token = token _ = app.writeJSON(w, http.StatusOK, payload) } diff --git a/internal/models/tokens.go b/internal/models/tokens.go index 26282a6..4848dff 100644 --- a/internal/models/tokens.go +++ b/internal/models/tokens.go @@ -1,6 +1,7 @@ package models import ( + "context" "crypto/rand" "crypto/sha256" "encoding/base32" @@ -40,3 +41,25 @@ func GenerateToken(userID int, ttl time.Duration, scope string) (*Token, error) token.Hash = hash[:] return token, nil } + +func (m *DBModel) InsertToken(t *Token, u User) error { + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + + stmt := `INSERT INTO tokens + (user_id, name, email, token_hash, created_at, updated_at) + VALUES (?, ?, ?, ?, ?, ?)` + + _, err := m.DB.ExecContext(ctx, stmt, + u.ID, + u.LastName, + u.Email, + t.Hash, + time.Now(), + time.Now(), + ) + if err != nil { + return err + } + return nil +} diff --git a/migrations/20240813194454_create_tokens_table.down.fizz b/migrations/20240813194454_create_tokens_table.down.fizz new file mode 100644 index 0000000..acdd2f7 --- /dev/null +++ b/migrations/20240813194454_create_tokens_table.down.fizz @@ -0,0 +1,2 @@ +drop_table("tokens") + diff --git a/migrations/20240813194454_create_tokens_table.up.fizz b/migrations/20240813194454_create_tokens_table.up.fizz new file mode 100644 index 0000000..bf17ec9 --- /dev/null +++ b/migrations/20240813194454_create_tokens_table.up.fizz @@ -0,0 +1,11 @@ +create_table("tokens") { + t.Column("id", "integer", {primary: true}) + t.Column("user_id", "integer", {"unsigned": true}) + t.Column("name", "string", {"size": 255}) + t.Column("email", "string", {}) + t.Column("token_hash", "string", {}) +} + +sql("ALTER TABLE tokens MODIFY token_hash varbinary(255);") +sql("ALTER TABLE tokens ALTER COLUMN created_at SET DEFAULT now();") +sql("ALTER TABLE tokens ALTER COLUMN updated_at SET DEFAULT now();")