1. await с .map не сработает, пока будет выполняться .map тебе уже вернет пустой массив, что бы этого избежать используй Promise.all(и тут применяй .map)
В твоем случае должно сработать примерно вот так:
async getProjectStates(project_id) {
const states = await State.findAll({
where: {
project_id
},
order: [
['serial_number', 'ASC']
]
})
let statesDto = []
if (states.length) {
await Promise.all(states.map(async state => {
const tasks = await Task.findAll({
where: {
state_id: state.id
},
order: [
['createdAt', 'DESC']
]
})
let tasksDto = []
if (tasks.length) {
tasks.map(task => {
const taskDto = new TaskDto(task)
tasksDto.push(taskDto)
})
}
const stateDto = new StateDto(state)
stateDto.tasks = tasksDto
statesDto.push(stateDto)
}))
}
return statesDto
}
2. Если это mongoose, то в states должен быть массив, а при запросе, который ничего не нашел должен возвращаться пустой массив. Пустой массив в JS все равно будет помечен как true, поэтому уместнее тут было бы делать условие по .length . Точно также с tasks в .map
const arr = []
console.log(Boolean(arr)) // true