Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
381 changes: 375 additions & 6 deletions generated/api.ts

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions generated/model/courseLessonListResponse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,7 @@ import type { CourseLessonListResponseItem } from './courseLessonListResponseIte

/**
* Программа курса: секции и отдельные уроки по порядку. Секция содержит массив lessons. Без секций возвращается обычный список уроков.
*
* Помимо вышедших уроков в программу попадают анонсированные - у них `isAvailable: false` и, если назначена, дата в `plannedReleaseAt`. Неанонсированные черновики не отдаются никому.
*/
export type CourseLessonListResponse = CourseLessonListResponseItem[];
16 changes: 11 additions & 5 deletions generated/model/courseLessonListResponseItem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,24 +38,30 @@ export type CourseLessonListResponseItem = {
id: string;
/** Название секции. */
title: string;
/** Опубликованные уроки секции в порядке их прохождения. */
lessons: {
/** Уроки секции в порядке прохождения: вышедшие и анонсированные, см. `isAvailable`. */
lessons: ({
/** Идентификатор урока. */
id: string;
/** Название урока. */
title: string;
/** Идентификатор урока для URL. */
slug: string;
/** Пройден ли урок текущим пользователем. Возвращается только при авторизации. */
/** Открыт ли урок. `false` - урок анонсирован, но ещё не вышел: показывайте его как «скоро» и не ведите на страницу урока, `GET /lessons/{id}` ответит 404. */
isAvailable: boolean;
plannedReleaseAt: string | null;
/** Пройден ли урок текущим пользователем. Возвращается только при авторизации. У невышедшего урока всегда `false`. */
isCompleted?: boolean;
}[];
})[];
} | {
/** Идентификатор урока. */
id: string;
/** Название урока. */
title: string;
/** Идентификатор урока для URL. */
slug: string;
/** Пройден ли урок текущим пользователем. Возвращается только при авторизации. */
/** Открыт ли урок. `false` - урок анонсирован, но ещё не вышел: показывайте его как «скоро» и не ведите на страницу урока, `GET /lessons/{id}` ответит 404. */
isAvailable: boolean;
plannedReleaseAt: string | null;
/** Пройден ли урок текущим пользователем. Возвращается только при авторизации. У невышедшего урока всегда `false`. */
isCompleted?: boolean;
};
7 changes: 6 additions & 1 deletion generated/model/courseLibraryResponseItem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
* OpenAPI spec version: 1.0.0
*/
import type { CourseLibraryResponseItemAccessMode } from './courseLibraryResponseItemAccessMode';
import type { CourseLibraryResponseItemStatus } from './courseLibraryResponseItemStatus';

/**
* Карточка курса в каталоге.
Expand All @@ -48,10 +49,14 @@ export type CourseLibraryResponseItem = {
thumbnail: string | null;
price: number | null;
discountPrice: number | null;
/** Как открываются закрытые уроки и материалы: `FREE` - курс полностью бесплатный, `PREMIUM` - по премиум-подписке или покупке курса, `PURCHASE` - только покупкой. Купленный курс открыт навсегда в любом режиме. */
/** Как открываются закрытые уроки и материалы: `FREE` - курс полностью бесплатный, `PREMIUM` - только по премиум-подписке, `PURCHASE` - только покупкой курса, `PREMIUM_OR_PURCHASE` - по подписке или покупке на выбор. Купленный курс открыт навсегда в любом режиме, даже если режим потом изменили. */
accessMode: CourseLibraryResponseItemAccessMode;
/** Главный статус курса - его и показывайте, остальные признаки идут отдельными полями. Считается на сервере: `DRAFT` - «В разработке» (публично не отдаётся), `ANNOUNCED` - «Скоро»: курс анонсирован, уроки ещё не выходят и купить его нельзя, `IN_PRODUCTION` - «Выходит поэтапно», `EARLY_ACCESS` - «Ранний доступ» (выходит поэтапно и доступен по подписке или покупке), `COMPLETED` - «Курс завершён», `PUBLICLY_RELEASED` - «Полная версия на YouTube», `ARCHIVED` - «В архиве». */
status: CourseLibraryResponseItemStatus;
/** Есть ли у курса материалы (исходный код). Скачать - `POST /courses/{slug}/materials/link`. */
hasMaterials: boolean;
/** Количество опубликованных уроков. */
lessons: number;
/** Сколько уроков анонсировано, но ещё не вышло. */
upcomingLessons: number;
};
3 changes: 2 additions & 1 deletion generated/model/courseLibraryResponseItemAccessMode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
*/

