Skip to content

Commit

Permalink
Merge pull request #702 from jeremydaly/move-conditions-to-actions
Browse files Browse the repository at this point in the history
Move conditions to actions
  • Loading branch information
ThomasAribart committed Apr 5, 2024
2 parents 964e9b3 + faee4d8 commit 5d134bb
Show file tree
Hide file tree
Showing 70 changed files with 644 additions and 381 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import type { DeleteCommandInput } from '@aws-sdk/lib-dynamodb'
import isEmpty from 'lodash.isempty'

import type { EntityV2 } from 'v1/entity'
import { EntityConditionParser } from 'v1/entity/actions/parseCondition'
import { parseCapacityOption } from 'v1/operations/utils/parseOptions/parseCapacityOption'
import { parseMetricsOption } from 'v1/operations/utils/parseOptions/parseMetricsOption'
import { parseReturnValuesOption } from 'v1/operations/utils/parseOptions/parseReturnValuesOption'
import { rejectExtraOptions } from 'v1/operations/utils/parseOptions/rejectExtraOptions'
import { parseCondition } from 'v1/operations/expression/condition/parse'

import { deleteItemCommandReturnValuesOptionsSet, DeleteItemOptions } from '../options'

Expand Down Expand Up @@ -40,7 +40,7 @@ export const parseDeleteItemOptions = <ENTITY extends EntityV2>(
ExpressionAttributeNames,
ExpressionAttributeValues,
ConditionExpression
} = parseCondition(entity, condition)
} = entity.build(EntityConditionParser).parse(condition).toCommandOptions()

