# Электронный Дневник API

## Авторизация

<mark style="color:green;">`POST`</mark> `https://example.com/api/auth/`

Метод позволяет получить User ID и User Secret для дальнейшего использования API

#### Request Body

| Name         | Type   | Description                       |
| ------------ | ------ | --------------------------------- |
| vk\_user\_id | string | Vk User ID                        |
| device\_type | string | Тип устройства (pc, ios, android) |
| diary        | string | Название дневника                 |
| login        | string | Логин пользователя                |
| password     | string | Пароль пользователя               |
| region       | number | ID региона (для NetSchool)        |
| province     | number | ID области (для NetSchool)        |
| city         | number | ID города (для NetSchool)         |
| school       | number | ID школы (для NetSchool)          |

{% tabs %}
{% tab title="200 Пример успешной авторизации." %}

```javascript
// Successful authorization.
{
    "status": true, // Response status 
    "message": "Вы успешно авторизированы!",
    "id": 1000000000, // User ID
    "secret": "ffffffffff", // User Secret
    "created": true, // Logged in the first time or not
    "students": {
        "list": [
            {
                "id": 300,
                "name": "Павел Дуров",
                "class": "10а",
                "school_id": 400,
                "school_name": "МБОУ СОШ № 41"
            }
        ],
        "default": 300
    }
}

// Authorization failed.
{
    "status": false, // Response status
    "message": "Неправильный пароль или имя пользователя",    
}
```

{% endtab %}

{% tab title="422 Дргуие ошибки в авторизации." %}

```javascript
// Проблемы подключения к дневнику
{
    'error_msg': 'Communication error with diary. Unknown problem.',
    'error_code': 5,
}

// Пропущен специальный параметр для уникального дневника
{
    'error_msg': 'Missing parameter: region',
    'error_code': 1,
}

// и т.д
```

{% endtab %}
{% endtabs %}

## (VK) Привязка аккаунта

<mark style="color:green;">`POST`</mark> `https://example.com/api/auth/bind_account/vk/`

Метод привязывает VK Account к вашему аккаунту в дневнике

#### Request Body

| Name                            | Type   | Description        |
| ------------------------------- | ------ | ------------------ |
| id                              | number | User ID            |
| secret                          | string | User Secret        |
| sign                            | string | VK App query param |
| vk\_app\_id                     | number | VK App query param |
| vk\_user\_id                    | number | VK App query param |
| vk\_language                    | string | VK App query param |
| vk\_platform                    | string | VK App query param |
| vk\_is\_app\_user               | number | VK App query param |
| vk\_access\_token\_settings     | string | VK App query param |
| vk\_are\_notifications\_enabled | number | VK App query param |

{% tabs %}
{% tab title="200 Пример привязки аккаунта." %}

```javascript
// Successful bind.
{
    "status": true, 
    "message": "Accounts successfully linked"
}

// Binding failed.
{
    "status": false,
    "message": "Unable to linked accounts"
}
```

{% endtab %}
{% endtabs %}

## (VK) Авторизация через привязанный аккаунт

<mark style="color:blue;">`GET`</mark> `https://example.com/api/auth/bind_account/vk/`

Метод позволяет получить User ID и User Secret для дальнейшего использования API

#### Request Body

| Name                            | Type   | Description |
| ------------------------------- | ------ | ----------- |
| sign                            | string |             |
| vk\_app\_id                     | number |             |
| vk\_user\_id                    | number |             |
| vk\_language                    | string |             |
| vk\_platform                    | string |             |
| vk\_is\_app\_user               | number |             |
| vk\_access\_token\_settings     | string |             |
| vk\_are\_notifications\_enabled | number |             |

{% tabs %}
{% tab title="200 Пример успешного получения данных" %}

```javascript
// Successful authorization.
{
    "status": true, // Response status 
    "message": "Account found!",
    "id": 1000000000, // User ID
    "secret": "ffffffffff", // User Secret
    "created": true, // Logged in the first time or not
    "students": {
        "list": [
            {
                "id": 300,
                "name": "Павел Дуров",
                "class": "10а",
                "school_id": 400,
                "school_name": "МБОУ СОШ № 41"
            }
        ],
        "default": 300
    }
}
```

