skolplattformen-backup/libs/api-skolplattformen/README.md

133 lines
3.5 KiB
Markdown

# embedded-api
Since the proxy was blocked (and also deemed a bad idea by some), this is a reboot of the API running in process in the app(s).
## Installing
`npm i -S @skolplattformen/embedded-api` or `yarn add @skolplattformen/embedded-api`
## Calling
### Import and init
Since fetch and cookies behave distinctly different in node, react-native and the browser,
the concrete implementation of fetch and cookie handler must be injected.
#### react-native
```javascript
import init from '@skolplattformen/api'
import CookieManager from '@react-native-cookies/cookies'
const api = init(fetch, () => CookieManager.clearAll())
```
#### node
```javascript
import init from '@skolplattformen/api'
import nodeFetch from 'node-fetch'
import fetchCookie from 'fetch-cookie/node-fetch'
import { CookieJar } from 'tough-cookie'
const cookieJar = new CookieJar()
const fetch = fetchCookie(nodeFetch, cookieJar)
const api = init(fetch, cookieJar)
```
### Login / logout
```javascript
api.on('login', async () => {
// do stuff
console.log(api.isLoggedIn) // true
await api.logout()
})
api.on('logout', () => {
// handle logout
console.log(api.isLoggedIn) // false
}
const loginStatus = await api.login('YYYYMMDDXXXX')
window.open(
`https://app.bankid.com/?autostarttoken=${loginStatus.token}&redirect=null`
)
loginStatus.on('PENDING', () => console.log('BankID app not yet opened'))
loginStatus.on('USER_SIGN', () => console.log('BankID app is open'))
loginStatus.on('ERROR', () => console.log('Something went wrong'))
loginStatus.on('OK', () =>
console.log('BankID sign successful. Session will be established.')
)
```
### Loading data
```javascript
// Get current user
const user = await api.getUser()
// List children from Etjanster
const children = await api.getChildren()
// Get school calendar
const calendar = await api.getCalendar(children[0])
// Get classmates - disabled for reasons
// const classmates = await api.getClassmates(children[0])
// Get student's personal schedule
import { DateTime } from 'luxon'
const from = DateTime.local()
const to = DateTime.local().plus({ week: 1 })
const schedule = await api.getSchedule(children[0], from, to)
// Get news
const news = await api.getNews(children[0])
// Get news details
const newsDetails = await api.getNewsDetails(children[0], news[0])
// Get menu
const menu = await api.getMenu(children[0])
// Get notifications
const notifications = await api.getNotifications(children[0])
// Get list of children from Skola24 (because of course it's different *DERP*)
const skola24Children = await getSkola24Children()
// Get timetable
const weekNumber = 15
const year = 2021
const timetable = await api.getTimetable(skola24Children[0], weekNumber, year)
```
### Setting session cookie
It is possible to resurrect a logged in session by manually setting the session cookie.
```javascript
const sessionCookie = 'some value'
api.setSessionCookie(sessionCookie) // will trigger `on('login')` event and set `.isLoggedIn = true`
```
### Fake user
Login with personal number `12121212121212`, `201212121212` or `1212121212` and
api will be put into fake mode.
Static data will be returned and no calls to backend will be made.
The `LoginStatusChecker` returned by the login method will have `.token` set to 'fake'.
## Try it out
1. Clone and enter repo: `git clone git@github.com:kolplattformen/embedded-api.git && cd embedded-api`
2. Install dependencies: `yarn`
3. Build package: `yarn build`
4. Run example: `node run [your personal number]`
5. Sign in with mobile BankID