This is the API for the Quiz App. It provides the backend functionality for managing quizzes.
Before running the application, make sure you have the following installed:
- Node.js
- npm (Node Package Manager)
-
Clone the repository:
git clone git@github.com:mateuszpolis/quiz-app-api.git
-
Install the dependencies:
npm install
-
Create a
.env
file in the root directory and add the following environment variables:DB_HOST DB_PORT DB_USERNAME DB_PASSWORD DB_DATABASE
and specify the 'type' of the database you are using in the app.module.ts file.
TypeOrmModule.forRoot({ type: 'posgresql', // specify the type of database you are using, don't change the other values host: process.env.DB_HOST, port: process.env.DB_PORT, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, entities: [], synchronize: true, }),
-
Start the server:
npm run start
-
The server will start on port 3000.
Server running on port 3000
-
You can now access the API at
http://localhost:3000
.
The tests cover the functions in user and quiz resolvers and the services. They check if the functions are working as expected as well as the error handling.
To run the tests, use the following command:
npm run test
The API has the following functionality:
- Create a user
- Delete a user
- Create a quiz
- Delete a quiz
- Get questions for a quiz
- Submit a quiz
- Get results for a quiz
- Grant access to a quiz
createUser(createUserInput: CreateUserInput!): CreateUserOutput!
input CreateUserInput { username: String! role: String! }
type CreateUserOutput { id: ID! username: String! role: String! }
mutation {
createUser(
createUserInput: {
username: "user1"
role: "student"
}
) {
id
username
role
}
}
removeUser(id: Float!): CreateUserOutput!
type CreateUserOutput { id: ID! username: String! role: String! }
mutation {
removeUser(id: 1) {
id
username
role
}
}
createQuiz(createQuizInput: CreateQuizInput!): ID!
input CreateQuizInput { quiz_name: String! author_id: ID! is_public: Boolean! = false users_with_access: [ID!] description: String questions: [QuestionInput!]! }
input QuestionInput { question_text: String! question_type: QuestionType! points: Float! = 1 answers: [AnswerInput!]! }
input AnswerInput { answer_text: String! answer_response: String is_correct: Boolean = false order: Int }
mutation {
createQuiz(
createQuizInput: {
author_id: 1
is_public: true
quiz_name: "General Knowledge Quiz"
description: "A quiz testing your general knowledge"
questions: [
{
question_text: "What is the capital of France?"
question_type: single
points: 1
answers: [
{ answer_text: "London", is_correct: false }
{ answer_text: "Paris", is_correct: true }
{ answer_text: "Rome", is_correct: false }
{ answer_text: "Madrid", is_correct: false }
]
}
{
question_text: "Which of the following programming languages are object-oriented?"
question_type: multiple
points: 2
answers: [
{ answer_text: "Java", is_correct: true }
{ answer_text: "C", is_correct: false }
{ answer_text: "Python", is_correct: true }
{ answer_text: "Ruby", is_correct: true }
]
}
{
question_text: "Arrange the following events in chronological order"
question_type: sorting
points: 3
answers: [
{ answer_text: "Declaration of Independence", order: 1 }
{ answer_text: "World War II", order: 2 }
{ answer_text: "First Moon Landing", order: 3 }
]
}
{
question_text: "What is the famous phrase from Star Wars?"
question_type: text
points: 1
answers: [
{ answer_text: "", answer_response: "May the force be with you" }
]
}
]
}
)
}
delteQuiz(quiz_id: Float!, user_id: Float!): Boolean!
mutation {
deleteQuiz(quiz_id: 1, user_id: 1)
}
getQuestionsForQuiz(quiz_id: Float!, user_id: Float!): [QuestionOuptut!]!
type QuestionOuptut { question_id: ID! points: Float! question_text: String! question_type: QuestionType! answers: [AnswerOutput!] }
type AnswerOutput { answer_id: ID! answer_text: String! }
query {
getQuestionsForQuiz(quiz_id: 1, user_id: 1) {
question_id
points
question_text
question_type
answers {
answer_id
answer_text
}
}
}
submitQuiz(submitAnswersInput: SubmitQuizInput!): SubmitQuizOutput!
input SubmitQuizInput { user_id: ID! quiz_id: ID! answers: [SubmitAnswerInput!]! }
input SubmitAnswerInput { question_id: Int! answer_ids: [Int!] answer_response: String sorted_answers: [Int!] }
type SubmitQuizOutput { score: Float! total: Float! quiz_id: ID! user_id: ID! }
mutation {
submitQuiz(
submitAnswersInput: {
user_id: 1
quiz_id: 1
answers: [
{ question_id: 1, answer_ids: [2] }
{ question_id: 2, answer_ids: [5, 7, 8] }
{ question_id: 3, sorted_answers: [9, 10, 11] }
{ question_id: 4, answer_response: "May the force be with you" }
]
}
) {
score
total
quiz_id
user_id
}
}
getQuizResultStudent(quiz_id: Float!, user_id: Float!): QuizResultsOutput!
type QuizResultsOutput { score: Float! total: Float! user: User! user_answers: [UserAnswer!] }
type UserAnswer { user_answer_id: ID! user: User! quiz: Quiz! question: Question! answer_ids: [ID!] answer_response: String sorted_answers: [ID!] score: Float! }
query {
getQuizResultStudent(quiz_id: 1, user_id: 1) {
score
total
user {
username
role
}
user_answers {
user_answer_id
answer_response
score
question {
question_text
}
}
}
}
getQuizResultsTeacher(quiz_id: Float!, user_id: Float!): [QuizResultsOutput!]!
query {
getQuizResultsTeacher(quiz_id: 1, user_id: 1) {
score
total
user {
username
role
}
user_answers {
user_answer_id
answer_response
sorted_answers
answer_ids
score
question {
question_text
}
}
}
}
grantAcces(quiz_id: Float!, user_id: Float!, teacher_id: Float!): Boolean!
mutation {
grantAcces(quiz_id: 1, user_id: 1, teacher_id: 1)
}