{% endtab %}

{% tab title="422 Пример получения данных с ошибкой" %}

```javascript
{
    "status": false,
    "message": "Invalid query sign"
}
```

{% endtab %}
{% endtabs %}

## (VK) Отвязка аккаунта&#x20;

<mark style="color:blue;">`GET`</mark> `https://example.com/api/auth/bind_account/vk/logout/`

Метод позволяет отвязать аккаунт от профиля вк

#### Query Parameters

| Name         | Type    | Description |
| ------------ | ------- | ----------- |
| id           | integer | User ID     |
| secret       | string  | User Secret |
| vk\_user\_id | integer | Vk User ID  |

{% tabs %}
{% tab title="200 " %}

```javascript
{
    'status': true, 
    'message': 'Success logout'
    }
```

{% endtab %}
{% endtabs %}

## (App) Привязка аккаунта

<mark style="color:green;">`POST`</mark> `https://example.com/api/auth/bind_account/app/`

Метод привязывает VK Account к вашему аккаунту в дневнике

#### Request Body

| Name     | Type   | Description |
| -------- | ------ | ----------- |
| id       | number | User ID     |
| secret   | string | User Secret |
| user\_id | number | VK User ID  |
| token    | string | VK Token    |

{% tabs %}
{% tab title="200 Пример привязки аккаунта" %}

```javascript
// Successful bind.
{
    "status": true, 
    "message": "Accounts successfully linked"
}

// Binding failed.
{
    "status": false,
    "message": "Unable to linked accounts"
}
```

{% endtab %}
{% endtabs %}

## (App) Авторизация через привязанный аккаунт

<mark style="color:blue;">`GET`</mark> `https://example.com/api/auth/bind_account/app/`

Метод позволяет получить User ID и User Secret для дальнейшего использования API

#### Request Body

| Name     | Type   | Description   |
| -------- | ------ | ------------- |
| user\_id | number | VK User ID    |
| token    | string | VK User Token |

{% tabs %}
{% tab title="200 Пример успешного получения данных" %}

```javascript
{
    "status": true, // Response status 
    "message": "Account found",
    "id": 1000000000, // User ID
    "secret": "fffff", // User Secret
}
```

{% endtab %}

{% tab title="422 Пример получения данных с ошибкой" %}

```javascript
{
    "status": false,
    "message": "Invalid user token"
}
```

{% endtab %}
{% endtabs %}

## Данные для авторизации

<mark style="color:blue;">`GET`</mark> `https://example.com/api/auth/get_data/`

Метод получает параметры для авторизации в NetSchool

#### Query Parameters

| Name     | Type   | Description |
| -------- | ------ | ----------- |
| region   | number | ID региона  |
| province | number | ID области  |
| city     | number | ID города   |

{% tabs %}
{% tab title="200 Примеры получения параметров для авторизации." %}

```javascript
// With region ID
{
    "data": [
        {
            "id": -4007,
            "name": "Городской округ Конфетка"
        },
        {
            "id": 27,
            "name": "Классный район"
        }
    ]
}

// With region ID and province ID
{
    "data": [
        {
            "id": 3,
            "name": "Калуга, г."
        }
    ]
}


// With region ID and province ID and city ID
{
    "data": [
        {
            "id": 555,
            "name": "НОУ \"Школа прекрасная\""
        },
        {
            "id": 557,
            "name": "НОЧУ \"СОШ \"Радуга\""
        }
    ]
}
```

{% endtab %}

{% tab title="422 Ошибки получения параметров для авторизации." %}

```javascript
// Проблемы подключения к дневнику
{
    "error": "Communication error with diary. Unknown problem."
}

// Пропущен специальный параметр для уникального дневника
{
    "error": "Missing special parameter for diary: NetSchool"
}

// и т.д
```

{% endtab %}
{% endtabs %}

## Список дневников

<mark style="color:blue;">`GET`</mark> `https://example.com/api/auth/get_types/`

Метод позволяет получать список доступных дневников

#### Query Parameters

| Name | Type    | Description         |
| ---- | ------- | ------------------- |
| full | boolean | Show all diary info |