if (!isEmpty(ExpressionAttributeNames)) {
commandOptions.ExpressionAttributeNames = ExpressionAttributeNames
Expand Down
4 changes: 2 additions & 2 deletions src/v1/entity/actions/commands/deleteItem/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import type {
NoneReturnValuesOption,
AllOldReturnValuesOption
} from 'v1/operations/constants/options/returnValues'
import type { Condition } from 'v1/operations/types'
import type { EntityV2 } from 'v1/entity'
import type { EntityCondition } from 'v1/entity/actions/parseCondition'

export type DeleteItemCommandReturnValuesOption = NoneReturnValuesOption | AllOldReturnValuesOption

Expand All @@ -17,5 +17,5 @@ export interface DeleteItemOptions<ENTITY extends EntityV2 = EntityV2> {
capacity?: CapacityOption
metrics?: MetricsOption
returnValues?: DeleteItemCommandReturnValuesOption
condition?: Condition<ENTITY>
condition?: EntityCondition<ENTITY>
}
4 changes: 2 additions & 2 deletions src/v1/entity/actions/commands/putItem/options.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { EntityV2 } from 'v1/entity'
import type { EntityCondition } from 'v1/entity/actions/parseCondition'
import type { CapacityOption } from 'v1/operations/constants/options/capacity'
import type { MetricsOption } from 'v1/operations/constants/options/metrics'
import type { ReturnValuesOption } from 'v1/operations/constants/options/returnValues'
import type { Condition } from 'v1/operations/types'

export type PutItemCommandReturnValuesOption = ReturnValuesOption

Expand All @@ -18,5 +18,5 @@ export interface PutItemOptions<ENTITY extends EntityV2 = EntityV2> {
capacity?: CapacityOption
metrics?: MetricsOption
returnValues?: PutItemCommandReturnValuesOption
condition?: Condition<ENTITY>
condition?: EntityCondition<ENTITY>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { PutCommandInput } from '@aws-sdk/lib-dynamodb'
import isEmpty from 'lodash.isempty'

import type { EntityV2 } from 'v1/entity'
import { parseCondition } from 'v1/operations/expression/condition/parse'
import { EntityConditionParser } from 'v1/entity/actions/parseCondition'
import { parseCapacityOption } from 'v1/operations/utils/parseOptions/parseCapacityOption'
import { parseMetricsOption } from 'v1/operations/utils/parseOptions/parseMetricsOption'
import { parseReturnValuesOption } from 'v1/operations/utils/parseOptions/parseReturnValuesOption'
Expand Down Expand Up @@ -41,7 +41,7 @@ export const parsePutItemOptions = <ENTITY extends EntityV2>(
ExpressionAttributeNames,
ExpressionAttributeValues,
ConditionExpression
} = parseCondition(entity, condition)
} = entity.build(EntityConditionParser).parse(condition).toCommandOptions()

if (!isEmpty(ExpressionAttributeNames)) {
commandOptions.ExpressionAttributeNames = ExpressionAttributeNames
Expand Down
4 changes: 2 additions & 2 deletions src/v1/entity/actions/commands/updateItem/options.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { CapacityOption } from 'v1/operations/constants/options/capacity'
import type { MetricsOption } from 'v1/operations/constants/options/metrics'
import type { ReturnValuesOption } from 'v1/operations/constants/options/returnValues'
import type { Condition } from 'v1/operations/types/condition'
import type { EntityV2 } from 'v1/entity'
import type { EntityCondition } from 'v1/entity/actions/parseCondition'

export type UpdateItemCommandReturnValuesOption = ReturnValuesOption

Expand All @@ -14,5 +14,5 @@ export interface UpdateItemOptions<ENTITY extends EntityV2 = EntityV2> {
capacity?: CapacityOption
metrics?: MetricsOption
returnValues?: UpdateItemCommandReturnValuesOption
condition?: Condition<ENTITY>
condition?: EntityCondition<ENTITY>
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import type { UpdateCommandInput } from '@aws-sdk/lib-dynamodb'

import type { EntityV2 } from 'v1/entity'
import { EntityConditionParser } from 'v1/entity/actions/parseCondition'
import { parseCapacityOption } from 'v1/operations/utils/parseOptions/parseCapacityOption'
import { parseMetricsOption } from 'v1/operations/utils/parseOptions/parseMetricsOption'
import { parseReturnValuesOption } from 'v1/operations/utils/parseOptions/parseReturnValuesOption'
import { rejectExtraOptions } from 'v1/operations/utils/parseOptions/rejectExtraOptions'
import { parseCondition } from 'v1/operations/expression/condition/parse'

import { updateItemCommandReturnValuesOptionsSet, UpdateItemOptions } from '../options'

Expand Down Expand Up @@ -40,7 +40,7 @@ export const parseUpdateItemOptions = <ENTITY extends EntityV2>(
ExpressionAttributeNames,
ExpressionAttributeValues,
ConditionExpression
} = parseCondition(entity, condition)
} = entity.build(EntityConditionParser).parse(condition).toCommandOptions()

commandOptions.ExpressionAttributeNames = ExpressionAttributeNames
commandOptions.ExpressionAttributeValues = ExpressionAttributeValues
Expand Down
39 changes: 39 additions & 0 deletions src/v1/entity/actions/parseCondition.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import type { NativeAttributeValue } from '@aws-sdk/util-dynamodb'

import { EntityV2, EntityAction } from 'v1/entity'
import { ConditionParser, Condition } from 'v1/schema/actions/parseCondition'

const $conditionParser = Symbol('$conditionParser')
type $conditionParser = typeof $conditionParser

export class EntityConditionParser<
ENTITY extends EntityV2 = EntityV2
> extends EntityAction<ENTITY> {
static operationName: 'parseCondition';
[$conditionParser]: ConditionParser<ENTITY['schema']>

constructor(entity: ENTITY, id = '') {
super(entity)
this[$conditionParser] = new ConditionParser(entity.schema, id)
}

setId(nextId: string): this {
this[$conditionParser].setId(nextId)
return this
}

parse = (condition: Condition): this => {
this[$conditionParser].parse(condition)
return this
}

toCommandOptions(): {
ConditionExpression: string
ExpressionAttributeNames: Record<string, string>
ExpressionAttributeValues: Record<string, NativeAttributeValue>
} {
return this[$conditionParser].toCommandOptions()
}
}

export type EntityCondition<ENTITY extends EntityV2 = EntityV2> = Condition<ENTITY['schema']>
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb'

import { DynamoDBToolboxError } from 'v1/errors'
import { EntityV2, EntityAction, $entity } from 'v1/entity'
import type { KeyInput } from 'v1/entity/actions/tParse'
import { DynamoDBToolboxError } from 'v1/errors'
import type { Condition } from 'v1/operations/types'
import type { EntityCondition } from 'v1/entity/actions/parseCondition'

import type { WriteItemTransaction } from '../types'
import { conditionCheckParams, ConditionCheckParams } from './conditionCheckParams'
Expand All @@ -21,10 +21,10 @@ export class ConditionCheck<ENTITY extends EntityV2 = EntityV2>

private [$key]?: KeyInput<ENTITY>
public key: (keyInput: KeyInput<ENTITY>) => ConditionCheck<ENTITY>
private [$condition]?: Condition<ENTITY>
public condition: (keyInput: Condition<ENTITY>) => ConditionCheck<ENTITY>
private [$condition]?: EntityCondition<ENTITY>
public condition: (keyInput: EntityCondition<ENTITY>) => ConditionCheck<ENTITY>

constructor(entity: ENTITY, key?: KeyInput<ENTITY>, condition?: Condition<ENTITY>) {
constructor(entity: ENTITY, key?: KeyInput<ENTITY>, condition?: EntityCondition<ENTITY>) {
super(entity)
this[$key] = key
this[$condition] = condition
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { TransactWriteCommandInput } from '@aws-sdk/lib-dynamodb'
import type { EntityV2 } from 'v1/entity'
import { EntityParser } from 'v1/entity/actions/parse'
import type { KeyInput } from 'v1/entity/actions/tParse'
import type { Condition } from 'v1/operations/types'
import type { EntityCondition } from 'v1/entity/actions/parseCondition'

import { parseConditionCheck } from './parseConditionCheckOptions'

Expand All @@ -14,7 +14,7 @@ export type ConditionCheckParams = NonNullable<
export const conditionCheckParams = <ENTITY extends EntityV2>(
entity: ENTITY,
input: KeyInput<ENTITY>,
condition: Condition<ENTITY>
condition: EntityCondition<ENTITY>
): ConditionCheckParams => {
const { key } = entity.build(EntityParser).parse(input, { operation: 'key' })
const parsedCondition = parseConditionCheck(entity, condition)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
import isEmpty from 'lodash.isempty'

import type { EntityV2 } from 'v1/entity'
import type { Condition } from 'v1/operations/types'
import { parseCondition } from 'v1/operations/expression/condition/parse'
import { EntityConditionParser, EntityCondition } from 'v1/entity/actions/parseCondition'

import type { ConditionCheckParams } from './conditionCheckParams'

type TransactionOptions = Omit<ConditionCheckParams, 'TableName' | 'Key'>

export const parseConditionCheck = <ENTITY extends EntityV2>(
entity: ENTITY,
condition: Condition<ENTITY>
condition: EntityCondition<ENTITY>
): TransactionOptions => {
const {
ExpressionAttributeNames,
ExpressionAttributeValues,
ConditionExpression
} = parseCondition(entity, condition)
const { ExpressionAttributeNames, ExpressionAttributeValues, ConditionExpression } = entity
.build(EntityConditionParser)
.parse(condition)
.toCommandOptions()

const transactionOptions: TransactionOptions = { ConditionExpression }

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { EntityV2 } from 'v1/entity'
import type { ConditionOptions } from 'v1/operations/types/condition'
import type { EntityCondition } from 'v1/entity/actions/parseCondition'

export type DeleteItemTransactionOptions<
ENTITY extends EntityV2 = EntityV2
> = ConditionOptions<ENTITY>
export interface DeleteItemTransactionOptions<ENTITY extends EntityV2 = EntityV2> {
condition?: EntityCondition<ENTITY>
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import isEmpty from 'lodash.isempty'

import type { EntityV2 } from 'v1/entity'
import { parseCondition } from 'v1/operations/expression/condition/parse'
import { EntityConditionParser } from 'v1/entity/actions/parseCondition'
import { rejectExtraOptions } from 'v1/operations/utils/parseOptions/rejectExtraOptions'

import { DeleteItemTransactionOptions } from '../options'
Expand All @@ -22,7 +22,7 @@ export const parseDeleteItemTransactionOptions = <ENTITY extends EntityV2>(
ExpressionAttributeNames,
ExpressionAttributeValues,
ConditionExpression
} = parseCondition(entity, condition)
} = entity.build(EntityConditionParser).parse(condition).toCommandOptions()

if (!isEmpty(ExpressionAttributeNames)) {
transactionOptions.ExpressionAttributeNames = ExpressionAttributeNames
Expand Down
6 changes: 4 additions & 2 deletions src/v1/entity/actions/transactions/transactPutItem/options.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import type { EntityV2 } from 'v1/entity'
import type { ConditionOptions } from 'v1/operations/types/condition'
import type { EntityCondition } from 'v1/entity/actions/parseCondition'

export type PutItemTransactionOptions<ENTITY extends EntityV2 = EntityV2> = ConditionOptions<ENTITY>
export interface PutItemTransactionOptions<ENTITY extends EntityV2 = EntityV2> {
condition?: EntityCondition<ENTITY>
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import isEmpty from 'lodash.isempty'

import type { EntityV2 } from 'v1/entity'
import { parseCondition } from 'v1/operations/expression/condition/parse'
import { EntityConditionParser } from 'v1/entity/actions/parseCondition'
import { rejectExtraOptions } from 'v1/operations/utils/parseOptions/rejectExtraOptions'

import { PutItemTransactionOptions } from '../options'
Expand All @@ -23,7 +23,7 @@ export const parsePutItemTransactionOptions = <ENTITY extends EntityV2>(
ExpressionAttributeNames,
ExpressionAttributeValues,
ConditionExpression
} = parseCondition(entity, condition)
} = entity.build(EntityConditionParser).parse(condition).toCommandOptions()

if (!isEmpty(ExpressionAttributeNames)) {
commandOptions.ExpressionAttributeNames = ExpressionAttributeNames
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { EntityV2 } from 'v1/entity'
import type { ConditionOptions } from 'v1/operations/types/condition'
import type { EntityCondition } from 'v1/entity/actions/parseCondition'

export type UpdateItemTransactionOptions<
ENTITY extends EntityV2 = EntityV2
> = ConditionOptions<ENTITY>
export interface UpdateItemTransactionOptions<ENTITY extends EntityV2 = EntityV2> {
condition?: EntityCondition<ENTITY>
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { EntityV2 } from 'v1/entity'
import { parseCondition } from 'v1/operations/expression/condition/parse'
import { EntityConditionParser } from 'v1/entity/actions/parseCondition'
import { rejectExtraOptions } from 'v1/operations/utils/parseOptions/rejectExtraOptions'

import type { UpdateItemTransactionOptions } from '../options'
Expand All @@ -21,7 +21,7 @@ export const parseUpdateItemTransactionOptions = <ENTITY extends EntityV2>(
ExpressionAttributeNames,
ExpressionAttributeValues,
ConditionExpression
} = parseCondition(entity, condition)
} = entity.build(EntityConditionParser).parse(condition).toCommandOptions()

transactionOptions.ExpressionAttributeNames = ExpressionAttributeNames
transactionOptions.ExpressionAttributeValues = ExpressionAttributeValues
Expand Down
5 changes: 4 additions & 1 deletion src/v1/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ export type {
FromFormatOptions
} from './schema/actions/format'
export type { AttrPaths, SchemaPaths, Paths } from './schema/actions/paths'
export { ConditionParser } from './schema/actions/parseCondition'
export type { Condition } from './schema/actions/parseCondition'
// TODO: Pick relevant exports
export * from './schema/attributes'

Expand Down Expand Up @@ -87,9 +89,10 @@ export type {
} from './entity/actions/parse'
export { EntityTParser } from './entity/actions/tParse'
export type { EntityParserInput, KeyInput } from './entity/actions/tParse'
export { EntityConditionParser } from './entity/actions/parseCondition'
export type { EntityCondition } from './entity/actions/parseCondition'

// operations: TO REMOVE
export { parseCondition } from './operations/expression/condition/parse'
export { parseProjection } from './operations/expression/projection/parse'
// TODO: Pick relevant types
export * from './operations/types'
Expand Down
1 change: 0 additions & 1 deletion src/v1/operations/expression/condition/errors.ts

This file was deleted.

34 changes: 0 additions & 34 deletions src/v1/operations/expression/condition/parse.ts

This file was deleted.

1 change: 0 additions & 1 deletion src/v1/operations/expression/condition/parser/index.ts

This file was deleted.

5 changes: 1 addition & 4 deletions src/v1/operations/expression/errors.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import type { ErrorBlueprint } from 'v1/errors/blueprint'
import type { ConditionParserErrorBlueprints } from './condition/errors'

type InvalidExpressionAttributePathErrorBlueprint = ErrorBlueprint<{
code: 'operations.invalidExpressionAttributePath'
Expand All @@ -9,6 +8,4 @@ type InvalidExpressionAttributePathErrorBlueprint = ErrorBlueprint<{
}
}>

export type ExpressionParsersErrorBlueprints =
| ConditionParserErrorBlueprints
| InvalidExpressionAttributePathErrorBlueprint
export type ExpressionParsersErrorBlueprints = InvalidExpressionAttributePathErrorBlueprint
6 changes: 0 additions & 6 deletions src/v1/operations/types/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1 @@
export type {
Condition,
SchemaCondition,
AnyAttributeCondition,
NonLogicalCondition
} from './condition'
export type { Query } from './query'

0 comments on commit 5d134bb

Please sign in to comment.