Skip to content

Commit 29928b7

Browse files
authored
Merge pull request #7 from samhuk/story/6
Story 6 - createLink() -> create(), typing for includeDateCreated, sql fixes for it, etc.
2 parents a1b0952 + 0c6db08 commit 29928b7

File tree

7 files changed

+54
-27
lines changed

7 files changed

+54
-27
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ts-pg-orm",
3-
"version": "4.1.3",
3+
"version": "4.1.4",
44
"description": "Typescript PostgreSQL ORM",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

src/examples/realDbTest/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ const ORM = createTsPgOrm()
9191
type: RelationType.MANY_TO_MANY,
9292
fieldRef1: dfs.user.fieldRefs.id,
9393
fieldRef2: dfs.userGroup.fieldRefs.id,
94+
includeDateCreated: true,
9495
},
9596
] as const)
9697

@@ -179,7 +180,7 @@ const addData = async (stores: Stores) => {
179180
{ userId: 2, userGroupId: 2 },
180181
{ userId: 3, userGroupId: 3 },
181182
]
182-
await Promise.all(createUserToUserGroupLinkOptions.map(stores['user.id <<-->> userGroup.id'].createlink))
183+
await Promise.all(createUserToUserGroupLinkOptions.map(stores['user.id <<-->> userGroup.id'].create))
183184
}
184185

