Skip to content

Commit

Permalink
Merge pull request #7 from samhuk/story/6
Browse files Browse the repository at this point in the history
Story 6 - createLink() -> create(), typing for includeDateCreated, sql fixes for it, etc.
  • Loading branch information
samhuk authored Aug 15, 2022
2 parents a1b0952 + 0c6db08 commit 29928b7
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 27 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ts-pg-orm",
"version": "4.1.3",
"version": "4.1.4",
"description": "Typescript PostgreSQL ORM",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
3 changes: 2 additions & 1 deletion src/examples/realDbTest/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ const ORM = createTsPgOrm()
type: RelationType.MANY_TO_MANY,
fieldRef1: dfs.user.fieldRefs.id,
fieldRef2: dfs.userGroup.fieldRefs.id,
includeDateCreated: true,
},
] as const)

Expand Down Expand Up @@ -179,7 +180,7 @@ const addData = async (stores: Stores) => {
{ userId: 2, userGroupId: 2 },
{ userId: 3, userGroupId: 3 },
]
await Promise.all(createUserToUserGroupLinkOptions.map(stores['user.id <<-->> userGroup.id'].createlink))
await Promise.all(createUserToUserGroupLinkOptions.map(stores['user.id <<-->> userGroup.id'].create))
}

const getResult = (stores: Stores) => (
Expand Down
4 changes: 2 additions & 2 deletions src/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ describe('createTsPgOrm', () => {
})

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

// -- Assert
expect(joinTableRecord).toEqual({
Expand All @@ -80,7 +80,7 @@ describe('createTsPgOrm', () => {
})

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

// -- Assert
expect(deletedJoinTableRecord).toEqual({
Expand Down
2 changes: 1 addition & 1 deletion src/relations/sql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export const createManyToManyJoinTableSql = (r: RelationDeclaration<DataFormatDe
id serial primary key,
${columnName1} integer not null,
${columnName2} integer not null,
${(r.includeDateCreated ?? false) ? 'date_created not null default CURRENT_TIMESTAMP,' : ''}
${(r.includeDateCreated ?? false) ? 'date_created timestamp with time zone not null default CURRENT_TIMESTAMP,' : ''}
constraint ${fkeyName1} foreign key (${columnName1})
references public.${tableName1} (${fieldName1}) match simple
${(r.fieldRef1OnUpdateNoAction ?? true) ? 'on update no action' : ''}
Expand Down
12 changes: 6 additions & 6 deletions src/store/joinTable/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { createMockDbService } from '../../mock/dbService'
import { tsPgOrm } from '../../testData'

describe('joinTable', () => {
describe('createLink', () => {
describe('create', () => {
test('basic test', async () => {
const db = createMockDbService()
const manyToManyRelationsList = filterForManyToManyRelations(tsPgOrm.relations)
Expand All @@ -19,7 +19,7 @@ describe('joinTable', () => {
user_group_id: 3,
})

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

expect(newJoinTableRecord).toEqual({
id: 1,
Expand All @@ -37,7 +37,7 @@ values ($1, $2) returning *`,
})
})

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

db.queueResponse(true)

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

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

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

expect(newJoinTableRecord).toEqual({
id: 1,
Expand Down
6 changes: 3 additions & 3 deletions src/store/joinTable/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@ const createJoinTableStore = <T extends DataFormatDeclarations>(
return {
provision: () => db.query(relation.sql.createJoinTableSql).then(() => true as any),
unprovision: () => db.query(relation.sql.dropJoinTableSql).then(() => true as any),
createlink: options => createLink(options as any),
createLinks: options => createLinks(options as any),
deleteLinkById: options => deleteLink(options),
create: options => createLink(options as any) as any,
createMultiple: options => createLinks(options as any),
deleteById: options => deleteLink(options) as any,
}
}

Expand Down
52 changes: 39 additions & 13 deletions src/store/joinTable/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { DataFormatDeclarations, DataFormatFieldToRecordPropertyValue } from '../../dataFormat/types'
import { OmitTyped } from '../../helpers/types'
import { ExpandRecursively } from '../../helpers/types'
import {
ExtractRelationNamesOfManyToManyRelations,
Relation,
Expand All @@ -9,7 +9,7 @@ import {
RelationType,
} from '../../relations/types'

type JoinTableRecord<
type JoinTableRecordLinkedFields<
T extends DataFormatDeclarations,
TFieldRef1DataFormat extends T[number],
TFieldRef2DataFormat extends T[number],
Expand All @@ -19,15 +19,34 @@ type JoinTableRecord<
[fieldRef1FieldName in `${TFieldRef1DataFormat['name']}${Capitalize<TFieldRef1Field['name']>}`]: DataFormatFieldToRecordPropertyValue<TFieldRef1Field>
} & {
[fieldRef2FieldName in `${TFieldRef2DataFormat['name']}${Capitalize<TFieldRef2Field['name']>}`]: DataFormatFieldToRecordPropertyValue<TFieldRef2Field>
} & { id: number } // TODO: Do we need to make this configurable?
}

type JoinTableRecord<
T extends DataFormatDeclarations,
TFieldRef1DataFormat extends T[number],
TFieldRef2DataFormat extends T[number],
TFieldRef1Field extends T[number]['fields'][number],
TFieldRef2Field extends T[number]['fields'][number],
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>
> = ExpandRecursively<
JoinTableRecordLinkedFields<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
& {
id: number // TODO: Do we need to make this configurable?
}
& (TRelation extends { includeDateCreated: boolean }
? TRelation['includeDateCreated'] extends true
? { dateCreated: string }
: {}
: {})
>

type CreateJoinTableRecordOptions<
T extends DataFormatDeclarations,
TFieldRef1DataFormat extends T[number],
TFieldRef2DataFormat extends T[number],
TFieldRef1Field extends T[number]['fields'][number],
TFieldRef2Field extends T[number]['fields'][number],
> = OmitTyped<JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>, 'id'>
> = JoinTableRecordLinkedFields<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>

export type _CreateJoinTableRecordOptions<
T extends DataFormatDeclarations = DataFormatDeclarations,
Expand All @@ -39,14 +58,16 @@ export type _CreateJoinTableRecordOptions<
Extract<Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>['fields'][number], { name: TRelation['fieldRef1']['fieldName'] }>,
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>
>

type CreateLinkFunction<
T extends DataFormatDeclarations,
TFieldRef1DataFormat extends T[number],
TFieldRef2DataFormat extends T[number],
TFieldRef1Field extends T[number]['fields'][number],
TFieldRef2Field extends T[number]['fields'][number],
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>,
> = (options: CreateJoinTableRecordOptions<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>) => (
Promise<JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>>
Promise<JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TRelation>>
)

export type _CreateLinkFunction<
Expand All @@ -57,7 +78,8 @@ export type _CreateLinkFunction<
Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>,
Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>,
Extract<Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>['fields'][number], { name: TRelation['fieldRef1']['fieldName'] }>,
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>,
TRelation
>

type CreateLinksFunction<
Expand Down Expand Up @@ -92,10 +114,11 @@ type DeleteLinkByIdFunctionResult<
TFieldRef2DataFormat extends T[number],
TFieldRef1Field extends T[number]['fields'][number],
TFieldRef2Field extends T[number]['fields'][number],
TOptions extends DeleteLinkByIdFunctionOptions
TOptions extends DeleteLinkByIdFunctionOptions,
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>
> = TOptions extends { return: boolean }
? TOptions['return'] extends true
? JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field> | null
? JoinTableRecord<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TRelation> | null
: boolean
: boolean

Expand All @@ -105,10 +128,11 @@ type DeleteLinkByIdFunction<
TFieldRef2DataFormat extends T[number],
TFieldRef1Field extends T[number]['fields'][number],
TFieldRef2Field extends T[number]['fields'][number],
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>
> = <TOptions extends DeleteLinkByIdFunctionOptions = DeleteLinkByIdFunctionOptions>(
options: TOptions
) => Promise<
DeleteLinkByIdFunctionResult<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TOptions>
DeleteLinkByIdFunctionResult<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TOptions, TRelation>
>

export type _DeleteLinkByIdFunction<
Expand All @@ -128,12 +152,13 @@ export type _JoinTableStore<
TFieldRef2DataFormat extends T[number],
TFieldRef1Field extends T[number]['fields'][number],
TFieldRef2Field extends T[number]['fields'][number],
TRelation extends AnyManyToManyRelation<T> = AnyManyToManyRelation<T>,
> = {
provision: () => Promise<void>
unprovision: () => Promise<void>
createlink: CreateLinkFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
createLinks: CreateLinksFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
deleteLinkById: DeleteLinkByIdFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
create: CreateLinkFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TRelation>
createMultiple: CreateLinksFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field>
deleteById: DeleteLinkByIdFunction<T, TFieldRef1DataFormat, TFieldRef2DataFormat, TFieldRef1Field, TFieldRef2Field, TRelation>
}

type AnyManyToManyRelation<T extends DataFormatDeclarations> =
Expand All @@ -147,7 +172,8 @@ export type JoinTableStore<
Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>,
Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>,
Extract<Extract<T[number], { name: TRelation['fieldRef1']['formatName'] }>['fields'][number], { name: TRelation['fieldRef1']['fieldName'] }>,
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>
Extract<Extract<T[number], { name: TRelation['fieldRef2']['formatName'] }>['fields'][number], { name: TRelation['fieldRef2']['fieldName'] }>,
TRelation
>

export type JoinTableStoresDict<
Expand Down

0 comments on commit 29928b7

Please sign in to comment.