Я изучаю Ramda.js.Функция, которую я пытаюсь изменить с помощью Ramda, приведена ниже.Он вызывает функцию firestore
метод базы данных, чтобы получить некоторые данные.Но firestore возвращает данные внутри snapshot
метода, и нам нужно вызвать .data()
.В зависимости от результата, я хочу построить разные ответы.
Хотелось бы здесь, чтобы ваш мыслительный процесс
const queryForUsersQuizResults = async (request, response) => {
try {
const snapshot = await firestore
.collection("quizResults")
.doc(request.user.uid)
.collection("courses_chapters")
.doc(request.params.courseId + "_" + request.params.chapterId)
.get();
let data = snapshot.data();
if (!data) {
data = {
message: "result not found for this user for this course and chapter"
};
}
return response.send(data);
} catch (error) {
return response.status(500).send(error);
}
}
... и вот что я былвозможность рефакторинга, хотел бы видеть лучше / другие способы сделать это (я не уверен, если это вообще работает).Я борюсь с методом sendResult
.
//get user id
export const getUserId = pathOr('', ['user', 'uid']);
// get chapter id
export const getChapterId = concat(pathOr('', ['params', 'courseId']), '_', pathOr('', ['params', 'chapterId']));
//queryQuizResult
export const query = curry(async (firestore, request) => {
return tryCatch(() =>
firestore
.collection("quizResults")
.doc(getUserId(request))
.collection("courses_chapters")
.doc(getChapterId(request))
.get(), F)();
});
//Receives "response" object and calls response.status with the value passed to the new status function
export const status = invoker(1, "status");
//Receives "response" object and calls response.send witht he value passed to the new send function
export const send = invoker(1, "send");
//Create {"message",Your_Error} object
export const constructError = objOf('message');
//Returns JSON from Firestore's snapshot object
export const getDataFromSnapshot = (snapshot) => snapshot.data();
//Actual error message
const QUIZ_RESULTS_NOT_FOUND = "Quiz results not found for this user for this course and chapter";
//Returns error message
export const quizResultsNotFoundError = constructError(QUIZ_RESULTS_NOT_FOUND);
//Receives "response" object and calls response.status and then respose.send
export const sendError = pipe(
status(401),
send(quizResultsNotFoundError)
);
//Sends valid result //IS there any better way of doing this?
export const sendResult = (snapshot, response) => {
const data = getDataFromSnapshot(snapshot);
response.send(data); //Especially this, I wanted to use the "send" method and pipe things
}
//Main Method
export const queryForUsersQuizResults = async (firestore, request, response) => {
const snapshot = await query(firestore, request);
snapshot ? sendResult(snapshot, response) :sendError(response);
}