import { RouteDecorators, ExpressService } from "root-ts" import { AuthenticationService } from "../service/authenticationService"; import { AccountService } from "../service/accountService"; import { Errors } from "../errors" function A() { } export class AccountDecorators extends RouteDecorators { static instance = new AccountDecorators() static decorate: (name: string) => any = AccountDecorators.instance.decorate.bind(AccountDecorators.instance) constructor() { super(AccountDecoratorsSpec) this.implement("WithAccount", (context, option, pass) => { if (context.req.headers["x-auth-token"]) { let token = context.req.headers["x-auth-token"] as string context.services.AuthenticationService.getTokenInfo({ token }, (err, info) => { if (err) { context.error(new Errors.Forbidden) return } context.services.AccountService.get(info.account.id, (err, account) => { if (err) { context.error(new Errors.Forbidden("Can't find existing account")) return } // Still set account in this case. // But we respect token more then session.account. let session: any = context.req.session || {} session.account = account context.info.account = account pass() }) }) } else { let session: any = context.req.session || {} if (!context.req.session || !session.account) { context.error(new Errors.Forbidden) return } let id = session.account.id context.services.AccountService.get(id, (err, account) => { if (err) { context.error(new Errors.Forbidden("Can't find existing account")) return } session.account = account context.info.account = account pass() }) } }) } } export const AccountDecoratorsSpec = { // obtain account in token/session WithAccount: new class { services: { AuthenticationService: AuthenticationService AccountService: AccountService ExpressService: ExpressService } info: { account: Type.Account.AccountService.Account } req: { session: { user: Type.Account.AccountService.Account } } }, }