Schema students
# С символа # в схемах начинаются комментарии
### Курс, у каждого курса есть потоки, на которые уже записываются студенты
type Course {
id: ID!
name: String!
price: Float
# Конкретные запуски курса, потоки
flow: [Flow]
}
### Поток курса
type Flow {
id: ID!
# Отсылка на курс, к которому этот поток относится
course_id: ID
number: Int
# Формируется как Course.name - Flow.number (например, SQL - 1)
name: String
start_date: String
end_date: String
trainer: Trainer
# Тут количество студентов, которые учились / выпустились на потоке (НЕ делали возврат, в Student_on_Flow refund = 0)
students: int
# Тут количество студентов, которые сделали возврат (в Student_on_Flow refund > 0)
Refunded: int
# Чтобы соотнести студента и поток
students: [Student_on_Flow]
}
### Студент
type Student {
id: ID!
name: String!
surname: String!
courses: [Student_on_Flow]
}
### А это объект, чтобы соотнести студента с конкретным потоком обучения
type Student_on_Flow {
id_student: ID!
id_flow: ID!
# Сколько денег заплатил, при записи на курс сверяется с Course.price и не может быть больше
paid: Float
# Сколько денег вернул в случае отказа, не может быть больше, чем paid
refund: Float
# Выпустился ли?
graduate: Boolean
}
### Тренер
type Trainer {
id: ID!
name: String!
surname: String!
# Ведет разные курсы и разные потоки (условно есть курсы по SQL и API, он ведет только курсы по SQL и вел там потоки 1, 2, 5)
courses: [Course]
flows: [Flow]
}
### Запросы Query
type Query {
# Возвращает конкретного студента
getStudent(id: ID!): Student
# Возвращает все потоки по конкретному курсу
getAllFlowsOfCourse(course_id: ID!): [Flow]
# Возвращает всех выпускников курса по конкретному потоку (сбор со всех потоков, где graduate = true)
getAllGraduate(flow_id: ID!): [Student]
# Возвращает всех возвратников по конкретному потоку (где refund > 0). Смотрим SQL-1, там было 3 возврата, ага
getAllRefundByFlow(flow_id: ID!): [Student]
# Возвращает список всех возвратов студента (где refund > 0). То есть чтобы проверить, учится человек или каждый раз назад деньги просит
getAllRefundByStudent(course_id: ID!): [Student_on_Flow]
# Возвращает список всех курсов (потоков), которые студент прошел (где refund = 0).
getAllFlowsByStudent(student_id: ID!): [Student_on_Flow]
# Возвращает количество выпускников и возвратников по тренеру в разрезе потоков
getStatsByTrainer(trainer_id: ID!): String
}
### Запросы на изменение данных
type Mutation {
# Создать нового студента
addStudent ( id: ID!, name: String!, surname: String!): Student!
# Создать нового тренера
addTrainer ( id: ID!, name: String!, surname: String!): Trainer!
# Создать новый курс
addCourse ( id: ID!, name: String!, price: Float): Course!
# Создать новый поток курса
addFlow ( id: ID!, course_id: ID!, number: Int, start_date: String, end_date: String, trainer_id: ID): Flow!
addFlowWithTrainer ( id: ID!, course_id: ID!, number: Int, start_date: String, end_date: String, trainer: Trainer): Flow!
# Сменить тренера — тренер заболел, или просто поменялся с коллегой. Просто назначает на поток нового тренера
changeTrainer ( id_flow: ID!, id_trainer: ID!): Flow!
# Записать студента на курс.
# paid — Сколько денег заплатил, сверяется с Course.price и не может быть больше
recordOnTheCource (id_student: ID!, id_flow: ID!, paid:Float)
# Возврат денег студенту за курс. Paid не может быть больше, чем он заплатил в Student_on_Flow
refundOnTheCource(id_student: ID!, id_flow: ID!, refund:Float)
# Выпустить студентов (курс закончился, надо указать тех, кто выпустился)
graduateStudents (id_student: ID!, id_flow: ID!)
# Удалить студента / тренера / курс / поток
deleteStudent ( id_student: ID!): Student!
deleteTrainer : Trainer!
deleteFlow : Flow!
deleteCourse : Course!
}