/
guarded-by.decorator.ts
30 lines (25 loc) · 1.15 KB
/
guarded-by.decorator.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import {
parseRelationTupleWithReplacements,
RelationTupleStringGenerator,
RelationTupleWithReplacements,
} from '@nidomiro/relation-tuple-parser'
import { SetMetadata } from '@nestjs/common'
import { Reflector } from '@nestjs/core'
import { PossibleReplacements } from './possible-replacements'
type GuardedByMetadataType = RelationTupleWithReplacements<PossibleReplacements>
const GUARDED_BY_METADATA_KEY = Symbol('GuardedByKey')
export const GuardedBy = (relationTuple: string | RelationTupleStringGenerator<PossibleReplacements>) => {
let valueToSet: GuardedByMetadataType
if (typeof relationTuple === 'string') {
valueToSet = parseRelationTupleWithReplacements(() => relationTuple).unwrapOrThrow()
} else {
valueToSet = parseRelationTupleWithReplacements(relationTuple).unwrapOrThrow()
}
return SetMetadata(GUARDED_BY_METADATA_KEY, valueToSet)
}
export const getGuardingRelationTuple = (
reflector: Reflector,
handler: Parameters<Reflector['get']>[1],
): RelationTupleWithReplacements<PossibleReplacements> | null => {
return reflector.get<GuardedByMetadataType, typeof GUARDED_BY_METADATA_KEY>(GUARDED_BY_METADATA_KEY, handler) ?? null
}