Skip to content

Commit d252682

Browse files
authored
Merge pull request #58 from supabase/refactor/plugins
refactor: make JWT and PostgREST client plugins
2 parents fd06acc + e987f18 commit d252682

21 files changed

+93
-105
lines changed

package-lock.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"fastify": "^3.14.0",
3333
"fastify-cors": "^5.2.0",
3434
"fastify-multipart": "^4.0.1",
35+
"fastify-plugin": "^3.0.0",
3536
"fastify-swagger": "^4.4.1",
3637
"fs-extra": "^8.1.0",
3738
"fs-xattr": "^0.3.1",

src/plugins/jwt.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import fastifyPlugin from 'fastify-plugin'
2+
3+
declare module 'fastify' {
4+
interface FastifyRequest {
5+
jwt: string
6+
}
7+
}
8+
9+
export default fastifyPlugin(async (fastify) => {
10+
fastify.decorateRequest('jwt', null)
11+
fastify.addHook('preHandler', async (request) => {
12+
request.jwt = (request.headers.authorization as string).substring('Bearer '.length)
13+
})
14+
})

src/plugins/postgrest.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { PostgrestClient } from '@supabase/postgrest-js'
2+
import fastifyPlugin from 'fastify-plugin'
3+
import { getPostgrestClient } from '../utils'
4+
5+
declare module 'fastify' {
6+
interface FastifyRequest {
7+
postgrest: PostgrestClient
8+
}
9+
}
10+
11+
export default fastifyPlugin(async (fastify) => {
12+
fastify.decorateRequest('postgrest', null)
13+
fastify.addHook('preHandler', async (request) => {
14+
request.postgrest = getPostgrestClient(request.jwt)
15+
})
16+
})

src/routes/bucket/createBucket.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { FastifyInstance } from 'fastify'
22
import { FromSchema } from 'json-schema-to-ts'
33
import { AuthenticatedRequest, Bucket } from '../../types/types'
4-
import { getOwner, getPostgrestClient, isValidKey, transformPostgrestError } from '../../utils'
4+
import { getOwner, isValidKey, transformPostgrestError } from '../../utils'
55
import { createDefaultSchema, createResponse } from '../../utils/generic-routes'
66

