2021-08-16 10:23:45 +02:00
|
|
|
export interface CollectionDocument {
|
|
|
|
id?: string
|
|
|
|
insertTime?: Date
|
|
|
|
updateTime?: Date
|
|
|
|
[key: string]: any
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface ReadCollectionOptions {
|
|
|
|
filter?: {
|
|
|
|
[key: string]: any
|
|
|
|
}
|
|
|
|
selector?: {
|
|
|
|
[key: string]: any
|
|
|
|
}
|
|
|
|
projection?: string
|
|
|
|
offset?: number
|
|
|
|
limit?: number
|
|
|
|
sort?: string[]
|
|
|
|
}
|
|
|
|
|
|
|
|
interface GetHookData {
|
|
|
|
/**
|
|
|
|
* true if only one document was requested via /COLLECTION/ID
|
|
|
|
*/
|
|
|
|
one?: boolean
|
|
|
|
/**
|
|
|
|
* get list of documents (only valid after stage "read" in "get" hook)
|
|
|
|
*/
|
|
|
|
results(): CollectionDocument[]
|
|
|
|
/**
|
|
|
|
* filter map only valid for "get" hooks
|
|
|
|
*/
|
|
|
|
filter?: {
|
|
|
|
[key: string]: any
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* selector map only valid for "get" hooks
|
|
|
|
*/
|
|
|
|
selector?: {
|
|
|
|
[key: string]: any
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* offset only valid for "get" hooks
|
|
|
|
*/
|
|
|
|
offset?: number
|
|
|
|
/**
|
|
|
|
* limit only valid for "get" hooks
|
|
|
|
*/
|
|
|
|
limit?: number
|
|
|
|
/**
|
|
|
|
* sort only valid for "get" hooks
|
|
|
|
*/
|
|
|
|
sort?: string[] | string
|
|
|
|
}
|
|
|
|
|
|
|
|
interface PostHookData {
|
|
|
|
/**
|
|
|
|
* post data only valid in "post" and "put" hooks
|
|
|
|
*/
|
|
|
|
data?: CollectionDocument
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface HookContext extends GetHookData, PostHookData {
|
|
|
|
request(): {
|
|
|
|
method: string
|
|
|
|
remoteAddr: string
|
|
|
|
host: string
|
|
|
|
url: string
|
|
|
|
path: string
|
|
|
|
param(p: string): string
|
|
|
|
query(q: string): string
|
|
|
|
header(h: string): string
|
|
|
|
body(): string
|
|
|
|
/**
|
|
|
|
* bodyBytes return []byte go slice of post body for later use pe. in iso8859ToUtf8
|
|
|
|
*/
|
|
|
|
bodyBytes(): string
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* read results from a collection
|
|
|
|
*
|
|
|
|
* @param colName collection name
|
|
|
|
* @param options options map
|
|
|
|
*/
|
|
|
|
readCollection(
|
|
|
|
colName: string,
|
|
|
|
options?: ReadCollectionOptions
|
|
|
|
): CollectionDocument[]
|
|
|
|
|
|
|
|
/**
|
|
|
|
* read count of documents for filter from a collection
|
|
|
|
*
|
|
|
|
* @param colName collection name
|
|
|
|
* @param options options map (only filter is valid)
|
|
|
|
*/
|
|
|
|
readCollectionCount(
|
|
|
|
colName: string,
|
|
|
|
options?: ReadCollectionOptions
|
|
|
|
): number
|
|
|
|
|
|
|
|
/**
|
|
|
|
* create a document in a collection
|
|
|
|
*
|
|
|
|
* @param colName collection name
|
|
|
|
* @param data data map
|
|
|
|
*/
|
|
|
|
createDocument(
|
|
|
|
colName: string,
|
|
|
|
data: CollectionDocument
|
|
|
|
): CollectionDocument
|
|
|
|
|
|
|
|
/**
|
|
|
|
* update a document in a collection
|
|
|
|
*
|
|
|
|
* @param colName collection name
|
|
|
|
* @param id id of entry
|
|
|
|
* @param data new/changed data
|
|
|
|
*/
|
|
|
|
updateDocument(
|
|
|
|
colName: string,
|
|
|
|
id: string,
|
|
|
|
data: CollectionDocument
|
|
|
|
): CollectionDocument
|
|
|
|
|
|
|
|
/**
|
|
|
|
* deletes one document by id from collection
|
|
|
|
*
|
|
|
|
* @param colName collection name
|
|
|
|
* @param id id of entry
|
|
|
|
*/
|
|
|
|
deleteDocument(colName: string, id: string): { message: "ok" }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* deletes documents by filter from collection
|
|
|
|
*
|
|
|
|
* @param colName collection name
|
|
|
|
* @param options options map, only filter valid
|
|
|
|
*/
|
|
|
|
deleteDocuments(
|
|
|
|
colName: string,
|
|
|
|
options?: ReadCollectionOptions
|
|
|
|
): { message: "ok"; removed: number }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* send an email
|
|
|
|
*
|
|
|
|
* @param options email options map
|
|
|
|
*/
|
|
|
|
mail(options: {
|
|
|
|
to: string | string[]
|
|
|
|
cc?: string | string[]
|
|
|
|
bcc?: string | string[]
|
|
|
|
subject?: string
|
|
|
|
from: string
|
|
|
|
fromName?: string
|
|
|
|
replyTo?: string
|
|
|
|
plain?: string
|
|
|
|
html?: string
|
|
|
|
attach?: string | string[]
|
|
|
|
}): void
|
|
|
|
|
|
|
|
/**
|
|
|
|
* execute a template code and return result
|
|
|
|
*
|
|
|
|
* @param code template code
|
|
|
|
* @param contextData template context map
|
|
|
|
*/
|
|
|
|
template(
|
|
|
|
code: string,
|
|
|
|
contextData?: {
|
|
|
|
[key: string]: any
|
|
|
|
}
|
|
|
|
): string
|
|
|
|
|
|
|
|
/**
|
|
|
|
* read a file relative to config dir and return its content
|
|
|
|
*
|
|
|
|
* @param path relative file path
|
|
|
|
*/
|
|
|
|
file(path: string): string
|
|
|
|
|
|
|
|
/**
|
|
|
|
* http request
|
|
|
|
*
|
|
|
|
* @param url url for request
|
|
|
|
* @param options request options
|
|
|
|
*/
|
|
|
|
fetch(
|
|
|
|
url: string,
|
|
|
|
options?: {
|
|
|
|
method?: string
|
|
|
|
headers?: { [key: string]: string }
|
|
|
|
body?: string
|
|
|
|
}
|
|
|
|
): {
|
|
|
|
status: number
|
|
|
|
statusText: string
|
|
|
|
headers: { [key: string]: string }
|
|
|
|
trailer: { [key: string]: string }
|
|
|
|
url: string
|
|
|
|
body: {
|
|
|
|
text(): string
|
|
|
|
json(): any
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* dumps data to header and server log
|
|
|
|
*
|
|
|
|
* @param toDump data to dump
|
|
|
|
*/
|
|
|
|
dump(...toDump: any): void
|
|
|
|
|
|
|
|
/**
|
|
|
|
* set response header
|
|
|
|
*
|
|
|
|
* @param name header name
|
|
|
|
* @param value value
|
|
|
|
*/
|
|
|
|
header(name: string, value: any): void
|
|
|
|
|
|
|
|
/**
|
|
|
|
* get JWT authentication
|
|
|
|
*/
|
|
|
|
auth(): {
|
|
|
|
id: string
|
|
|
|
username: string
|
|
|
|
role: number
|
|
|
|
permissions: string[]
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* get Sentry trace id
|
|
|
|
*/
|
|
|
|
sentryTraceId(): string
|
|
|
|
|
|
|
|
/**
|
|
|
|
* hash password via bcrypt algo
|
|
|
|
*
|
|
|
|
* @param password clear text password
|
|
|
|
* @param options hashing options
|
|
|
|
*/
|
|
|
|
bcryptHash(
|
|
|
|
password: string,
|
|
|
|
options?: {
|
|
|
|
cost?: number
|
|
|
|
}
|
|
|
|
): string
|
|
|
|
|
|
|
|
/**
|
|
|
|
* check password against hashed password via bcrypt algo
|
|
|
|
*
|
|
|
|
* @param password clear text password
|
|
|
|
* @param hash hashed password
|
|
|
|
*/
|
|
|
|
bcryptCheck(password: string, hash: string): boolean
|
|
|
|
|
|
|
|
/**
|
|
|
|
* create a jwt signed token string
|
|
|
|
*
|
|
|
|
* @param claims data object
|
|
|
|
* @param options options (secret, validityDuration = expiry in X seconds)
|
|
|
|
*/
|
|
|
|
jwtCreate(
|
|
|
|
claims: {
|
|
|
|
[key: string]: any
|
|
|
|
},
|
|
|
|
options?: {
|
|
|
|
secret?: string
|
|
|
|
validityDuration?: number
|
|
|
|
}
|
|
|
|
): string
|
|
|
|
|
|
|
|
/**
|
|
|
|
* parse jwt token string
|
|
|
|
*
|
|
|
|
* @param token token string
|
|
|
|
* @param options options (secret)
|
|
|
|
*/
|
|
|
|
jwtParse(
|
|
|
|
token: string,
|
|
|
|
options?: {
|
|
|
|
secret?: string
|
|
|
|
}
|
|
|
|
): {
|
|
|
|
error?: string
|
|
|
|
valid: boolean
|
|
|
|
method: {
|
|
|
|
Name: string
|
|
|
|
Hash: number
|
|
|
|
}
|
|
|
|
header: {
|
|
|
|
alg: string
|
|
|
|
typ: string
|
|
|
|
}
|
|
|
|
claims: {
|
|
|
|
exp?: number
|
|
|
|
[key: string]: any
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* convert iso8859 to utf8
|
|
|
|
*
|
|
|
|
* @param iso8859 iso string
|
|
|
|
*/
|
|
|
|
iso8859ToUtf8(iso8859: string): string
|
2021-08-16 10:35:56 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* convert image from source file to target file with filters
|
|
|
|
*
|
|
|
|
* @param sourceFile
|
|
|
|
* @param targetFile
|
|
|
|
* @param filters
|
|
|
|
*/
|
|
|
|
imageFilter(
|
|
|
|
sourceFile: string,
|
|
|
|
targetFile: string,
|
|
|
|
filters: {
|
|
|
|
fit?: boolean
|
|
|
|
fill?: boolean
|
|
|
|
width?: number
|
|
|
|
height?: number
|
|
|
|
brightness?: number
|
|
|
|
saturation?: number
|
|
|
|
contrast?: number
|
|
|
|
gamma?: number
|
|
|
|
blur?: number
|
|
|
|
sharpen?: number
|
|
|
|
invert?: boolean
|
|
|
|
grayscale?: boolean
|
|
|
|
quality?: number
|
|
|
|
}[]
|
|
|
|
): void
|
|
|
|
|
|
|
|
/**
|
|
|
|
* stat file or directory
|
|
|
|
*
|
|
|
|
* @param path
|
|
|
|
*/
|
|
|
|
fsStat(path: string): {
|
|
|
|
name: string
|
|
|
|
size: number
|
|
|
|
isDir: boolean
|
|
|
|
modTime: string
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* list directory entries
|
|
|
|
*
|
|
|
|
* @param path
|
|
|
|
*/
|
|
|
|
fsReadDir(path: string): {
|
|
|
|
name: string
|
|
|
|
size: number
|
|
|
|
isDir: boolean
|
|
|
|
modTime: string
|
|
|
|
}[]
|
|
|
|
|
|
|
|
/**
|
|
|
|
* make directory and all missing sub directories, no error if directory already exists
|
|
|
|
*
|
|
|
|
* @param path
|
|
|
|
*/
|
|
|
|
fsMkDir(path: string): void
|
2021-08-16 10:23:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface HookException {
|
|
|
|
status?: number
|
|
|
|
html?: string
|
2021-08-16 10:35:56 +02:00
|
|
|
file?: string
|
2021-08-16 10:23:45 +02:00
|
|
|
[key: string]: any
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface HookResponse extends GetHookData, PostHookData {
|
|
|
|
data?: CollectionDocument
|
|
|
|
results: any
|
|
|
|
}
|
|
|
|
|
|
|
|
declare global {
|
|
|
|
var context: HookContext
|
2021-08-16 10:35:56 +02:00
|
|
|
}
|