/**
* Как открываются закрытые уроки и материалы: `FREE` - курс полностью бесплатный, `PREMIUM` - по премиум-подписке или покупке курса, `PURCHASE` - только покупкой. Купленный курс открыт навсегда в любом режиме.
* Как открываются закрытые уроки и материалы: `FREE` - курс полностью бесплатный, `PREMIUM` - только по премиум-подписке, `PURCHASE` - только покупкой курса, `PREMIUM_OR_PURCHASE` - по подписке или покупке на выбор. Купленный курс открыт навсегда в любом режиме, даже если режим потом изменили.
*/
export type CourseLibraryResponseItemAccessMode = typeof CourseLibraryResponseItemAccessMode[keyof typeof CourseLibraryResponseItemAccessMode];

Expand All @@ -43,4 +43,5 @@ export const CourseLibraryResponseItemAccessMode = {
FREE: 'FREE',
PREMIUM: 'PREMIUM',
PURCHASE: 'PURCHASE',
PREMIUM_OR_PURCHASE: 'PREMIUM_OR_PURCHASE',
} as const;
50 changes: 50 additions & 0 deletions generated/model/courseLibraryResponseItemStatus.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* Generated by orval 🍺
* Do not edit manually.
* TeaCoder API
* API образовательной платформы [TeaCoder](https://teacoder.ru): курсы и уроки, прогресс обучения, аккаунты, оплата.
*
* ## Авторизация
*
* После входа сессия держится на двух токенах, и каждый живёт только в одном месте:
*
* - **access** - короткоживущий JWT, приходит **только в теле ответа** (`accessToken`). В cookie сервер его не кладёт. Храните его в памяти приложения (не в `localStorage`) и передавайте в заголовке `Authorization: Bearer <token>`.
* - **refresh** - долгоживущий токен, приходит **только в httpOnly-cookie `tc_refresh`**. В теле ответа его нет, и JavaScript на странице его не видит. Cookie ограничена путём `/auth/refresh`, так что к остальным запросам браузер её не прикладывает.
*
* Когда access-токен истёк (ответ 401) или приложение открыли заново, вызовите `POST /auth/refresh` без тела, с `credentials: 'include'`. Браузер сам отправит cookie, в ответ придёт новый `accessToken`, а cookie обновится. Refresh-токен одноразовый: повторное использование старого завершает сессию целиком.
*
* Защищённые методы помечены замком.
*
* ## Ошибки
*
* Успешный ответ - сами данные, без обёртки. Любая ошибка приходит в одном формате:
*
* ```json
* { "status": 400, "messages": ["Invalid email or password"] }
* ```
*
* `status` совпадает с HTTP-кодом, в `messages` - по одной строке на проблему (при ошибках валидации их может быть несколько).
*
* ## Повторные запросы и оплата
*
* Повторное создание платежа тем же способом возвращает его открытый счёт. Неоплаченный счёт другим способом не блокирует новый: пользователь может выбрать СБП, карту или криптовалюту, не дожидаясь истечения предыдущего счёта. Платёж в статусе PROCESSING по этому товару блокирует создание новых счетов до завершения обработки.
*
* `POST /billing/create` принимает заголовок `Idempotency-Key` (например, UUID): повтор с тем же ключом и теми же параметрами вернёт тот же платёж, с другими параметрами - ошибку 422. Подробности - в описании метода.
* OpenAPI spec version: 1.0.0
*/

/**
* Главный статус курса - его и показывайте, остальные признаки идут отдельными полями. Считается на сервере: `DRAFT` - «В разработке» (публично не отдаётся), `ANNOUNCED` - «Скоро»: курс анонсирован, уроки ещё не выходят и купить его нельзя, `IN_PRODUCTION` - «Выходит поэтапно», `EARLY_ACCESS` - «Ранний доступ» (выходит поэтапно и доступен по подписке или покупке), `COMPLETED` - «Курс завершён», `PUBLICLY_RELEASED` - «Полная версия на YouTube», `ARCHIVED` - «В архиве».
*/
export type CourseLibraryResponseItemStatus = typeof CourseLibraryResponseItemStatus[keyof typeof CourseLibraryResponseItemStatus];


export const CourseLibraryResponseItemStatus = {
DRAFT: 'DRAFT',
ANNOUNCED: 'ANNOUNCED',
IN_PRODUCTION: 'IN_PRODUCTION',
EARLY_ACCESS: 'EARLY_ACCESS',
COMPLETED: 'COMPLETED',
PUBLICLY_RELEASED: 'PUBLICLY_RELEASED',
ARCHIVED: 'ARCHIVED',
} as const;
2 changes: 1 addition & 1 deletion generated/model/courseListResponse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,6 @@
import type { CourseListResponseItem } from './courseListResponseItem';

/**
* Опубликованные курсы.
* Опубликованные курсы, кроме архивных.
*/
export type CourseListResponse = CourseListResponseItem[];
7 changes: 6 additions & 1 deletion generated/model/courseListResponseItem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
* OpenAPI spec version: 1.0.0
*/
import type { CourseListResponseItemAccessMode } from './courseListResponseItemAccessMode';
import type { CourseListResponseItemStatus } from './courseListResponseItemStatus';

/**
* Карточка курса в каталоге.
Expand All @@ -48,10 +49,14 @@ export type CourseListResponseItem = {
thumbnail: string | null;
price: number | null;
discountPrice: number | null;
/** Как открываются закрытые уроки и материалы: `FREE` - курс полностью бесплатный, `PREMIUM` - по премиум-подписке или покупке курса, `PURCHASE` - только покупкой. Купленный курс открыт навсегда в любом режиме. */
/** Как открываются закрытые уроки и материалы: `FREE` - курс полностью бесплатный, `PREMIUM` - только по премиум-подписке, `PURCHASE` - только покупкой курса, `PREMIUM_OR_PURCHASE` - по подписке или покупке на выбор. Купленный курс открыт навсегда в любом режиме, даже если режим потом изменили. */
accessMode: CourseListResponseItemAccessMode;
/** Главный статус курса - его и показывайте, остальные признаки идут отдельными полями. Считается на сервере: `DRAFT` - «В разработке» (публично не отдаётся), `ANNOUNCED` - «Скоро»: курс анонсирован, уроки ещё не выходят и купить его нельзя, `IN_PRODUCTION` - «Выходит поэтапно», `EARLY_ACCESS` - «Ранний доступ» (выходит поэтапно и доступен по подписке или покупке), `COMPLETED` - «Курс завершён», `PUBLICLY_RELEASED` - «Полная версия на YouTube», `ARCHIVED` - «В архиве». */
status: CourseListResponseItemStatus;
/** Есть ли у курса материалы (исходный код). Скачать - `POST /courses/{slug}/materials/link`. */
hasMaterials: boolean;
/** Количество опубликованных уроков. */
lessons: number;
/** Сколько уроков анонсировано, но ещё не вышло. */
upcomingLessons: number;
};
3 changes: 2 additions & 1 deletion generated/model/courseListResponseItemAccessMode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
*/

