Skip to content

Instantly share code, notes, and snippets.

View ktutnik's full-sized avatar

Ketut Sandiarsa ktutnik

View GitHub Profile
Time UserId Resource Action Status Data
2019-06-01 10:00:00 4000 Users Read Success { json }
2019-06-01 10:05:00 4000 Users Add Success { json }
2019-06-01 10:06:00 4000 Todos Read Error { json }
2019-06-01 10:07:00 4000 Todos Modify Success { json }
export class UsersController {
// --------- other methods removed for clarity
@ownerOrAdmin()
@route.put(":id")
async modify(id: number, data: User, @bind.user() user:LoginUser) {
const audit = <Audit>{
userId: user.userId,
action: "Modify",
resource: "Users",
export class UsersController {
// --------- other methods removed for clarity
@ownerOrAdmin()
@route.put(":id")
async modify(id: number, data: User) {
const password = await bcrypt.hash(data.password, 10)
return db("User").update({ ...data, password }).where({ id })
}
}
export class UsersController {
// ----- other methods removed for clarity
@ownerOrAdmin()
@route.delete(":id")
async delete(id: number, @bind.user() user: LoginUser) {
const audit = <Audit>{
userId: user.userId,
action: "Delete",
resource: "Users",
export class UserActivityMiddleware implements Middleware {
async execute(next: Readonly<Invocation>): Promise<ActionResult> {
if (next.context.route && next.context.state.user) {
const audit = createAudit(next.context)
try {
const result = await next.proceed()
await db("Audit").insert(<Audit>{...audit, status: "Success"})
return result
}
catch (e) {
const AuditActionMap = new Map([
["get", "Read"],
["post", "Add"],
["put", "Modify"],
["delete", "Delete"]
])
function createAudit(context: Context) {
const { route, state, method } = context
const controller = route!.controller.name
const CensorshipMap = new Map([
[User, (x: User) => (<User>{ ...x, password: "*****", email: "*****" })]
])
function censor(context: Context) {
const parameters = context.parameters || []
const types = context.route!.action.parameters.map(x => x.type)
return parameters.map((x, i) => {
const fn = CensorshipMap.get(types[i])
interface User extends Document {
email: string,
name: string,
birthDate: Date
}
const userValidator = joi.object({
email: joi.string().email(),
name: joi.string(),
birthDate: joi.date()
})
const UserModel = mongoose.model<User>("User", new Schema({
email: String,
name: String,
birthDate: Date
}))