Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Criar controllers

Boa tarde.

Estou com uma dúvida referente a criação de classes controller. Tenho duas classes, UsersController e ClientController, ambas estendem da classe BaseController. Minha BaseController implementa os métodos de CRUD que são comuns as duas classes filhas e as próximas que forem surgindo no desenvolvimento.

No meu modelo de negocio, tanto os clientes quanto usuários podem ter contas que acessam com email e senha, sendo assim preciso criar métodos como createPassword, resetPassword que são comuns a estas duas classes.

Não posso criar estes métodos em BaseController porque as outras classes futuras não utilizarão. Pensei em criar uma accountController e passar o model do recurso que quero trabalhar (users ou clients), porém meu app trabalha com rotas e para cada rota chamo o controller específico. Como fazer para disponibilizar estes métodos para meus dois recursos, sem precisar duplicar código escrevendo os mesmos métodos nas duas classes controller?

OBS: minha aplicação é uma api node + express utilizando TS.

Abaixo uma parte do código.

UserController

export class UsersController extends BaseController {
    constructor(_repository: UsersRepository) {
        super(_repository)
    }

}

const userRepository = new UsersRepository(UserModel)
export default new UsersController(userRepository)

BaseController

export class BaseController {

    constructor(private _repository: BaseRepository) { }
. . . 
}

users-router

const router = Router()

router.get('/', controller.findAll.bind(controller));
router.get('/:id', controller.findById.bind(controller));
router.post('/', multer.single('image'), /*dataValidator,*/ uploadAvatar.default.sendUploadToGCS,  controller.create.bind(controller));
router.put('/:id', controller.update.bind(controller));
router.delete('/:id', controller.delete.bind(controller));
export { router };
3 respostas
solução!

Fala aí Murilo, tudo bem? Bom, ja adianto que isso pode ser feito de N maneiras, pode ser que a que eu irei te falar seja diferente do que você verá por aí ou outras pessoas comentaram aqui na sua dúvida.

Bom, acho que você poderia criar uma classe AccountController que irá extender de BaseController e nela vai existir os dois métodos exclusivos e referentes a conta.

Depois, tanto no seu UserController quanto ClientController você agora via herdar de AccountController e não de BaseController, sacou?

Provavelmente vai dar certo.

Espero ter ajudado.

Entendi sim Matheus, realmente não havia pensado por este lado. Assim fica bom porque os outros recursos futuros podem estender BaseController e ter somente os métodos CRUD. Abordagens simples mas que não cheguei a pensar nela. Acho que por vir do JS ainda não estou acostumado a utilizar OO em tudo rs. Obrigado. Se alguém tiver outros pontos de vista de como fazer isso também gostaria de ver por aqui...

Boa Murilo, sempre que precisar não deixe de criar suas dúvidas.

Se a dúvida foi resolvida não deixe de marcar o tópico como solucionado.

Abraços e bons estudos.