{% tabs %}
{% tab title="200 " %}

```javascript
// Full output
{
    "data": {
        "diaries": {
            "mosru": {
                "name": "Дневник МЭШ",
                "status": true
            },
            "netschool": {
                "name": "Сетевой Город",
                "status": true
            },
            "edutatar": {
                "name": "Электронное образование в Республике Татарстан",
                "status": true
            },
            "mosreg": {
                "name": "Школьный портал Московской области",
                "status": false
            },
            "dnevnikru": {
                "name": "Дневник.ру",
                "status": false
            }
        },
        "types": [
            "mosru",
            "netschool",
            "edutatar",
            "mosreg",
            "dnevnikru"
        ]
    }
}

// or short
{
    "data": {
        "types": [
            "mosru",
            "netschool",
            "edutatar",
            "mosreg",
            "dnevnikru"
        ]
    }
}
```

{% endtab %}
{% endtabs %}

## Информация о профиле

<mark style="color:blue;">`GET`</mark> `https://example.com/api/profile/info/`

Метод позволяет получать информацию о вашем профиле

#### Query Parameters

| Name        | Type   | Description |
| ----------- | ------ | ----------- |
| student\_id | number | Student ID  |
| id          | number | User ID     |
| secret      | string | User Secret |

{% tabs %}
{% tab title="200 " %}

```javascript
{
    "data": {
        "class_name": "10а",
        "name": {
            "first_name": "Дуров",
            "last_name": "Павел",
            "middle_name": "Валерьевич"
        },
        "diary": "netschool",
        "status": "У", // or 'Р' (Ученик или Родитель)
        
        "exp": 97.9353493527481,
        "student_id": 400,
        
        "personal": {
            "phone": "88005553535",
            "email": "user@example.com",
            "birth_date": "1984-10-10",
            "sex": "M" // or 'W' (Man  or Woman)
        },
        
        "students": [
            {
                "id": 1,
                "name": "Громова Арабелла",
                "student_id": 400
            }
        ]
    }
}
```

{% endtab %}
{% endtabs %}

## Выбор ученика

<mark style="color:green;">`POST`</mark> `https://example.com/api/profile/students/`

Метод позволяет выбрать ученика по умолчанию

#### Query Parameters

| Name        | Type   | Description      |
| ----------- | ------ | ---------------- |
| id          | number | User ID          |
| secret      | string | User Secret      |
| student\_id | number | Diary student ID |

{% tabs %}
{% tab title="200 Пример ответа на успешный запрос" %}

```javascript
{
    'status': true, 
    'student_id': 22848 // Student id that you have chosen
}
```

{% endtab %}

{% tab title="422 Пример ответа на запрос с ошибкой" %}

```javascript
{
    'status': false, 
    'error': 'Not found user_id 4123 in [22848]'
}
```

{% endtab %}
{% endtabs %}

## Список учеников

<mark style="color:blue;">`GET`</mark> `https://example.com/api/profile/students/`

Метод позволяет получить список всех учеников на аккаунте

#### Query Parameters

| Name   | Type   | Description |
| ------ | ------ | ----------- |
| id     | number | User ID     |
| secret | string | User Secret |

{% tabs %}
{% tab title="200 Пример успешного получения списка учеников" %}

```javascript
{
    "students": [
        {
            "id": 300,
            "name": "Павел Дуров",
            "class": "10а",
            "school_id": 400,
            "school_name": "МБОУ СОШ № 41"
        }
    ],
    "default": 300
}
```

{% endtab %}
{% endtabs %}

## Journal Dates

<mark style="color:blue;">`GET`</mark> `https://example.com/api/diary/journal/dates/`

Метод позволяет получать данные дневника в определенный промежуток времени

#### Query Parameters

| Name        | Type   | Description                   |
| ----------- | ------ | ----------------------------- |
| student\_id | number | Student ID                    |
| id          | number | User ID                       |
| secret      | string | User Secret                   |
| start       | string | Date of start period DD.MM.YY |
| end         | string | Date of end period DD.MM.YY   |

{% tabs %}
{% tab title="200 Пример успешного получения данных" %}

