diff --git a/internal/handlers/app.go b/internal/handlers/app.go index a6522d9..b7a46b0 100644 --- a/internal/handlers/app.go +++ b/internal/handlers/app.go @@ -21,6 +21,6 @@ func (h *AppHandler) GetHomePage(c *fiber.Ctx) error { return c.Render("home", fiber.Map{}) } -func (h *AppHandler) GetKeyPage(c *fiber.Ctx) error { - return c.Render("keys", fiber.Map{}) +func (h *AppHandler) GetKeysPage(c *fiber.Ctx) error { + return c.Render("keys", fiber.Map{}, "layouts/app") } diff --git a/internal/handlers/keys.go b/internal/handlers/keys.go index 2f463fe..6372146 100644 --- a/internal/handlers/keys.go +++ b/internal/handlers/keys.go @@ -3,15 +3,14 @@ package handlers import ( "errors" "fmt" + "github.com/gofiber/fiber/v2" + "github.com/oklog/ulid/v2" "log/slog" "math/rand" "time" "visio/internal/store" "visio/internal/types" "visio/pkg" - - "github.com/gofiber/fiber/v2" - "github.com/oklog/ulid/v2" ) type KeyHandler struct { @@ -31,70 +30,59 @@ func NewKeyHandler(keysStore *store.Keys, sessionsStore *store.Sessions, logger func generateKey(length int) string { const CHARACTER_POOL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_=+:;'/?><|" key := "" - for i := 0; i < length; i++ { idx := rand.Intn(len(CHARACTER_POOL)) key += string(CHARACTER_POOL[idx]) } - return key } func (h *KeyHandler) CreateKey(c *fiber.Ctx) error { currentUser, ok := c.Locals("currentUser").(*types.User) - if !ok { err := errors.New("Error during currentUser type conversion") h.logger.Error(err.Error()) return c.SendStatus(fiber.StatusUnauthorized) } - const KEY_LIMIT = 3 - - // Check how many number of keys the user has already created key_count, err := h.keys.CountByOwnerId(currentUser.Id) - fmt.Println("Key count", key_count) if err != nil { h.logger.Error(err.Error()) return c.SendStatus(fiber.StatusInternalServerError) } - if key_count > KEY_LIMIT { err := errors.New("Limit of keys exceeded") h.logger.Error(err.Error()) return c.SendStatus(fiber.StatusForbidden) } - - // Generate prefix - ULID format prefix := ulid.Make().String() - - // Generate 23 characters long string - the key key := generateKey(23) - - // Hash the key hashedKey, err := pkg.Hash(key) if err != nil { h.logger.Error(err.Error()) return c.SendStatus(fiber.StatusInternalServerError) } - generatedKey := &types.Key{ - KeyOwner: currentUser.Id, - Prefix: prefix, - KeyHash: hashedKey, - KeyCreationDate: time.Now().UTC(), + UserId: currentUser.Id, + Prefix: prefix, + KeyHash: hashedKey, + CreationDate: time.Now().UTC(), } - - _ = hashedKey - - // Store key and prefix in DB if err := h.keys.Insert(generatedKey); err != nil { h.logger.Error(err.Error()) return c.SendStatus(fiber.StatusInternalServerError) } - - //Return key in format . to user finalKey := fmt.Sprintf("%s.%s", prefix, key) - return c.Send([]byte(finalKey)) + err = c.JSON( + map[string]interface{}{ + "data": map[string]string{ + "key": finalKey, + }, + }, + ) + if err != nil { + return c.SendStatus(fiber.StatusInternalServerError) + } + return c.SendStatus(fiber.StatusCreated) } diff --git a/internal/store/keys.go b/internal/store/keys.go index 4d05754..7aebc45 100644 --- a/internal/store/keys.go +++ b/internal/store/keys.go @@ -2,9 +2,8 @@ package store import ( "fmt" - "visio/internal/types" - "github.com/jmoiron/sqlx" + "visio/internal/types" ) type Keys struct { @@ -20,22 +19,20 @@ func NewKeysStore(db *sqlx.DB) *Keys { func (k *Keys) Insert(key *types.Key) error { _, err := k.db.NamedExec( ` - insert into keys(key_owner, prefix, key_hash, key_creation_date) - values (:key_owner, :prefix, :key_hash, :key_creation_date) + insert into keys(user_id, prefix, key_hash, creation_date) + values (:user_id, :prefix, :key_hash, :creation_date) `, key, ) - if err != nil { return fmt.Errorf("Error while inserting new key: %w", err) } - return nil } func (k *Keys) CountByOwnerId(ownerId string) (int, error) { count := 0 - err := k.db.QueryRowx("select count(*) from keys where key_owner=$1", ownerId).Scan(&count) + err := k.db.QueryRowx("select count(*) from keys where user_id=$1", ownerId).Scan(&count) if err != nil { return 0, fmt.Errorf("Error while counting keys by owner id: %w", err) } diff --git a/internal/types/keys.go b/internal/types/keys.go index c4338a3..57d3176 100644 --- a/internal/types/keys.go +++ b/internal/types/keys.go @@ -3,8 +3,8 @@ package types import "time" type Key struct { - KeyOwner string `json:"key_owner" db:"key_owner"` - Prefix string `json:"prefix" db:"prefix"` - KeyHash string `json:"key_hash" db:"key_hash"` - KeyCreationDate time.Time `json:"key_creation_date" db:"key_creation_date"` + UserId string `json:"user_id" db:"user_id"` + Prefix string `json:"prefix" db:"prefix"` + KeyHash string `json:"key_hash" db:"key_hash"` + CreationDate time.Time `json:"creation_date" db:"creation_date"` } diff --git a/main.go b/main.go index 0da31d1..833a62f 100644 --- a/main.go +++ b/main.go @@ -47,7 +47,7 @@ func main() { client.Get("/", appHandler.GetLandingPage) client.Get("/auth", appHandler.GetAuthPage) client.Get("/home", authMiddleware.CookieAuth, appHandler.GetHomePage) - client.Get("/manage-keys", appHandler.GetKeyPage) + client.Get("/keys", appHandler.GetKeysPage) server := app.Group("/api") server.Post("/auth", authHandler.Signup) diff --git a/schema.sql b/schema.sql index 8ce8e13..68bec4f 100644 --- a/schema.sql +++ b/schema.sql @@ -6,8 +6,8 @@ create table if not exists users ( ); create table if not exists keys ( - key_owner text not null references users(id), + user_id text not null references users(id), prefix text not null unique primary key, key_hash text not null unique, - key_creation_date timestamp not null -) \ No newline at end of file + creation_date timestamp not null +) diff --git a/views/keys.html b/views/keys.html index 0336487..2d93ca5 100644 --- a/views/keys.html +++ b/views/keys.html @@ -1,38 +1,45 @@ - - - Key Auth + Visio | Keys
-
- - -
+ + + +
+

Manage your API keys

+ +
- \ No newline at end of file + } + diff --git a/views/layouts/app.html b/views/layouts/app.html new file mode 100644 index 0000000..b96acc6 --- /dev/null +++ b/views/layouts/app.html @@ -0,0 +1,28 @@ + + + + + + + + + + + +
+ + {{embed}} +
+ + +