Skip to content

Commit 3cff801

Browse files
chore(typegen): migrate metadata collection to function
1 parent 6838f70 commit 3cff801

File tree

2 files changed

+115
-89
lines changed

2 files changed

+115
-89
lines changed

src/lib/generators.ts

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import PostgresMeta from "./PostgresMeta.js";
2+
import { PostgresColumn, PostgresFunction, PostgresMaterializedView, PostgresRelationship, PostgresSchema, PostgresTable, PostgresType, PostgresView } from "./types.js";
3+
import { PostgresMetaResult } from "./types.js";
4+
5+
type GeneratorMetadata = {
6+
schemas: PostgresSchema[];
7+
tables: PostgresTable[];
8+
views: PostgresView[];
9+
materializedViews: PostgresMaterializedView[];
10+
columns: PostgresColumn[];
11+
relationships: PostgresRelationship[];
12+
functions: PostgresFunction[];
13+
types: PostgresType[];
14+
arrayTypes: PostgresType[];
15+
}
16+
17+
export async function getGeneratorMetadata(pgMeta: PostgresMeta, filters: { includedSchemas?: string[]; excludedSchemas?: string[] } = { includedSchemas: [], excludedSchemas: [] }): Promise<PostgresMetaResult<GeneratorMetadata>> {
18+
const includedSchemas = filters.includedSchemas ?? []
19+
const excludedSchemas = filters.excludedSchemas ?? []
20+
21+
const { data: schemas, error: schemasError } = await pgMeta.schemas.list()
22+
if (schemasError) {
23+
return { data: null, error: schemasError }
24+
}
25+
26+
const { data: tables, error: tablesError } = await pgMeta.tables.list({
27+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
28+
excludedSchemas,
29+
includeColumns: false,
30+
})
31+
if (tablesError) {
32+
return { data: null, error: tablesError }
33+
}
34+
35+
const { data: views, error: viewsError } = await pgMeta.views.list({
36+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
37+
excludedSchemas,
38+
includeColumns: false,
39+
})
40+
if (viewsError) {
41+
return { data: null, error: viewsError }
42+
}
43+
44+
const { data: materializedViews, error: materializedViewsError } =
45+
await pgMeta.materializedViews.list({
46+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
47+
excludedSchemas,
48+
includeColumns: false,
49+
})
50+
if (materializedViewsError) {
51+
return { data: null, error: materializedViewsError }
52+
}
53+
54+
const { data: columns, error: columnsError } = await pgMeta.columns.list({
55+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
56+
excludedSchemas,
57+
})
58+
if (columnsError) {
59+
return { data: null, error: columnsError }
60+
}
61+
62+
const { data: relationships, error: relationshipsError } = await pgMeta.relationships.list()
63+
if (relationshipsError) {
64+
return { data: null, error: relationshipsError }
65+
}
66+
67+
const { data: functions, error: functionsError } = await pgMeta.functions.list({
68+
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
69+
excludedSchemas,
70+
})
71+
if (functionsError) {
72+
return { data: null, error: functionsError }
73+
}
74+
75+
const { data: types, error: typesError } = await pgMeta.types.list({
76+
includeArrayTypes: true,
77+
includeSystemSchemas: true,
78+
})
79+
if (typesError) {
80+
return { data: null, error: typesError }
81+
}
82+
83+
const nonArrayTypes = types.filter(({ name }) => name[0] !== '_')
84+
const arrayTypes = types.filter(({ name }) => name[0] === '_')
85+
86+
await pgMeta.end()
87+
88+
return {
89+
data: {
90+
schemas,
91+
tables,
92+
views,
93+
materializedViews,
94+
columns,
95+
relationships,
96+
functions,
97+
types: nonArrayTypes,
98+
arrayTypes,
99+
},
100+
error: null,
101+
}
102+
}

src/server/routes/generators/typescript.ts

Lines changed: 13 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { PostgresMeta } from '../../../lib/index.js'
33
import { DEFAULT_POOL_CONFIG } from '../../constants.js'
44
import { extractRequestForLogging } from '../../utils.js'
55
import { apply as applyTypescriptTemplate } from '../../templates/typescript.js'
6+
import { getGeneratorMetadata } from '../../../lib/generators.js'
67