```javascript
{
    "data": {
        "days": [
            {
                "date": "2019.09.16",
                "subjects": [
                    {
                        "name": "Физика",
                        "number": 1,
                        "assignments": [
                            {
                                "text": "Ускорение. Прямолинейное движение с постоянным ускорением."
                            }
                        ],
                        "marks": [
                            {
                                "value": 5,
                                "type": "five",
                                "date": "2019.09.16"
                            }
                        ],
                        "time": [
                            "08:30",
                            "09:15"
                        ]
                    },
                    {
                        "name": "Физкультура",
                        "number": 2,
                        "assignments": [
                            {
                                "text": "не задано"
                            }
                        ],
                        "time": [
                            "09:30",
                            "10:15"
                        ]
                    },
                    {
                        "name": "Алгебра и начала анализа",
                        "number": 3,
                        "assignments": [
                            {
                                "text": "не задано"
                            }
                        ],
                        "time": [
                            "10:30",
                            "11:15"
                        ]
                    },
                    {
                        "name": "Английский язык",
                        "number": 4,
                        "assignments": [
                            {
                                "text": "стр. 166 упр. 2 (дописать)"
                            }
                        ],
                        "time": [
                            "11:30",
                            "12:15"
                        ]
                    },
                    {
                        "name": "Основы общей химии",
                        "number": 5,
                        "time": [
                            "12:30",
                            "13:15"
                        ]
                    },
                    {
                        "name": "элективный курс по математике",
                        "number": 6,
                        "time": [
                            "13:35",
                            "14:20"
                        ]
                    },
                    {
                        "name": "Информатика и ИКТ",
                        "number": 7,
                        "assignments": [
                            {
                                "text": "п.4, №5, 6, 7, 8(б), 9(б), 12(б), задача на Паскале, №15 демо ЕГЭ"
                            },
                            {
                                "text": "Структура информации."
                            }
                        ],
                        "marks": [
                            {
                                "value": 5,
                                "type": "five",
                                "date": "2019.09.16"
                            }
                        ],
                        "room": "23",
                        "time": [
                            "14:30",
                            "15:15"
                        ]
                    }
                ]
            }
        ]
    }
}
```

{% endtab %}
{% endtabs %}

## Journal Range

<mark style="color:blue;">`GET`</mark> `https://example.com/api/diary/journal/range/`

Метод позволяет получать данные дневника в промежуток времени относительно текущей даты

#### Query Parameters

| Name        | Type   | Description                                     |
| ----------- | ------ | ----------------------------------------------- |
| student\_id | number | Student ID                                      |
| id          | number | User ID                                         |
| secret      | string | User Secret                                     |
| before      | number | Number of days in advance from the current date |
| after       | number | Number of days from the current date            |

{% tabs %}
{% tab title="200 Пример успешного получения данных" %}

```javascript
{
    "data": {
        "days": [
            {
                "date": "2019.09.16",
                "subjects": [
                    {
                        "name": "Физика",
                        "number": 1,
                        "assignments": [
                            {
                                "text": "Ускорение. Прямолинейное движение с постоянным ускорением."
                            }
                        ],
                        "marks": [
                            {
                                "value": 5,
                                "type": "five",
                                "date": "2019.09.16"
                            }
                        ],
                        "time": [
                            "08:30",
                            "09:15"
                        ]
                    },
                    {
                        "name": "Физкультура",
                        "number": 2,
                        "assignments": [
                            {
                                "text": "не задано"
                            }
                        ],
                        "time": [
                            "09:30",
                            "10:15"
                        ]
                    },
                    {
                        "name": "Алгебра и начала анализа",
                        "number": 3,
                        "assignments": [
                            {
                                "text": "не задано"
                            }
                        ],
                        "time": [
                            "10:30",
                            "11:15"
                        ]
                    },
                    {
                        "name": "Английский язык",
                        "number": 4,
                        "assignments": [
                            {
                                "text": "стр. 166 упр. 2 (дописать)"
                            }
                        ],
                        "time": [
                            "11:30",
                            "12:15"
                        ]
                    },
                    {
                        "name": "Основы общей химии",
                        "number": 5,
                        "time": [
                            "12:30",
                            "13:15"
                        ]
                    },
                    {
                        "name": "элективный курс по математике",
                        "number": 6,
                        "time": [
                            "13:35",
                            "14:20"
                        ]
                    },
                    {
                        "name": "Информатика и ИКТ",
                        "number": 7,
                        "assignments": [
                            {
                                "text": "п.4, №5, 6, 7, 8(б), 9(б), 12(б), задача на Паскале, №15 демо ЕГЭ"
                            },
                            {
                                "text": "Структура информации."
                            }
                        ],
                        "marks": [
                            {
                                "value": 5,
                                "type": "five",
                                "date": "2019.09.16"
                            }
                        ],
                        "room": "23",
                        "time": [
                            "14:30",
                            "15:15"
                        ]
                    }
                ]
            }
        ]
    }
}
```

