133 lines
3.5 KiB
Markdown
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
|