Поделиться пользователем или любым свойством через контроллер к различным слоям - PullRequest
0 голосов
/ 07 октября 2019

Я использую nodejs и выражаю промежуточное программное обеспечение, которое кодирует / декодирует токен, содержащий сведения о пользователе (userId, name и т. Д.) И добавляя свойство User в запрос. Мне нужно использовать одно из «пользовательских» свойств (userId) в каком-либо подписчике typeorm, чтобы написать, какой пользователь выполнил каждое обновление.

Моя архитектура очень проста, просто

(промежуточное ПО) => controller => services => DAL

 TYPEORM MODELS and SUBSCRIBERS

Я не хочу передавать пользователя через все уровни (controller / services / dal).

Вопрос в том, чтоправильный способ сделать это.

См. ниже некоторые части кода

@provide(TYPES.GuardMiddleware)
class GuardMiddleware extends BaseMiddleware {
    public handler(req: IRequest, res: Response, next: NextFunction) {
        const token = req.headers.authorization;
        if (!token) {
            return next(new UnauthorizedError(warningCodes.UNAUTHENTICATED, 'No token provided'));
        }

        verify(token.toString(), config.Authentication.jwtAppSecret, (err: any, user: any) => {
            ...

            req.user = user;
            next();
        });
    }
}

@controller('/superuser', TYPES.LoggerMiddleware, TYPES.GuardMiddleware)
export class SuperUserController extends BaseController implements interfaces.Controller {
    @lazyInject(TYPES.SuperUserService)
    private superUserService: SuperUserService;

    @lazyInject(TYPES.UserService)
    private userService: UserService;

    constructor() {
        super();
    }

    @httpPost('/')
    private async create(@request() req: Request, @response() res: Response, @next() esNext: NextFunction) {
            const { fullName, email, password } = req.body;

            // TODO REMOVE
            const nemail = Date.now().toString() + email;

            const newSuperUser = await this.superUserService.create(fullName, nemail, password);

            return this.responseSuccess(res, successCodes.OK, 'SuperUser was successfully created', {
                fullName: newSuperUser.user.fullName,
                email: newSuperUser.user.email,
                id: newSuperUser.id,
            });        
    }
}
@provide(TYPES.SuperUserService)
export class SuperUserService {
    @lazyInject(TYPES.SuperUserDal)
    private superUserDal: SuperUserDal;

    @Transaction()
    public async create(fullName: string, email: string, password: string, @TransactionManager() transaction?: EntityManager): Promise<SuperUser> {
         const newUser: User = [create User];

         const superUser: SuperUser = await this.superUserDal.create(newUser, role, transaction);

         return superUser;
    }
}
@provide(TYPES.SuperUserDal)
export class SuperUserDal extends BaseDal {
    public async create(user: User, role: Role, transaction?: EntityManager): Promise<SuperUser> {
            const superUser = new SuperUser();
            superUser.user = user;
            superUser.roles = [role];
}
@Entity('superUsers')
export class SuperUser extends BaseModel implements IEntityStatus {
    @PrimaryGeneratedColumn()
    public id: number;

    ...

    @AfterUpdate()
    doSomethingAfterUpdate() {
         console.log("event: Post entity has been updated and callback executed");

I NEED HERE THE USER_ID     
    }
}
...