{% endtab %}
{% endtabs %}

## Marks Dates

<mark style="color:blue;">`GET`</mark> `https://example.com/api/diary/marks/dates/`

Метод позволяет получать данные оценок в определенный промежуток времени

#### Query Parameters

| Name         | Type   | Description                   |
| ------------ | ------ | ----------------------------- |
| presentation | string | Data type (map or list)       |
| student\_id  | number | Student ID                    |
| id           | number | User ID                       |
| secret       | string | User Secret                   |
| start        | string | Date of start period DD.MM.YY |
| end          | string | Date of end period DD.MM.YY   |

{% tabs %}
{% tab title="200 Пример успешного получения данных" %}

```javascript
// Presentation: Map
{
    "data": {
        "dates": {
            "2019.09.16": [
                {
                    "value": 5,
                    "subject": "Физика",
                    "type": "five",
                    "date": "2019.09.16"
                },
                {
                    "value": 5,
                    "subject": "Информатика и ИКТ",
                    "type": "five",
                    "date": "2019.09.16"
                }
            ]
        },
        "lessons": [
            "Информатика и ИКТ",
            "Физика"
        ]
    }
}

// Presentation: list
{
    "data": {
        "list": [
            {
                "value": 5,
                "subject": "Физика",
                "type": "five",
                "date": "2019.09.16"
            },
            {
                "value": 5,
                "subject": "Информатика и ИКТ",
                "type": "five",
                "date": "2019.09.16"
            }
        ],
        "lessons": [
            "Информатика и ИКТ",
            "Физика"
        ]
    }
}
```

{% endtab %}
{% endtabs %}

## Marks Range

<mark style="color:blue;">`GET`</mark> `https://example.com/api/diary/marks/range/`

Метод позволяет получать данные оценок в промежуток времени относительно текущей даты

#### Query Parameters

| Name         | Type    | Description                                     |
| ------------ | ------- | ----------------------------------------------- |
| presentation | string  | Data type (map or list)                         |
| student\_id  | integer | Student ID                                      |
| id           | integer | User ID                                         |
| secret       | string  | User Secret                                     |
| before       | number  | Number of days in advance from the current date |
| after        | number  | Number of days from the current date            |

{% tabs %}
{% tab title="200 Пример успешного получения данных" %}

```javascript
// Presentation: Map
{
    "data": {
        "dates": {
            "2019.09.16": [
                {
                    "value": 5,
                    "subject": "Физика",
                    "type": "five",
                    "date": "2019.09.16"
                },
                {
                    "value": 5,
                    "subject": "Информатика и ИКТ",
                    "type": "five",
                    "date": "2019.09.16"
                }
            ]
        },
        "lessons": [
            "Информатика и ИКТ",
            "Физика"
        ]
    }
}

// Presentation: list
{
    "data": {
        "list": [
            {
                "value": 5,
                "subject": "Физика",
                "type": "five",
                "date": "2019.09.16"
            },
            {
                "value": 5,
                "subject": "Информатика и ИКТ",
                "type": "five",
                "date": "2019.09.16"
            }
        ],
        "lessons": [
            "Информатика и ИКТ",
            "Физика"
        ]
    }
}
```

{% endtab %}
{% endtabs %}

## All Marks