77
const createBucketBodySchema = {
@@ -39,12 +39,9 @@ export default async function routes(fastify: FastifyInstance) {
3939
schema,
4040
},
4141
async (request, response) => {
42-
const authHeader = request.headers.authorization
43-
const jwt = authHeader.substring('Bearer '.length)
44-
const postgrest = getPostgrestClient(jwt)
4542
let owner
4643
try {
47-
owner = await getOwner(jwt)
44+
owner = await getOwner(request.jwt)
4845
} catch (err) {
4946
console.log(err)
5047
return response.status(400).send(createResponse(err.message, '400', err.message))
@@ -64,7 +61,7 @@ export default async function routes(fastify: FastifyInstance) {
6461
.send(createResponse('The key contains invalid characters', '400', 'Invalid key'))
6562
}
6663

67-
const { data: results, error, status } = await postgrest
64+
const { data: results, error, status } = await request.postgrest
6865
.from<Bucket>('buckets')
6966
.insert(
7067
[

src/routes/bucket/deleteBucket.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,14 @@ export default async function routes(fastify: FastifyInstance) {
3838
schema,
3939
},
4040
async (request, response) => {
41-
const authHeader = request.headers.authorization
42-
const jwt = authHeader.substring('Bearer '.length)
4341
const { bucketId } = request.params
44-
const userPostgrest = getPostgrestClient(jwt)
4542
const superUserPostgrest = getPostgrestClient(serviceKey)
4643

4744
const {
4845
data: bucketResults,
4946
error: bucketError,
5047
status: bucketStatus,
51-
} = await userPostgrest.from<Bucket>('buckets').select('id').eq('id', bucketId).single()
48+
} = await request.postgrest.from<Bucket>('buckets').select('id').eq('id', bucketId).single()
5249

5350
if (bucketError) {
5451
request.log.error({ error: bucketError }, 'error bucket')
@@ -84,7 +81,7 @@ export default async function routes(fastify: FastifyInstance) {
8481
)
8582
}
8683

87-
const { data: results, error, status } = await userPostgrest
84+
const { data: results, error, status } = await request.postgrest
8885
.from<Bucket>('buckets')
8986
.delete()
9087
.eq('id', bucketId)

src/routes/bucket/emptyBucket.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { FastifyInstance } from 'fastify'
22
import { FromSchema } from 'json-schema-to-ts'
33
import { AuthenticatedRequest, Bucket, Obj } from '../../types/types'
4-
import { getPostgrestClient, transformPostgrestError } from '../../utils'
4+
import { transformPostgrestError } from '../../utils'
55
import { getConfig } from '../../utils/config'
66
import { createDefaultSchema, createResponse } from '../../utils/generic-routes'
77
import { S3Backend } from '../../backend/s3'
@@ -47,12 +47,9 @@ export default async function routes(fastify: FastifyInstance) {
4747
schema,
4848
},
4949
async (request, response) => {
50-
const authHeader = request.headers.authorization
51-
const jwt = authHeader.substring('Bearer '.length)
5250
const { bucketId } = request.params
53-
const postgrest = getPostgrestClient(jwt)
5451

55-
const bucketResponse = await postgrest
52+
const bucketResponse = await request.postgrest
5653
.from<Bucket>('buckets')
5754
.select('name')
5855
.eq('id', bucketId)
@@ -67,7 +64,11 @@ export default async function routes(fastify: FastifyInstance) {
6764

6865
let deleteError, deleteData, objectError, objects, objectStatus
6966
do {
70-
;({ data: objects, error: objectError, status: objectStatus } = await postgrest
67+
;({
68+
data: objects,
69+
error: objectError,
70+
status: objectStatus,
71+
} = await request.postgrest
7172
.from<Obj>('objects')
7273
.select('name, id')
7374
.eq('bucket_id', bucketId)
@@ -80,7 +81,7 @@ export default async function routes(fastify: FastifyInstance) {
8081
request.log.info({ results: objects }, 'results')
8182

8283
if (objects && objects.length > 0) {
83-
;({ error: deleteError, data: deleteData } = await postgrest
84+
;({ error: deleteError, data: deleteData } = await request.postgrest
8485
.from<Obj>('objects')
8586
.delete()
8687
.in(

src/routes/bucket/getAllBuckets.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { FastifyInstance } from 'fastify'
22
import { bucketSchema } from '../../schemas/bucket'
33
import { AuthenticatedRequest, Bucket } from '../../types/types'
4-
import { getPostgrestClient, transformPostgrestError } from '../../utils'
4+
import { transformPostgrestError } from '../../utils'
55
import { createDefaultSchema } from '../../utils/generic-routes'
66

77
const successResponseSchema = {
@@ -33,11 +33,7 @@ export default async function routes(fastify: FastifyInstance) {
3333
},
3434
async (request, response) => {
3535
// get list of all buckets
36-
const authHeader = request.headers.authorization
37-
const jwt = authHeader.substring('Bearer '.length)
38-
39-
const postgrest = getPostgrestClient(jwt)
40-
const { data: results, error, status } = await postgrest
36+
const { data: results, error, status } = await request.postgrest
4137
.from<Bucket>('buckets')
4238
.select('id, name, public, owner, created_at, updated_at')
4339

src/routes/bucket/getBucket.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { FastifyInstance } from 'fastify'
22
import { FromSchema } from 'json-schema-to-ts'
33
import { bucketSchema } from '../../schemas/bucket'
44
import { AuthenticatedRequest, Bucket } from '../../types/types'
5-
import { getPostgrestClient, transformPostgrestError } from '../../utils'
5+
import { transformPostgrestError } from '../../utils'
66
import { createDefaultSchema } from '../../utils/generic-routes'
77

88
const getBucketParamsSchema = {
@@ -32,11 +32,8 @@ export default async function routes(fastify: FastifyInstance) {
3232
schema,
3333
},
3434
async (request, response) => {
35-
const authHeader = request.headers.authorization
36-
const jwt = authHeader.substring('Bearer '.length)
3735
const { bucketId } = request.params
38-
const postgrest = getPostgrestClient(jwt)
39-
const { data: results, error, status } = await postgrest
36+
const { data: results, error, status } = await request.postgrest
4037
.from<Bucket>('buckets')
4138
.select('id, name, owner, public, created_at, updated_at')
4239
.eq('id', bucketId)

src/routes/bucket/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { FastifyInstance } from 'fastify'
2+
import jwt from '../../plugins/jwt'
3+
import postgrest from '../../plugins/postgrest'
24
import createBucket from './createBucket'
35
import deleteBucket from './deleteBucket'
46
import emptyBucket from './emptyBucket'
@@ -8,6 +10,9 @@ import updateBucket from './updateBucket'
810

911
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
1012
export default async function routes(fastify: FastifyInstance) {
13+
fastify.register(jwt)
14+
fastify.register(postgrest)
15+
1116
fastify.register(createBucket)
1217
fastify.register(deleteBucket)
1318
fastify.register(emptyBucket)

0 commit comments

Comments
 (0)