Skip to content

Instantly share code, notes, and snippets.

View ktutnik's full-sized avatar

Ketut Sandiarsa ktutnik

View GitHub Profile
Method Route Access
POST /users Public
PATCH /users/:id Owner or Admin
export class User {
constructor(
public name:string,
public birthDate:Date,
public role: "User" | "Admin"
){}
}
@domain()
export class User {
constructor(
public name:string,
public birthDate:Date,
public role: "User" | "Admin"
){}
}
// custom authorization decorator
function ownerOrAdmin() {
return authorize.custom(async ({ role, user, parameters }) => {
return role.some(x => x === "Admin") || parameters[0] === user.userId
})
}
export class UsersController {
@ownerOrAdmin()
@route.patch(":id")
export class UsersController {
@authorize.public() // accessible to public
@route.post("")
async save(data: User) {
// implementation
}
@authorize.role("Admin") // accessible only to Admin
@route.get("")
@domain()
export class User {
constructor(
public name:string,
public birthDate:Date,
@authorize.role("Admin")
public role: "User" | "Admin"
){}
}
app.use((req, res, next) => {
// do something with request
// proceed next middleware
next()
})
app.use((req, res) => {
res.json({})
})
class ErrorMiddleare implements Middleware {
async execute(next: Readonly<Invocation>): Promise<ActionResult> {
try{
return await next.proceed()
}
catch(e){
// process the error or return ActionResult with status code
}
}
}
class ResponseTimeMiddleware implements Middleware {
async execute(next: Readonly<Invocation>): Promise<ActionResult> {
console.time("Response Time")
const result = await next.execute()
console.timeEnd("Response Time")
return result
}
}
export class SimpleMiddleware implements Middleware {
async execute(next: Readonly<Invocation>): Promise<ActionResult> {
//do something before execution
const result = await next.proceed()
//do something after execution
//return result or throw HttpStatusError
return result;
}
}