185186
const getResult = (stores: Stores) => (

src/index.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ describe('createTsPgOrm', () => {
7070
})
7171

7272
// -- Act
73-
const joinTableRecord = await stores['user.id <<-->> userGroup.id'].createlink({ userGroupId: 2, userId: 3 })
73+
const joinTableRecord = await stores['user.id <<-->> userGroup.id'].create({ userGroupId: 2, userId: 3 })
7474

7575
// -- Assert
7676
expect(joinTableRecord).toEqual({
@@ -80,7 +80,7 @@ describe('createTsPgOrm', () => {
8080
})
8181

8282
// -- Act
83-
const deletedJoinTableRecord = await stores['user.id <<-->> userGroup.id'].deleteLinkById({ id: joinTableRecord.id, return: true })
83+
const deletedJoinTableRecord = await stores['user.id <<-->> userGroup.id'].deleteById({ id: joinTableRecord.id, return: true })
8484

8585
// -- Assert
8686
expect(deletedJoinTableRecord).toEqual({

src/relations/sql.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export const createManyToManyJoinTableSql = (r: RelationDeclaration<DataFormatDe
3737
id serial primary key,
3838
${columnName1} integer not null,
3939
${columnName2} integer not null,
40-
${(r.includeDateCreated ?? false) ? 'date_created not null default CURRENT_TIMESTAMP,' : ''}
40+
${(r.includeDateCreated ?? false) ? 'date_created timestamp with time zone not null default CURRENT_TIMESTAMP,' : ''}
4141
constraint ${fkeyName1} foreign key (${columnName1})
4242
references public.${tableName1} (${fieldName1}) match simple
4343
${(r.fieldRef1OnUpdateNoAction ?? true) ? 'on update no action' : ''}

src/store/joinTable/index.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { createMockDbService } from '../../mock/dbService'
44
import { tsPgOrm } from '../../testData'
55

66
describe('joinTable', () => {
7-
describe('createLink', () => {
7+
describe('create', () => {
88
test('basic test', async () => {
99
const db = createMockDbService()
1010
const manyToManyRelationsList = filterForManyToManyRelations(tsPgOrm.relations)
@@ -19,7 +19,7 @@ describe('joinTable', () => {
1919
user_group_id: 3,
2020
})
2121

22-
const newJoinTableRecord = await joinStoresDict['user.id <<-->> userGroup.id'].createlink({ userId: 2, userGroupId: 3 })
22+
const newJoinTableRecord = await joinStoresDict['user.id <<-->> userGroup.id'].create({ userId: 2, userGroupId: 3 })
2323

2424
expect(newJoinTableRecord).toEqual({
2525
id: 1,
@@ -37,7 +37,7 @@ values ($1, $2) returning *`,
3737
})
3838
})
3939

40-
describe('createLinks', () => {
40+
describe('createMultiple', () => {
4141
test('basic test', async () => {
4242
const db = createMockDbService()
4343
const manyToManyRelationsList = filterForManyToManyRelations(tsPgOrm.relations)
@@ -48,7 +48,7 @@ values ($1, $2) returning *`,
4848

4949
db.queueResponse(true)
5050

51-
await joinStoresDict['user.id <<-->> userGroup.id'].createLinks([
51+
await joinStoresDict['user.id <<-->> userGroup.id'].createMultiple([
5252
{ userId: 2, userGroupId: 3 },
5353
{ userId: 3, userGroupId: 4 },
5454
{ userId: 4, userGroupId: 5 },
@@ -70,7 +70,7 @@ values ($5, $6) returning *`,
7070
})
7171
})
7272

73-
describe('deleteLinkById', () => {
73+
describe('deleteById', () => {
7474
test('basic test', async () => {
7575
const db = createMockDbService()
7676
const manyToManyRelationsList = filterForManyToManyRelations(tsPgOrm.relations)
@@ -85,7 +85,7 @@ values ($5, $6) returning *`,
8585
user_group_id: 3,
8686
})
8787

88-
const newJoinTableRecord = await joinStoresDict['user.id <<-->> userGroup.id'].deleteLinkById({ id: 2, return: true })
88+
const newJoinTableRecord = await joinStoresDict['user.id <<-->> userGroup.id'].deleteById({ id: 2, return: true })
8989

9090
expect(newJoinTableRecord).toEqual({
9191
id: 1,

src/store/joinTable/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ const createJoinTableStore = <T extends DataFormatDeclarations>(
102102
return {
103103
provision: () => db.query(relation.sql.createJoinTableSql).then(() => true as any),
104104
unprovision: () => db.query(relation.sql.dropJoinTableSql).then(() => true as any),
105-
createlink: options => createLink(options as any),
106-
createLinks: options => createLinks(options as any),
107-
deleteLinkById: options => deleteLink(options),
105+
create: options => createLink(options as any) as any,
106+
createMultiple: options => createLinks(options as any),
107+
deleteById: options => deleteLink(options) as any,
108108
}
109109
}
110110

src/store/joinTable/types.ts

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { DataFormatDeclarations, DataFormatFieldToRecordPropertyValue } from '../../dataFormat/types'
2-
import { OmitTyped } from '../../helpers/types'
2+
import { ExpandRecursively } from '../../helpers/types'
33
import {
44
ExtractRelationNamesOfManyToManyRelations,
55
Relation,
@@ -9,7 +9,7 @@ import {
99
RelationType,
1010
} from '../../relations/types'
1111

12-
type JoinTableRecord<
12+
type JoinTableRecordLinkedFields<
1313
T extends DataFormatDeclarations,
1414
TFieldRef1DataFormat extends T[number],
1515
TFieldRef2DataFormat extends T[number],
@@ -19,15 +19,34 @@ type JoinTableRecord<
1919
[fieldRef1FieldName in `${TFieldRef1DataFormat['name']}${Capitalize<TFieldRef1Field['name']>}`]: DataFormatFieldToRecordPropertyValue<TFieldRef1Field>
2020
} & {
2121
[fieldRef2FieldName in `${TFieldRef2DataFormat['name']}${Capitalize<TFieldRef2Field['name']>}`]: DataFormatFieldToRecordPropertyValue<TFieldRef2Field>
22-
} & { id: number } // TODO: Do we need to make this configurable?
22+
}
23+
24+
type JoinTableRecord<
25+
T extends DataFormatDeclarations,
26+
TFieldRef1DataFormat extends T[number],
27+
TFieldRef2DataFormat extends T[number],
28+
TFieldRef1Field extends T[number]['fields'][number],
29+
TFieldRef2Field extends T[number]['fields'][number],
30+
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>
31+
> = ExpandRecursively<
32+
JoinTableRecordLinkedFields<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
33+
& {
34+
id: number // TODO: Do we need to make this configurable?
35+
}
36+
& (TRelation extends { includeDateCreated: boolean }
37+
? TRelation['includeDateCreated'] extends true
38+
? { dateCreated: string }
39+
: {}
40+
: {})
41+
>
2342

2443
type CreateJoinTableRecordOptions<
2544
T extends DataFormatDeclarations,
2645
TFieldRef1DataFormat extends T[number],
2746
TFieldRef2DataFormat extends T[number],
2847
TFieldRef1Field extends T[number]['fields'][number],
2948
TFieldRef2Field extends T[number]['fields'][number],
30-
> = OmitTyped<JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>, 'id'>
49+
> = JoinTableRecordLinkedFields<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
3150

3251
export type _CreateJoinTableRecordOptions<
3352
T extends DataFormatDeclarations = DataFormatDeclarations,
@@ -39,14 +58,16 @@ export type _CreateJoinTableRecordOptions<
3958
Extract<Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>['fields'][number], { name: TRelation['fieldRef1']['fieldName'] }>,
4059
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>
4160
>
61+
4262
type CreateLinkFunction<
4363
T extends DataFormatDeclarations,
4464
TFieldRef1DataFormat extends T[number],
4565
TFieldRef2DataFormat extends T[number],
4666
TFieldRef1Field extends T[number]['fields'][number],
4767
TFieldRef2Field extends T[number]['fields'][number],
68+
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>,
4869
> = (options: CreateJoinTableRecordOptions<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>) => (
49-
Promise<JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>>
70+
Promise<JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TRelation>>
5071
)
5172

5273
export type _CreateLinkFunction<
@@ -57,7 +78,8 @@ export type _CreateLinkFunction<
5778
Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>,
5879
Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>,
5980
Extract<Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>['fields'][number], { name: TRelation['fieldRef1']['fieldName'] }>,
60-
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>
81+
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>,
82+
TRelation
6183
>
6284

6385
type CreateLinksFunction<
@@ -92,10 +114,11 @@ type DeleteLinkByIdFunctionResult<
92114
TFieldRef2DataFormat extends T[number],
93115
TFieldRef1Field extends T[number]['fields'][number],
94116
TFieldRef2Field extends T[number]['fields'][number],
95-
TOptions extends DeleteLinkByIdFunctionOptions
117+
TOptions extends DeleteLinkByIdFunctionOptions,
118+
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>
96119
> = TOptions extends { return: boolean }
97120
? TOptions['return'] extends true
98-
? JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field> | null
121+
? JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TRelation> | null
99122
: boolean
100123
: boolean
101124

@@ -105,10 +128,11 @@ type DeleteLinkByIdFunction<
105128
TFieldRef2DataFormat extends T[number],
106129
TFieldRef1Field extends T[number]['fields'][number],
107130
TFieldRef2Field extends T[number]['fields'][number],
131+
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>
108132
> = <TOptions extends DeleteLinkByIdFunctionOptions = DeleteLinkByIdFunctionOptions>(
109133
options: TOptions
110134
) => Promise<
111-
DeleteLinkByIdFunctionResult<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TOptions>
135+
DeleteLinkByIdFunctionResult<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TOptions, TRelation>
112136
>
113137

114138
export type _DeleteLinkByIdFunction<
@@ -128,12 +152,13 @@ export type _JoinTableStore<
128152
TFieldRef2DataFormat extends T[number],
129153
TFieldRef1Field extends T[number]['fields'][number],
130154
TFieldRef2Field extends T[number]['fields'][number],
155+
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>,
131156
> = {
132157
provision: () => Promise<void>
133158
unprovision: () => Promise<void>
134-
createlink: CreateLinkFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
135-
createLinks: CreateLinksFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
136-
deleteLinkById: DeleteLinkByIdFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
159+
create: CreateLinkFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TRelation>
160+
createMultiple: CreateLinksFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
161+
deleteById: DeleteLinkByIdFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TRelation>
137162
}
138163

139164
type AnyManyToManyRelation<T extends DataFormatDeclarations> =
@@ -147,7 +172,8 @@ export type JoinTableStore<
147172
Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>,
148173
Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>,
149174
Extract<Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>['fields'][number], { name: TRelation['fieldRef1']['fieldName'] }>,
150-
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>
175+
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>,
176+
TRelation
151177
>
152178

153179
export type JoinTableStoresDict<

0 commit comments

Comments
 (0)