Здравствуйте.
Допустим я хочу сделать, апи блог-платформы. Предоставляю консюмерам такой ендпоинт:
/blogs?usrId={someValue}&filter[published]={someValue}
И теперь вынужден в коде рассмотреть несколько вариантов, а именно:
Авторизованный или не авторизованный запрос = 2 варианта
Указан uresId или нет = 2 варианта
Значения filter[published] : undefined, true, false = 3 варианта
В итоге надо рассмотреть 2*2*3 = 12 случаев и выдавать либо данные либо ошибку авторизации.
Меня смущает что надо столько условий проверять, в одном контроллере это нормально? Или есть какой то другой способ организации такой логики, допустим сделать два ендпоинта, но тогда как их назвать?
Выскажите свои соображения пожалуйста?
UPD:
Вот такое пришлось написать:
const {
userId,
filter: { published },
} = params;
const qb = this.blogRepository
.createQueryBuilder()
.select(['id', 'title', '"createdAt"'])
.addSelect('SUBSTRING(body, 1, 300)', 'body');
if (currentUser) {
// request authorized
if (userId) {
qb.where('"userId" = :userId', { userId });
if (published === Published.unpub) {
if (currentUser.id === userId) {
qb.andWhere('published = :published', { published });
} else {
throw new UnauthorizedError();
}
} else if (published === undefined) {
if (currentUser.id !== userId) {
qb.andWhere('published = :published', {
published: Published.pub,
});
}
} else {
qb.andWhere('published = :published', {
published: Published.pub,
});
}
} else {
if (published === Published.unpub) {
qb.where('published = :published', { published }).andWhere(
'"userId" = :userId',
{ userId: currentUser.id }
);
} else if (published === undefined) {
qb.where('published = :published', {
published: Published.pub,
}).orWhere(
new Brackets((qb1) => {
qb1
.where('published = :published', { published: Published.unpub })
.andWhere('"userId" = :userId', { userId: currentUser.id });
})
);
} else {
qb.andWhere('published = :published', { published });
}
}
} else {
// request not authorized
if (userId) {
qb.where('"userId" = :userId', { userId });
if (published === Published.unpub) {
throw new UnauthorizedError();
} else {
qb.andWhere('published = :published', { published: Published.pub });
}
} else {
if (published === Published.unpub) {
throw new UnauthorizedError();
} else {
qb.andWhere('published = :published', { published: Published.pub });
}
}
}
Всем спасибо за внимание.