Skip to content

Commit 144d9cf

Browse files
committed
refactor: AuthContext and page reloads
1 parent cd70031 commit 144d9cf

File tree

18 files changed

+320
-314
lines changed

18 files changed

+320
-314
lines changed

backend/app.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ func (a *Application) Run() error {
2828
return fmt.Errorf("could not migrate database: %v", err)
2929
}
3030

31-
database := db.NewDatabase(cfg.DB.ConnectionString())
31+
database, err := db.NewDatabase(context.Background(), cfg.DB.ConnectionString())
32+
if err != nil {
33+
return fmt.Errorf("could not connect to database: %v", err)
34+
}
3235
domainService := domain.NewDomainService(database)
3336
server := http.NewServer(*cfg, domainService)
3437

backend/db/postgres.go

Lines changed: 23 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55

66
"github.com/jackc/pgx/v5"
7+
"github.com/jackc/pgx/v5/pgxpool"
78
"github.com/torfstack/synod/backend/convert/fromdb"
89
"github.com/torfstack/synod/backend/convert/todb"
910
"github.com/torfstack/synod/backend/models"
@@ -12,71 +13,50 @@ import (
1213

1314
type database struct {
1415
connStr string
15-
conn *pgx.Conn
16+
pool *pgxpool.Pool
1617
tx *transaction
1718
}
1819

1920
var _ Database = (*database)(nil)
2021

21-
func NewDatabase(connStr string) Database {
22-
return &database{connStr: connStr}
22+
func NewDatabase(ctx context.Context, connStr string) (Database, error) {
23+
pool, err := pgxpool.New(ctx, connStr)
24+
if err != nil {
25+
return nil, err
26+
}
27+
return &database{connStr: connStr, pool: pool}, nil
2328
}
2429

2530
func (d *database) WithTx(ctx context.Context, withTx func(Database) error) error {
2631
if d.tx != nil {
2732
return withTx(d)
2833
}
2934

30-
var conn *pgx.Conn
31-
if d.conn != nil {
32-
conn = d.conn
33-
} else {
34-
var err error
35-
conn, err = pgx.Connect(ctx, d.connStr)
36-
if err != nil {
37-
return err
38-
}
39-
}
40-
41-
tx, err := conn.Begin(ctx)
35+
tx, err := d.pool.Begin(ctx)
4236
if err != nil {
4337
return err
4438
}
45-
trans := &transaction{conn: conn, tx: tx}
39+
trans := &transaction{tx: tx}
4640
defer func(tx pgx.Tx, ctx context.Context) {
4741
_ = tx.Rollback(ctx)
4842
}(tx, ctx)
49-
err = withTx(&database{connStr: d.connStr, conn: conn, tx: trans})
43+
err = withTx(&database{connStr: d.connStr, pool: d.pool, tx: trans})
5044
if err != nil {
5145
return err
5246
}
5347
return tx.Commit(ctx)
5448
}
5549

56-
func (d *database) CommitTransaction(ctx context.Context) error {
57-
if d.tx == nil {
58-
return nil
59-
}
60-
defer func(context.Context) {
61-
d.tx.Rollback(ctx)
62-
_ = (*d.conn).Close(ctx)
63-
}(ctx)
64-
d.tx.Commit(ctx)
65-
return nil
66-
}
67-
6850
func (d *database) DoesUserExist(ctx context.Context, username string) (bool, error) {
69-
q, err := startQuery(ctx, d)
70-
defer endQuery(ctx, d)
51+
q, err := startQuery(d)
7152
if err != nil {
7253
return false, err
7354
}
7455
return q.DoesUserExist(ctx, username)
7556
}
7657

7758
func (d *database) InsertUser(ctx context.Context, user models.User) (models.ExistingUser, error) {
78-
q, err := startQuery(ctx, d)
79-
defer endQuery(ctx, d)
59+
q, err := startQuery(d)
8060
if err != nil {
8161
return models.ExistingUser{}, err
8262
}
@@ -86,8 +66,7 @@ func (d *database) InsertUser(ctx context.Context, user models.User) (models.Exi
8666
}
8767

8868
func (d *database) SelectUserByName(ctx context.Context, username string) (models.ExistingUser, error) {
89-
q, err := startQuery(ctx, d)
90-
defer endQuery(ctx, d)
69+
q, err := startQuery(d)
9170
if err != nil {
9271
return models.ExistingUser{}, err
9372
}
@@ -100,8 +79,7 @@ func (d *database) UpsertSecret(
10079
secret models.EncryptedSecret,
10180
userID int64,
10281
) (models.EncryptedSecret, error) {
103-
q, err := startQuery(ctx, d)
104-
defer endQuery(ctx, d)
82+
q, err := startQuery(d)
10583
if err != nil {
10684
return models.EncryptedSecret{}, err
10785
}
@@ -117,8 +95,7 @@ func (d *database) UpsertSecret(
11795
}
11896

11997
func (d *database) SelectSecrets(ctx context.Context, userID int64) ([]models.EncryptedSecret, error) {
120-
q, err := startQuery(ctx, d)
121-
defer endQuery(ctx, d)
98+
q, err := startQuery(d)
12299
if err != nil {
123100
return []models.EncryptedSecret{}, err
124101
}
@@ -127,8 +104,7 @@ func (d *database) SelectSecrets(ctx context.Context, userID int64) ([]models.En
127104
}
128105

129106
func (d *database) InsertKeys(ctx context.Context, pair models.UserKeyPair) (models.UserKeyPair, error) {
130-
q, err := startQuery(ctx, d)
131-
defer endQuery(ctx, d)
107+
q, err := startQuery(d)
132108
if err != nil {
133109
return models.UserKeyPair{}, err
134110
}
@@ -141,8 +117,7 @@ func (d *database) InsertKeys(ctx context.Context, pair models.UserKeyPair) (mod
141117
}
142118

143119
func (d *database) SelectKeys(ctx context.Context, userID int64) (models.UserKeyPair, error) {
144-
q, err := startQuery(ctx, d)
145-
defer endQuery(ctx, d)
120+
q, err := startQuery(d)
146121
if err != nil {
147122
return models.UserKeyPair{}, err
148123
}
@@ -154,17 +129,15 @@ func (d *database) SelectKeys(ctx context.Context, userID int64) (models.UserKey
154129
}
155130

156131
func (d *database) HasKeys(ctx context.Context, userID int64) (bool, error) {
157-
q, err := startQuery(ctx, d)
158-
defer endQuery(ctx, d)
132+
q, err := startQuery(d)
159133
if err != nil {
160134
return false, err
161135
}
162136
return q.HasKeys(ctx, userID)
163137
}
164138

165139
func (d *database) InsertPassword(ctx context.Context, password models.HashedPassword) (models.HashedPassword, error) {
166-
q, err := startQuery(ctx, d)
167-
defer endQuery(ctx, d)
140+
q, err := startQuery(d)
168141
if err != nil {
169142
return models.HashedPassword{}, err
170143
}
@@ -177,8 +150,7 @@ func (d *database) InsertPassword(ctx context.Context, password models.HashedPas
177150
}
178151

179152
func (d *database) SelectPassword(ctx context.Context, passwordID int64) (models.HashedPassword, error) {
180-
q, err := startQuery(ctx, d)
181-
defer endQuery(ctx, d)
153+
q, err := startQuery(d)
182154
if err != nil {
183155
return models.HashedPassword{}, err
184156
}
@@ -189,23 +161,9 @@ func (d *database) SelectPassword(ctx context.Context, passwordID int64) (models
189161
return fromdb.HashedPassword(dbPassword), nil
190162
}
191163

192-
func startQuery(ctx context.Context, d *database) (*sqlc.Queries, error) {
164+
func startQuery(d *database) (*sqlc.Queries, error) {
193165
if d.tx != nil {
194166
return sqlc.New(d.tx.SqlTx()), nil
195167
}
196-
if d.conn == nil {
197-
conn, err := pgx.Connect(ctx, d.connStr)
198-
if err != nil {
199-
return nil, err
200-
}
201-
d.conn = conn
202-
}
203-
return sqlc.New(d.conn), nil
204-
}
205-
206-
func endQuery(ctx context.Context, d *database) {
207-
if d.conn != nil && d.tx == nil {
208-
_ = (*d.conn).Close(ctx)
209-
d.conn = nil
210-
}
168+
return sqlc.New(d.pool), nil
211169
}

backend/db/postgres_test.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,9 @@ func TestDatabase_SecretHandling(t *testing.T) {
6464
assert.NoError(t, pg.Restore(ctx))
6565

6666
connStr, err := pg.ConnectionString(ctx)
67-
assert.NoError(t, err)
68-
d := NewDatabase(connStr)
67+
require.NoError(t, err)
68+
d, err := NewDatabase(ctx, connStr)
69+
require.NoError(t, err)
6970
{
7071
secrets, err := d.SelectSecrets(ctx, 1)
7172
assert.NoError(t, err)
@@ -100,7 +101,8 @@ func TestDatabase_UserHandling(t *testing.T) {
100101

101102
connStr, err := pg.ConnectionString(ctx)
102103
assert.NoError(t, err)
103-
d := NewDatabase(connStr)
104+
d, err := NewDatabase(ctx, connStr)
105+
require.NoError(t, err)
104106

105107
b, err := d.DoesUserExist(ctx, TestUser.Subject)
106108
assert.NoError(t, err)
@@ -129,7 +131,8 @@ func TestDatabase_KeyHandling(t *testing.T) {
129131

130132
connStr, err := pg.ConnectionString(ctx)
131133
assert.NoError(t, err)
132-
d := NewDatabase(connStr)
134+
d, err := NewDatabase(ctx, connStr)
135+
require.NoError(t, err)
133136

134137
createdUser, err := d.InsertUser(ctx, TestUser)
135138
assert.NoError(t, err)
@@ -166,7 +169,8 @@ func TestDatabase_UserTransactionRollback(t *testing.T) {
166169

167170
connStr, err := pg.ConnectionString(ctx)
168171
assert.NoError(t, err)
169-
dd := NewDatabase(connStr)
172+
dd, err := NewDatabase(ctx, connStr)
173+
require.NoError(t, err)
170174

171175
err = dd.WithTx(ctx, func(d Database) error {
172176
_, err = d.InsertUser(ctx, TestUser)
@@ -190,7 +194,8 @@ func TestDatabase_UserTransactionCommit(t *testing.T) {
190194

191195
connStr, err := pg.ConnectionString(ctx)
192196
assert.NoError(t, err)
193-
dd := NewDatabase(connStr)
197+
dd, err := NewDatabase(ctx, connStr)
198+
require.NoError(t, err)
194199

195200
err = dd.WithTx(ctx, func(d Database) error {
196201
_, err = d.InsertUser(ctx, TestUser)

backend/db/transaction.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,17 @@ import (
77
)
88

99
type transaction struct {
10-
conn *pgx.Conn
11-
tx pgx.Tx
10+
tx pgx.Tx
1211
}
1312

1413
var _ Transaction = (*transaction)(nil)
1514

1615
func (t *transaction) Commit(ctx context.Context) {
1716
_ = t.tx.Commit(ctx)
18-
_ = t.tx.Conn().Close(ctx)
1917
}
2018

2119
func (t *transaction) Rollback(ctx context.Context) {
2220
_ = t.tx.Rollback(ctx)
23-
_ = t.tx.Conn().Close(ctx)
2421
}
2522

2623
func (t *transaction) SqlTx() pgx.Tx {

backend/http/handler_setup.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ func (s *Server) UnsealWithPassword(c echo.Context) error {
1111
ctx := c.Request().Context()
1212
session, ok := getSession(c)
1313
if !ok {
14-
logging.Errorf(ctx, "no session found in GetSecrets")
14+
logging.Errorf(ctx, "no session found in UnsealWithPassword")
1515
return c.NoContent(http.StatusUnauthorized)
1616
}
1717

@@ -38,7 +38,7 @@ func (s *Server) PostSetupPlain(c echo.Context) error {
3838
ctx := c.Request().Context()
3939
session, ok := getSession(c)
4040
if !ok {
41-
logging.Errorf(ctx, "no session found in GetSecrets")
41+
logging.Errorf(ctx, "no session found in PostSetupPlain")
4242
return c.NoContent(http.StatusUnauthorized)
4343
}
4444
err := s.domainService.SetupUserPlain(ctx, *session)

backend/http/middleware.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package http
22

33
import (
4+
"fmt"
45
"net/http"
56
"time"
67

@@ -44,3 +45,24 @@ func (s *Server) LocalDevelopmentSession(next echo.HandlerFunc) echo.HandlerFunc
4445
return next(c)
4546
}
4647
}
48+
49+
func (s *Server) RequestAndResponseLogging(next echo.HandlerFunc) echo.HandlerFunc {
50+
return func(c echo.Context) error {
51+
if c.Request() != nil {
52+
req := c.Request()
53+
logging.Debugf(
54+
req.Context(),
55+
fmt.Sprintf("[%s] %s", req.Method, req.RequestURI),
56+
)
57+
}
58+
if c.Response() != nil {
59+
res := c.Response()
60+
req := c.Request()
61+
logging.Debugf(
62+
req.Context(),
63+
fmt.Sprintf("[%s] %s returned %d", req.Method, req.RequestURI, res.Status),
64+
)
65+
}
66+
return next(c)
67+
}
68+
}

backend/http/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func (s *Server) Start() error {
4848
m = s.SessionCheck
4949
}
5050

51-
api := e.Group("/api")
51+
api := e.Group("/api", s.RequestAndResponseLogging)
5252
secrets := api.Group("/secrets", m)
5353
secrets.GET("", s.GetSecrets)
5454
secrets.POST("", s.PostSecret)

frontend/src/App.tsx

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,21 @@
11
import './App.css'
2-
import {useEffect, useState} from "react";
3-
import {deleteAuth, getAuth} from "./util/api.ts";
42
import {Navbar} from "./components/Navbar.tsx";
5-
import {config} from "./util/config.ts";
63
import {SecretsScreen} from "./screens/SecretsScreen.tsx";
74
import {StartScreen} from "./screens/StartScreen.tsx";
85
import {SetupScreen} from "./screens/SetupScreen.tsx";
96
import {UnsealScreen} from "./screens/UnsealScreen.tsx";
10-
import {type AuthStatus, EmptyAuthStatus} from "./util/authStatus.ts";
7+
import {useAuth} from "./contexts/AuthContext.tsx";
118

129
export const App = () => {
13-
const [authStatus, setAuthStatus] = useState<AuthStatus>(EmptyAuthStatus);
10+
const {authStatus} = useAuth()
1411

15-
useEffect(() => {
16-
getAuth().then(res => {
17-
if (res.status == 200) {
18-
res.json().then((json) => setAuthStatus(json))
19-
}
20-
})
21-
}, []);
22-
23-
function signInWithProvider() {
24-
window.open(config.backendAuthStartUrl, "_self");
25-
}
26-
27-
function signOut() {
28-
deleteAuth().then((resp) => {
29-
if (resp.status != 200) {
30-
return
31-
}
32-
setAuthStatus(EmptyAuthStatus)
33-
})
34-
}
35-
36-
const isAuthenticated = authStatus.isAuthenticated
37-
const isSetup = authStatus.isSetup
38-
const needsToUnseal = authStatus.needsToUnseal
12+
const isAuthenticated = authStatus && authStatus.isAuthenticated
13+
const isSetup = authStatus && authStatus.isSetup
14+
const needsToUnseal = authStatus && authStatus.needsToUnseal
3915

4016
return (
4117
<div className="flex flex-col app">
42-
<Navbar isAuthenticated={authStatus.isAuthenticated}
43-
loginButtonPressed={signInWithProvider}
44-
logoutButtonPressed={signOut}/>
18+
<Navbar/>
4519
{isAuthenticated && isSetup && !needsToUnseal && <SecretsScreen/>}
4620
{isAuthenticated && isSetup && needsToUnseal && <UnsealScreen/>}
4721
{isAuthenticated && !isSetup && <SetupScreen/>}

0 commit comments

Comments
 (0)