/**
* Как открываются закрытые уроки и материалы: `FREE` - курс полностью бесплатный, `PREMIUM` - по премиум-подписке или покупке курса, `PURCHASE` - только покупкой. Купленный курс открыт навсегда в любом режиме.
* Как открываются закрытые уроки и материалы: `FREE` - курс полностью бесплатный, `PREMIUM` - только по премиум-подписке, `PURCHASE` - только покупкой курса, `PREMIUM_OR_PURCHASE` - по подписке или покупке на выбор. Купленный курс открыт навсегда в любом режиме, даже если режим потом изменили.
*/
export type CourseListResponseItemAccessMode = typeof CourseListResponseItemAccessMode[keyof typeof CourseListResponseItemAccessMode];

Expand All @@ -43,4 +43,5 @@ export const CourseListResponseItemAccessMode = {
FREE: 'FREE',
PREMIUM: 'PREMIUM',
PURCHASE: 'PURCHASE',
PREMIUM_OR_PURCHASE: 'PREMIUM_OR_PURCHASE',
} as const;
50 changes: 50 additions & 0 deletions generated/model/courseListResponseItemStatus.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* Generated by orval 🍺
* Do not edit manually.
* TeaCoder API
* API образовательной платформы [TeaCoder](https://teacoder.ru): курсы и уроки, прогресс обучения, аккаунты, оплата.
*
* ## Авторизация
*
* После входа сессия держится на двух токенах, и каждый живёт только в одном месте:
*
* - **access** - короткоживущий JWT, приходит **только в теле ответа** (`accessToken`). В cookie сервер его не кладёт. Храните его в памяти приложения (не в `localStorage`) и передавайте в заголовке `Authorization: Bearer <token>`.
* - **refresh** - долгоживущий токен, приходит **только в httpOnly-cookie `tc_refresh`**. В теле ответа его нет, и JavaScript на странице его не видит. Cookie ограничена путём `/auth/refresh`, так что к остальным запросам браузер её не прикладывает.
*
* Когда access-токен истёк (ответ 401) или приложение открыли заново, вызовите `POST /auth/refresh` без тела, с `credentials: 'include'`. Браузер сам отправит cookie, в ответ придёт новый `accessToken`, а cookie обновится. Refresh-токен одноразовый: повторное использование старого завершает сессию целиком.
*
* Защищённые методы помечены замком.
*
* ## Ошибки
*
* Успешный ответ - сами данные, без обёртки. Любая ошибка приходит в одном формате:
*
* ```json
* { "status": 400, "messages": ["Invalid email or password"] }
* ```
*
* `status` совпадает с HTTP-кодом, в `messages` - по одной строке на проблему (при ошибках валидации их может быть несколько).
*
* ## Повторные запросы и оплата
*
* Повторное создание платежа тем же способом возвращает его открытый счёт. Неоплаченный счёт другим способом не блокирует новый: пользователь может выбрать СБП, карту или криптовалюту, не дожидаясь истечения предыдущего счёта. Платёж в статусе PROCESSING по этому товару блокирует создание новых счетов до завершения обработки.
*
* `POST /billing/create` принимает заголовок `Idempotency-Key` (например, UUID): повтор с тем же ключом и теми же параметрами вернёт тот же платёж, с другими параметрами - ошибку 422. Подробности - в описании метода.
* OpenAPI spec version: 1.0.0
*/

/**
* Главный статус курса - его и показывайте, остальные признаки идут отдельными полями. Считается на сервере: `DRAFT` - «В разработке» (публично не отдаётся), `ANNOUNCED` - «Скоро»: курс анонсирован, уроки ещё не выходят и купить его нельзя, `IN_PRODUCTION` - «Выходит поэтапно», `EARLY_ACCESS` - «Ранний доступ» (выходит поэтапно и доступен по подписке или покупке), `COMPLETED` - «Курс завершён», `PUBLICLY_RELEASED` - «Полная версия на YouTube», `ARCHIVED` - «В архиве».
*/
export type CourseListResponseItemStatus = typeof CourseListResponseItemStatus[keyof typeof CourseListResponseItemStatus];


export const CourseListResponseItemStatus = {
DRAFT: 'DRAFT',
ANNOUNCED: 'ANNOUNCED',
IN_PRODUCTION: 'IN_PRODUCTION',
EARLY_ACCESS: 'EARLY_ACCESS',
COMPLETED: 'COMPLETED',
PUBLICLY_RELEASED: 'PUBLICLY_RELEASED',
ARCHIVED: 'ARCHIVED',
} as const;
Loading
Loading