<mark style="color:blue;">`GET`</mark> `https://example.com/api/diary/marks/all/`

Метод позволяет получать список всех оценок

#### Query Parameters

| Name        | Type    | Description |
| ----------- | ------- | ----------- |
| student\_id | integer | Student ID  |
| id          | integer | User ID     |
| secret      | string  | User Secret |

{% tabs %}
{% tab title="200 Пример успешного получения данных" %}

```javascript
{
    "data": [
        {
            "name": "Англ. язык (база)",
            "year_mark": "4",
            "periods": [
                {
                    "title": "За первое полугодие",
                    "final_mark": "4",
                    "marks": [
                        {
                            "value": 4,
                            "type": "five",
                            "date": "2019.09.13"
                        }
                    ]
                },
                {
                    "title": "За второе полугодие",
                    "final_mark": "4",
                    "marks": [
                        {
                            "value": 5,
                            "type": "five",
                            "date": "2019.09.24"
                        },
                        {
                            "value": 5,
                            "type": "five",
                            "date": "2019.09.24"
                        }
                    ]
                }
            ]
        },
```

{% endtab %}
{% endtabs %}

## Список одноклассников

<mark style="color:blue;">`GET`</mark> `https://example.com/api/diary/classmates/`

Метод позволяет получать список всех зарегестрированных одноклассников

#### Query Parameters

| Name   | Type    | Description |
| ------ | ------- | ----------- |
| id     | integer | User ID     |
| secret | string  | User Secret |

{% tabs %}
{% tab title="200 " %}

```javascript
{
    "data": [
        {
            "id": 1713,
            "name": "Сева Жидков",
            "student_id": 59137,
            "status": "У",
            "b_date": "2003-02-20",
            "vk_account": 91670994,
            "exp": 83.1841
        },
        {
            "id": 567,
            "name": "Руслан Степанов",
            "student_id": 59143,
            "status": "У",
            "b_date": "2003-11-06",
            "vk_account": 170457741,
            "exp": 96.81611
        }
    ]
}
```

{% endtab %}
{% endtabs %}

## Список измененных дз

<mark style="color:blue;">`GET`</mark> `https://example.com/api/diary/homework/`

Метод позволяет получать список всех измененных дз

#### Query Parameters

| Name        | Type    | Description |
| ----------- | ------- | ----------- |
| student\_id | string  | Student ID  |
| id          | integer | User ID     |
| secret      | string  | User Secret |

{% tabs %}
{% tab title="200 " %}

```javascript
[
    {
        "id": 1,
        "text": "Измененный текст",
        "subject": "Русский язык",
        "number": 1,
        "date": "2019-10-25",
        "creator": {
            "id": 9658702045814958,
            "first_name": "Данила",
            "last_name": "Волков",
            "status": "У"
        }
    }
]
```

{% endtab %}
{% endtabs %}

## Создание измененного дз

<mark style="color:green;">`POST`</mark> `https://example.com/api/diary/homework/create/`

Метод позволяет создавать измененное дз / изменять созданное

#### Query Parameters

| Name        | Type    | Description       |
| ----------- | ------- | ----------------- |
| id          | integer | User ID           |
| secret      | string  | User Secret       |
| student\_id | integer | Student ID        |
| text        | string  | Your edit text    |
| subject     | string  | Subject name      |
| number      | integer | Subject number    |
| date        | string  | Day date DD.MM.YY |

{% tabs %}
{% tab title="200 " %}

```javascript
{
    "id": 1,
    "created": true,
    "edited": true
}
```

{% endtab %}
{% endtabs %}

## Отправить жалобу на дз

<mark style="color:green;">`POST`</mark> `https://example.com/api/diary/homework/report/`

Метод позволяет отправить жалобу на человека, изменившего дз

#### Query Parameters

| Name        | Type    | Description        |
| ----------- | ------- | ------------------ |
| id          | integer | User ID            |
| secret      | string  | User Secret        |
| student\_id | string  | Student ID         |
| edit\_id    | integer | Homework edited ID |

{% tabs %}
{% tab title="200 " %}

```javascript
{
    "status": true
}
```

{% endtab %}
{% endtabs %}
