@rxstack/platform-callbacks
v0.8.0
Published
RxStack platform specific middleware
Downloads
132
Readme
RxStack Platform Callbacks
Set of helpers for
@rxstack/platform
Table of content
Installation
npm install @rxstack/platform-callbacks --save
Callbacks
Note:
preExecute
applies changes onrequest.body
andpostExecute
onevent.getData()
alter
Pick or pluck properties in data
Available on:
preExecute
postExecute
Options
:
method
:lodash/pick
|lodash/omit
fieldNames
: an array of field names.dataPath
: path to data (optional)
Example:
// ...
import {alter} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
alter('pick', ['name', 'user.fname'])
],
onPreExecute: [
// ...
alter('omit', ['_id', 'name'])
]
})
rename
Rename property and removes the original one.
Available on:
preExecute
postExecute
Options
:
key
: property name to renamenewKey
: new property namedataPath
: path to data (optional)
Example:
// ...
import {rename} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
rename('title', 'name')
],
onPreExecute: [
// ...
rename('_id', 'id', 'user')
]
})
associateWithCurrentUser
Adds current user identifier to request.body
.
Available on:
preExecute
Options
:
options: CurrentUserOptions
idField
: user identifier property. Optional, defaults toid
targetField
: property whereuser identifier
should be set. Optional, defaults touserId
Example:
// ...
import {associateWithCurrentUser} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
associateWithCurrentUser({idField: 'username', targetField: 'owner'})
]
})
queryWithCurrentUser
Adds current user identifier to request.attributes.get('query')
or request.attributes.get('criteria')
.
Available on:
preExecute
Options
:
options: CurrentUserOptions
idField
: user identifier property. Optional, defaults toid
targetField
: property whereuser identifier
should be set. Optional, defaults touserId
Example:
// ...
import {queryWithCurrentUser} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
queryWithCurrentUser({idField: 'username', targetField: 'owner'})
]
})
restrictToAuthenticatedUser
Restricts resource to authenticated user request.token
.
Available on:
preExecute
Options
:
fullyAuthenticated
: if user is fully authenticated (token is not refreshed) (optional)
Example:
// ...
import {restrictToAuthenticatedUser} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
restrictToAuthenticatedUser(false)
]
})
restrictToAnonymousUser
Restricts resource to anonymous user request.token
.
Available on:
preExecute
Example:
// ...
import {restrictToAnonymousUser} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
restrictToAnonymousUser()
]
})
restrictToOwner
Restricts resource to current user request.token.getUser()
.
Available on:
preExecute
Options
:
options: CurrentUserOptions
idField
: user identifier property. Optional, defaults toid
targetField
: property whereuser identifier
should be get. Optional, defaults touserId
Example:
// ...
import {restrictToOwner} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
restrictToOwner({idField: 'username', targetField: 'owner'})
]
})
restrictToRole
Restricts resource to current user role request.token.getRoles()
.
Available on:
preExecute
Options
:
role
: role to match
Example:
// ...
import {restrictToRole} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
restrictToRole('ROLE_ADMIN')
]
})
objectExists
Checks if object exists in database.
Available on:
preExecute
Options
:
schema: ObjectExistSchema<T>
service
: The type of service to fetch the recordtargetField
: field in therequest.body
inverseField
: field in the service modelmethod
: service method (optional), defaults tofindOne
criteria
: additional criteria (optional) see heredataPath
: path to data (optional)
Example:
// ...
import {objectExists} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
objectExists({
service: UserService,
targetField: 'user',
inverseField: 'username',
method: 'findOne',
criteria: {id: {'$ne': 'user-2'}},
dataPath: 'posts'
})
]
})
populate
Joins related records.
Available on:
postExecute
Options
:
schema: PopulateSchema<T>
service
: The type of service to fetch the recordstargetField
: field in theevent.getData()
inverseField
: field in the service modelmethod
: service method (optional), defaults tofindMany
nameAs
: replaces the original property name (optional)query
: additional query (optional) see here
Example:
// ...
import {populate} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPostExecute: [
// ...
populate({
service: UserService,
targetField: 'users',
inverseField: 'username',
method: 'findMany',
query: {where: {enabled: {'$eq': true}}, limit: 5, skip: 0, sort: { id: -1 } },
nameAs: 'owners'
})
]
})
queryFilter
Filter the query with @rxstack/query-filter
.
Modifies request.attributes.get('query')
.
Available on:
preExecute
Options
:
schema: QueryFilterSchema
Example:
// ...
import {queryFilter} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
queryFilter(taskQuerySchema)
]
})
setNow
Set the current date-time in certain fields
Available on:
preExecute
postExecute
Options
:
fieldNames
: array of field names.
Example:
// ...
import {setNow} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
setNow('createdAt', 'updatedAt')
]
})
softDelete
Flag records as logically deleted instead of physically removing them (sets the deleted date).
It can be used only with ResurceOperations
Internally it modifies the request.attributes.get(query)
or checks if deleteField
is null
Important: make sure you add it last on remove operations because it will skip the remaining hooks.
Available on:
preExecute
Options
:
schema: SoftDeleteOptions
addOnCreate
: Adds delete field withnull
value on create operations (optional), defaults tofalse
deleteField
: name of the field to set the date when the record was logically deleted (optional), defaults todeletedAt
Example:
// ...
import {softDelete} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
softDelete({
addOnCreate: true,
deleteField: 'deletedAt'
})
]
})
transform
Transforms values from request.body
or event.getData()
. It uses class-transformer
Available on:
preExecute
postExecute
Options
:
type
: Target which Types are being specified.options
: ClassTransformOptions
Example:
first create the model:
import {Expose} from 'class-transformer';
export class TaskTransformer {
@Expose({name: 'id'})
_id: string;
@Expose({groups: ['create']})
name: string;
}
then add the hook to operation:
// ...
import {transform} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
transform(TaskTransformer, {groups: ['create']})
]
})
validate
Validates object(s) using class-validator
Available on:
preExecute
Options
:
type
: validation schema or target which types are being specified.options
:ValidatorOptions
(optional)
Example with type:
// ...
import {validate} from '@rxstack/platform-callbacks';
import {IsBoolean, IsNotEmpty, Length} from 'class-validator';
export class TaskModel {
@IsNotEmpty({
groups: ['group1']
})
id: string;
@Length(2, 20, {
groups: ['group2']
})
name: string;
@IsBoolean({
groups: ['group1']
})
completed: boolean;
}
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
validate(TaskModel, { groups: ['group1'] })
]
})
validateUnique
Validates that a particular field (or fields) is (are) unique.
Available on:
preExecute
Options
:
service
: The type of service to fetch the recordsproperties
: List of fields on which this object should be uniqueerrorPath
: the path where the error should be mappedmethod
: service method (optional), defaults tofindMany
message
: error message (optional), default toValue is not unique
Example:
// ...
import {validateUnique} from '@rxstack/platform-callbacks';
@Operation<ResourceOperationMetadata<Task>>({
// ...
onPreExecute: [
// ...
validateUnique({
service: TaskService,
properties: ['name'],
errorPath: 'name',
method: 'findMany',
message: 'Property name should be unique'
})
]
})
License
Licensed under the MIT license.