Skip to content

Commit 0dbbdb6

Browse files
authored
Merge pull request #685 from isaacharrisholt/chore/refactor-generator-metadata-collection
chore(typegen): Extract metadata generation to function
2 parents d8bfcc4 + 536f8c1 commit 0dbbdb6

File tree

3 files changed

+127
-98
lines changed

3 files changed

+127
-98
lines changed

src/lib/generators.ts

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

src/server/routes/generators/typescript.ts

Lines changed: 7 additions & 85 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,97 +22,18 @@ 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,
25+
const { data: generatorMeta, error: generatorMetaError } = await getGeneratorMetadata(pgMeta, {
26+
includedSchemas,
2727
excludedSchemas,
28-
includeColumns: false,
2928
})
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) })
29+
if (generatorMetaError) {
30+
request.log.error({ error: generatorMetaError, request: extractRequestForLogging(request) })
9631
reply.code(500)
97-
return { error: typesError.message }
32+
return { error: generatorMetaError.message }
9833
}
9934

10035
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,
36+
...generatorMeta,
11537
detectOneToOneRelationships,
11638
})
11739
})

src/server/templates/typescript.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,10 @@ import prettier from 'prettier'
22
import type {
33
PostgresColumn,
44
PostgresFunction,
5-
PostgresMaterializedView,
6-
PostgresRelationship,
75
PostgresSchema,
8-
PostgresTable,
96
PostgresType,
10-
PostgresView,
117
} from '../../lib/index.js'
8+
import type { GeneratorMetadata } from '../../lib/generators.js'
129

1310
export const apply = async ({
1411
schemas,
@@ -20,15 +17,7 @@ export const apply = async ({
2017
functions,
2118
types,
2219
detectOneToOneRelationships,
23-
}: {
24-
schemas: PostgresSchema[]
25-
tables: Omit<PostgresTable, 'columns'>[]
26-
views: Omit<PostgresView, 'columns'>[]
27-
materializedViews: Omit<PostgresMaterializedView, 'columns'>[]
28-
columns: PostgresColumn[]
29-
relationships: PostgresRelationship[]
30-
functions: PostgresFunction[]
31-
types: PostgresType[]
20+
}: GeneratorMetadata & {
3221
detectOneToOneRelationships: boolean
3322
}): Promise<string> => {
3423
const columnsByTableId = Object.fromEntries<PostgresColumn[]>(

0 commit comments

Comments
 (0)