Skip to content

Commit 31f6876

Browse files
committed
fix: precompile projection columns
Signed-off-by: ferhat elmas <elmas.ferhat@gmail.com>
1 parent 789b8a6 commit 31f6876

35 files changed

Lines changed: 822 additions & 288 deletions

src/http/routes/bucket/getAllBuckets.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { defineBucketColumns } from '@storage/database'
12
import { isClientVersionBefore } from '@storage/limits'
23
import { bucketSchema } from '@storage/schemas'
34
import { FastifyInstance } from 'fastify'
@@ -6,6 +7,28 @@ import { createDefaultSchema } from '../../routes-helper'
67
import { AuthenticatedRequest } from '../../types'
78
import { ROUTE_OPERATIONS } from '../operations'
89

10+
const BUCKET_LIST_COLUMNS = defineBucketColumns(
11+
'id',
12+
'name',
13+
'public',
14+
'owner',
15+
'created_at',
16+
'updated_at',
17+
'file_size_limit',
18+
'allowed_mime_types',
19+
'type'
20+
)
21+
const LEGACY_BUCKET_LIST_COLUMNS = defineBucketColumns(
22+
'id',
23+
'name',
24+
'public',
25+
'owner',
26+
'created_at',
27+
'updated_at',
28+
'file_size_limit',
29+
'allowed_mime_types'
30+
)
31+
932
const successResponseSchema = {
1033
type: 'array',
1134
items: bucketSchema,
@@ -71,8 +94,7 @@ export default async function routes(fastify: FastifyInstance) {
7194
isClientVersionBefore('storage3', userAgent, '0.12.1')
7295

7396
const results = await request.storage.listBuckets(
74-
'id, name, public, owner, created_at, updated_at, file_size_limit, allowed_mime_types' +
75-
(omitBucketType ? '' : ', type'),
97+
omitBucketType ? LEGACY_BUCKET_LIST_COLUMNS : BUCKET_LIST_COLUMNS,
7698
{ limit, offset, sortColumn, sortOrder, search }
7799
)
78100

src/http/routes/bucket/getBucket.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
1+
import { defineBucketColumns } from '@storage/database'
12
import { bucketSchema } from '@storage/schemas'
23
import { FastifyInstance } from 'fastify'
34
import { FromSchema } from 'json-schema-to-ts'
45
import { createDefaultSchema } from '../../routes-helper'
56
import { AuthenticatedRequest } from '../../types'
67
import { ROUTE_OPERATIONS } from '../operations'
78

9+
const BUCKET_DETAILS_COLUMNS = defineBucketColumns(
10+
'id',
11+
'name',
12+
'owner',
13+
'public',
14+
'created_at',
15+
'updated_at',
16+
'file_size_limit',
17+
'allowed_mime_types'
18+
)
19+
820
const getBucketParamsSchema = {
921
type: 'object',
1022
properties: {
@@ -36,10 +48,7 @@ export default async function routes(fastify: FastifyInstance) {
3648
async (request, response) => {
3749
const { bucketId } = request.params
3850

39-
const results = await request.storage.findBucket(
40-
bucketId,
41-
'id, name, owner, public, created_at, updated_at, file_size_limit, allowed_mime_types'
42-
)
51+
const results = await request.storage.findBucket(bucketId, BUCKET_DETAILS_COLUMNS)
4352

4453
return response.send(results)
4554
}

src/http/routes/iceberg/bucket.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import { defineAnalyticsColumns } from '@storage/database'
12
import { FastifyInstance } from 'fastify'
23
import { FromSchema } from 'json-schema-to-ts'
34
import { createResponse } from '../../routes-helper'
45
import { AuthenticatedRequest } from '../../types'
56
import { ROUTE_OPERATIONS } from '../operations'
67

8+
const ANALYTICS_BUCKET_LIST_COLUMNS = defineAnalyticsColumns('name', 'created_at', 'updated_at')
9+
710
const deleteBucketParamsSchema = {
811
type: 'object',
912
properties: {
@@ -112,7 +115,7 @@ export default async function routes(fastify: FastifyInstance) {
112115
async (request, response) => {
113116
const query = request.query
114117

115-
const bucket = await request.storage.listAnalyticsBuckets('name,created_at,updated_at', {
118+
const bucket = await request.storage.listAnalyticsBuckets(ANALYTICS_BUCKET_LIST_COLUMNS, {
116119
limit: query.limit,
117120
offset: query.offset,
118121
sortColumn: query.sortColumn,

src/http/routes/object/getObject.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ERRORS } from '@internal/errors'
2+
import { defineBucketColumns, defineObjectColumns } from '@storage/database'
23
import { Obj } from '@storage/schemas'
34
import { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify'
45
import { FromSchema } from 'json-schema-to-ts'
@@ -7,6 +8,8 @@ import { AuthenticatedRangeRequest } from '../../types'
78
import { ROUTE_OPERATIONS } from '../operations'
89

910
const { storageS3Bucket } = getConfig()
11+
const PUBLIC_BUCKET_COLUMNS = defineBucketColumns('id', 'public')
12+
const OBJECT_DOWNLOAD_COLUMNS = defineObjectColumns('id', 'version', 'metadata')
1013

1114
const getObjectParamsSchema = {
1215
type: 'object',
@@ -42,7 +45,7 @@ async function requestHandler(request: GetObjectRequest, response: FastifyReply)
4245
bucketId: bucketName,
4346
objectName,
4447
})
45-
const bucket = await request.storage.asSuperUser().findBucket(bucketName, 'id,public', {
48+
const bucket = await request.storage.asSuperUser().findBucket(bucketName, PUBLIC_BUCKET_COLUMNS, {
4649
dontErrorOnEmpty: true,
4750
})
4851

@@ -66,10 +69,10 @@ async function requestHandler(request: GetObjectRequest, response: FastifyReply)
6669
obj = await request.storage
6770
.asSuperUser()
6871
.from(bucketName)
69-
.findObject(objectName, 'id, version, metadata')
72+
.findObject(objectName, OBJECT_DOWNLOAD_COLUMNS)
7073
} else {
7174
// request is authenticated use RLS
72-
obj = await request.storage.from(bucketName).findObject(objectName, 'id, version, metadata')
75+
obj = await request.storage.from(bucketName).findObject(objectName, OBJECT_DOWNLOAD_COLUMNS)
7376
}
7477

7578
return request.storage.renderer('asset').render(request, response, {

src/http/routes/object/getObjectInfo.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ERRORS } from '@internal/errors'
2+
import { defineBucketColumns, defineObjectColumns } from '@storage/database'
23
import { Obj } from '@storage/schemas'
34
import { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify'
45
import { FromSchema } from 'json-schema-to-ts'
@@ -8,6 +9,17 @@ import { AuthenticatedRangeRequest } from '../../types'
89
import { ROUTE_OPERATIONS } from '../operations'
910

1011
const { storageS3Bucket } = getConfig()
12+
const PUBLIC_BUCKET_COLUMNS = defineBucketColumns('id', 'public')
13+
const OBJECT_INFO_COLUMNS = defineObjectColumns(
14+
'id',
15+
'name',
16+
'version',
17+
'bucket_id',
18+
'metadata',
19+
'user_metadata',
20+
'updated_at',
21+
'created_at'
22+
)
1123

1224
const getObjectParamsSchema = {
1325
type: 'object',
@@ -45,7 +57,7 @@ async function requestHandler(
4557
objectName,
4658
})
4759

48-
const bucket = await request.storage.asSuperUser().findBucket(bucketName, 'id,public', {
60+
const bucket = await request.storage.asSuperUser().findBucket(bucketName, PUBLIC_BUCKET_COLUMNS, {
4961
dontErrorOnEmpty: true,
5062
})
5163

@@ -67,17 +79,9 @@ async function requestHandler(
6779
obj = await request.storage
6880
.asSuperUser()
6981
.from(bucketName)
70-
.findObject(
71-
objectName,
72-
'id,name,version,bucket_id,metadata,user_metadata,updated_at,created_at'
73-
)
82+
.findObject(objectName, OBJECT_INFO_COLUMNS)
7483
} else {
75-
obj = await request.storage
76-
.from(bucketName)
77-
.findObject(
78-
objectName,
79-
'id,name,version,bucket_id,metadata,user_metadata,updated_at,created_at'
80-
)
84+
obj = await request.storage.from(bucketName).findObject(objectName, OBJECT_INFO_COLUMNS)
8185
}
8286

8387
return request.storage.renderer(method).render(request, response, {

src/http/routes/object/getPublicObject.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import { defineBucketColumns, defineObjectColumns } from '@storage/database'
12
import { FastifyInstance } from 'fastify'
23
import { FromSchema } from 'json-schema-to-ts'
34
import { getConfig } from '../../../config'
45
import { ROUTE_OPERATIONS } from '../operations'
56

67
const { storageS3Bucket } = getConfig()
8+
const PUBLIC_BUCKET_COLUMNS = defineBucketColumns('id', 'public')
9+
const OBJECT_DOWNLOAD_COLUMNS = defineObjectColumns('id', 'version', 'metadata')
710

811
const getPublicObjectParamsSchema = {
912
type: 'object',
@@ -54,10 +57,10 @@ export default async function routes(fastify: FastifyInstance) {
5457

5558
const bucketRef = request.storage.asSuperUser().from(bucketName)
5659
const [, obj] = await Promise.all([
57-
request.storage.asSuperUser().findBucket(bucketName, 'id,public', {
60+
request.storage.asSuperUser().findBucket(bucketName, PUBLIC_BUCKET_COLUMNS, {
5861
isPublic: true,
5962
}),
60-
bucketRef.findObject(objectName, 'id,version,metadata'),
63+
bucketRef.findObject(objectName, OBJECT_DOWNLOAD_COLUMNS),
6164
])
6265

6366
// send the object from s3

src/http/routes/object/getSignedObject.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import { defineObjectColumns } from '@storage/database'
12
import { FastifyInstance } from 'fastify'
23
import { FromSchema } from 'json-schema-to-ts'
34
import { getConfig } from '../../../config'
45
import { SIGNED_URL_SCOPE_DOWNLOAD } from '../../../internal/auth'
56
import { ROUTE_OPERATIONS } from '../operations'
67

78
const { storageS3Bucket } = getConfig()
9+
const OBJECT_DOWNLOAD_COLUMNS = defineObjectColumns('id', 'version', 'metadata')
810

911
const getSignedObjectParamsSchema = {
1012
type: 'object',
@@ -68,7 +70,7 @@ export default async function routes(fastify: FastifyInstance) {
6870
const obj = await request.storage
6971
.asSuperUser()
7072
.from(bucketName)
71-
.findObject(objParts.join('/'), 'id,version,metadata')
73+
.findObject(objParts.join('/'), OBJECT_DOWNLOAD_COLUMNS)
7274

7375
return request.storage.renderer('asset').render(request, response, {
7476
bucket: storageS3Bucket,

src/http/routes/render/renderAuthenticatedImage.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { getTenantConfig } from '@internal/database'
2+
import { defineObjectColumns } from '@storage/database'
23
import { ImageRenderer } from '@storage/renderer'
34
import { FastifyInstance } from 'fastify'
45
import { FromSchema } from 'json-schema-to-ts'
@@ -7,6 +8,7 @@ import { transformationOptionsSchema } from '../../schemas/transformations'
78
import { ROUTE_OPERATIONS } from '../operations'
89

910
const { storageS3Bucket, isMultitenant } = getConfig()
11+
const OBJECT_RENDER_COLUMNS = defineObjectColumns('id', 'version', 'metadata')
1012

1113
const renderAuthenticatedImageParamsSchema = {
1214
type: 'object',
@@ -53,7 +55,7 @@ export default async function routes(fastify: FastifyInstance) {
5355

5456
const obj = await request.storage
5557
.from(bucketName)
56-
.findObject(objectName, 'id,version,metadata')
58+
.findObject(objectName, OBJECT_RENDER_COLUMNS)
5759

5860
const s3Key = request.storage.location.getKeyLocation({
5961
tenantId: request.tenantId,

src/http/routes/render/renderPublicImage.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { getTenantConfig } from '@internal/database'
2+
import { defineBucketColumns, defineObjectColumns } from '@storage/database'
23
import { ImageRenderer } from '@storage/renderer'
34
import { FastifyInstance } from 'fastify'
45
import { FromSchema } from 'json-schema-to-ts'
@@ -7,6 +8,8 @@ import { transformationOptionsSchema } from '../../schemas/transformations'
78
import { ROUTE_OPERATIONS } from '../operations'
89

910
const { storageS3Bucket, isMultitenant } = getConfig()
11+
const PUBLIC_BUCKET_COLUMNS = defineBucketColumns('id', 'public')
12+
const OBJECT_RENDER_COLUMNS = defineObjectColumns('id', 'version', 'metadata')
1013

1114
const renderPublicImageParamsSchema = {
1215
type: 'object',
@@ -53,10 +56,10 @@ export default async function routes(fastify: FastifyInstance) {
5356

5457
const bucketRef = request.storage.asSuperUser().from(bucketName)
5558
const [, obj] = await Promise.all([
56-
request.storage.asSuperUser().findBucket(bucketName, 'id,public', {
59+
request.storage.asSuperUser().findBucket(bucketName, PUBLIC_BUCKET_COLUMNS, {
5760
isPublic: true,
5861
}),
59-
bucketRef.findObject(objectName, 'id,version,metadata'),
62+
bucketRef.findObject(objectName, OBJECT_RENDER_COLUMNS),
6063
])
6164

6265
const s3Key = `${request.tenantId}/${bucketName}/${objectName}`

src/http/routes/render/renderSignedImage.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { SIGNED_URL_SCOPE_DOWNLOAD } from '@internal/auth'
22
import { getTenantConfig } from '@internal/database'
3+
import { defineObjectColumns } from '@storage/database'
34
import { ImageRenderer } from '@storage/renderer'
45
import { FastifyInstance } from 'fastify'
56
import { FromSchema } from 'json-schema-to-ts'
67
import { getConfig } from '../../../config'
78
import { ROUTE_OPERATIONS } from '../operations'
89

910
const { storageS3Bucket, isMultitenant } = getConfig()
11+
const OBJECT_RENDER_COLUMNS = defineObjectColumns('id', 'version', 'metadata')
1012

1113
const renderAuthenticatedImageParamsSchema = {
1214
type: 'object',
@@ -66,7 +68,7 @@ export default async function routes(fastify: FastifyInstance) {
6668
const obj = await request.storage
6769
.asSuperUser()
6870
.from(bucketName)
69-
.findObject(objParts.join('/'), 'id,version,metadata')
71+
.findObject(objParts.join('/'), OBJECT_RENDER_COLUMNS)
7072

7173
const renderer = request.storage.renderer('image') as ImageRenderer
7274

0 commit comments

Comments
 (0)