From 8665d769b9925fdf00cdbd801d27a617ce262888 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 25 Feb 2024 01:17:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20contextAsync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/examples/contextAsync.md | 60 +++++++++++++++++++++++++++++++++++ docs/guide.md | 11 +++++++ src/NetSchoolApi.ts | 16 ++++++++++ 3 files changed, 87 insertions(+) create mode 100644 docs/examples/contextAsync.md diff --git a/docs/examples/contextAsync.md b/docs/examples/contextAsync.md new file mode 100644 index 0000000..dd61d6a --- /dev/null +++ b/docs/examples/contextAsync.md @@ -0,0 +1,60 @@ +# Пример использования значения `.contextAsync` + +- [Зачем нужен?](#зачем-нужен) +- [Как использовать?](#как-использовать) +- [Назад к методам](../guide.md#contextasync) + +## Зачем нужен? + +Это значение позволяет получить доступ к [контексту](../reference.md#context) без предварительной авторизации. + +## Как использовать? + +> Не работает при импорте класса `Safe` + +Представим, что мы хотим получить оценки первого предмета из доступных и чтобы не вызывать авторизацию, мы можем воспользоваться этим значением. + +```typescript +import NS from "netschoolapi"; + +const user = new NS({ + origin: "https://example.com", + login: "Иванов", + password: "123456", + school: "МБОУ ...", // Название школы (полностью) или её id +}); + +(async function () { + // Получаем массив предметов + const { subjects } = await user.contextAsync; + + // Получаем отчет "Отчет об успеваемости ученика" + const report = await user.grades({ subjectId: subjects[0].id }); + console.log(report); +})(); +``` + +Без этого значения код выглядел бы следующим образом: + +```typescript +import NS from "netschoolapi"; + +const user = new NS({ + origin: "https://example.com", + login: "Иванов", + password: "123456", + school: "МБОУ ...", // Название школы (полностью) или её id +}); + +(async function () { + // Авторизуемся + await user.logIn(); + + // Получаем массив предметов + const { subjects } = await user.context; + + // Получаем отчет "Отчет об успеваемости ученика" + const report = await user.grades({ subjectId: subjects[0].id }); + console.log(report); +})(); +``` diff --git a/docs/guide.md b/docs/guide.md index fa16386..33ace0f 100644 --- a/docs/guide.md +++ b/docs/guide.md @@ -21,6 +21,7 @@ - [.journal()](#journal) - [Дополнительно](#дополнительно) - [.fetch()](#fetch) + - [.contextAsync](#contextasync) ## Управление сессией @@ -228,3 +229,13 @@ #### Возвращает объект класса [Response](https://www.npmjs.com/package/node-fetch#class-response) #### [Пример использования](examples/fetch.md) + +--- + +### .contextAsync + +> Это значение, а не метод, и оно не доступно в классе `Safe`. + +#### Возвращает объект класса [Context](reference.md#context), представляющий асинхронный контекст + +#### [Пример использования](examples/contextAsync.md) diff --git a/src/NetSchoolApi.ts b/src/NetSchoolApi.ts index ad754e3..0759b1a 100644 --- a/src/NetSchoolApi.ts +++ b/src/NetSchoolApi.ts @@ -48,6 +48,22 @@ export default class NetSchoolApi extends NS { }); } + /** Контекст который доступен без авторизации */ + get contextAsync(): Promise> { + // Если нет контекста, то создаём (через авторизацию) + return new Promise((resolve, reject) => { + if (this.context) { + resolve(this.context); + } else { + this.logIn() + .then(() => { + resolve(this.context as NonNullable); + }) + .catch(reject); + } + }); + } + /** Открытие сессии (только если она закрыта) */ async logIn(): Promise { const valid = await super.sessionValid();