78
export default async (fastify: FastifyInstance) => {
89
fastify.get<{
@@ -21,98 +22,21 @@ export default async (fastify: FastifyInstance) => {
2122
const detectOneToOneRelationships = request.query.detect_one_to_one_relationships === 'true'
2223

2324
const pgMeta: PostgresMeta = new PostgresMeta({ ...DEFAULT_POOL_CONFIG, connectionString })
24-
const { data: schemas, error: schemasError } = await pgMeta.schemas.list()
25-
const { data: tables, error: tablesError } = await pgMeta.tables.list({
26-
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
27-
excludedSchemas,
28-
includeColumns: false,
29-
})
30-
const { data: views, error: viewsError } = await pgMeta.views.list({
31-
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
32-
excludedSchemas,
33-
includeColumns: false,
34-
})
35-
const { data: materializedViews, error: materializedViewsError } =
36-
await pgMeta.materializedViews.list({
37-
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
38-
excludedSchemas,
39-
includeColumns: false,
40-
})
41-
const { data: columns, error: columnsError } = await pgMeta.columns.list({
42-
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
43-
excludedSchemas,
44-
})
45-
const { data: relationships, error: relationshipsError } = await pgMeta.relationships.list()
46-
const { data: functions, error: functionsError } = await pgMeta.functions.list({
47-
includedSchemas: includedSchemas.length > 0 ? includedSchemas : undefined,
48-
excludedSchemas,
49-
})
50-
const { data: types, error: typesError } = await pgMeta.types.list({
51-
includeArrayTypes: true,
52-
includeSystemSchemas: true,
53-
})
54-
await pgMeta.end()
55-
56-
if (schemasError) {
57-
request.log.error({ error: schemasError, request: extractRequestForLogging(request) })
58-
reply.code(500)
59-
return { error: schemasError.message }
60-
}
61-
if (tablesError) {
62-
request.log.error({ error: tablesError, request: extractRequestForLogging(request) })
63-
reply.code(500)
64-
return { error: tablesError.message }
65-
}
66-
if (viewsError) {
67-
request.log.error({ error: viewsError, request: extractRequestForLogging(request) })
68-
reply.code(500)
69-
return { error: viewsError.message }
70-
}
71-
if (materializedViewsError) {
72-
request.log.error({
73-
error: materializedViewsError,
74-
request: extractRequestForLogging(request),
75-
})
76-
reply.code(500)
77-
return { error: materializedViewsError.message }
78-
}
79-
if (columnsError) {
80-
request.log.error({ error: columnsError, request: extractRequestForLogging(request) })
81-
reply.code(500)
82-
return { error: columnsError.message }
83-
}
84-
if (relationshipsError) {
85-
request.log.error({ error: relationshipsError, request: extractRequestForLogging(request) })
86-
reply.code(500)
87-
return { error: relationshipsError.message }
88-
}
89-
if (functionsError) {
90-
request.log.error({ error: functionsError, request: extractRequestForLogging(request) })
91-
reply.code(500)
92-
return { error: functionsError.message }
93-
}
94-
if (typesError) {
95-
request.log.error({ error: typesError, request: extractRequestForLogging(request) })
96-
reply.code(500)
97-
return { error: typesError.message }
25+
const { data: generatorMeta, error: generatorMetaError } = await getGeneratorMetadata(
26+
pgMeta,
27+
{
28+
includedSchemas,
29+
excludedSchemas
30+
},
31+
)
32+
if (generatorMetaError) {
33+
request.log.error({ error: generatorMetaError, request: extractRequestForLogging(request) })
34+
reply.code(500)
35+
return { error: generatorMetaError.message }
9836
}
9937

10038
return applyTypescriptTemplate({
101-
schemas: schemas.filter(
102-
({ name }) =>
103-
!excludedSchemas.includes(name) &&
104-
(includedSchemas.length === 0 || includedSchemas.includes(name))
105-
),
106-
tables,
107-
views,
108-
materializedViews,
109-
columns,
110-
relationships,
111-
functions: functions.filter(
112-
({ return_type }) => !['trigger', 'event_trigger'].includes(return_type)
113-
),
114-
types: types.filter(({ name }) => name[0] !== '_'),
115-
arrayTypes: types.filter(({ name }) => name[0] === '_'),
39+
...generatorMeta,
11640
detectOneToOneRelationships,
11741
})
11842
})

0 commit comments

Comments
 (0)