import Users from "./requests/Users.js";
import Calendar from "./requests/Calendar.js";
import Activity from "./requests/Activity.js";
import Accounts from "./requests/Accounts.js";
import TaskService from "./requests/TaskService.js";
import LearningTasks from "./requests/LearningTasks.js";
/**
* API Client for Compass Edu
* @module CompassClient
* @param {string} domain - School domain for Compass
* @param {string} cookies - Cookies to authorise API requests
* @param {*} [customFetch] - custom fetch function (node-fetch)
* @example const client = CompassClient('school.compass.education','ASP.NET_SessionId=...')
*/
async function CompassClient(domain, cookies, customFetch){
/**
* @memberof module:CompassClient
* @param {"Accounts"|"Calendar"|"Activity"|"FileAssets"|"TaskService"|"LearningTasks"|"User"} service - API service to use
* @param {string} location - API location to use
* @param {any} [data] - Data to send with request (optional).
* @param {"POST"|"GET"} [method] - HTTP Method for request, default to POST
* @returns {Promise<any>} Promise resolves reponse JSON
* @example client.newRequest("Accounts","getAccount",null,"POST")
*/
const _fetch = customFetch || fetch
async function newRequest(service,location,data,method) {
let url = `https://${domain}/Services/${service}.svc/${location}`
const res = await _fetch(url, {
"method": method || "POST",
"body": JSON.stringify(data),
"headers": {
"accept": "*/*",
"content-type": "application/json",
"cookie": cookies,
}
})
if(!res.ok) throw new Error(res.statusText+" "+res.url.replace('https://'+domain,''))
console.log(res.status+' '+res.statusText+' | '+res.url)
let json = await res.json()
// @ts-ignore
return json.d
}
/**
* @memberof module:CompassClient
* @param {string} id - Compass File Id
* @param {string} nodeId - Compass Node Id
* @returns {Promise<string>} Returns file as String
*/
async function downloadFile(id,nodeId) {
let url = `https://${domain}/Services/FileAssets.svc/DownloadFile?id=${id}&nodeId=${nodeId}`
const res = await _fetch(url, {
"method": "GET",
"headers": {
"accept": "*/*",
"content-type": "application/json",
"cookie": cookies,
},
})
if(!res.ok) throw new Error(res.statusText+" "+res.url.replace('https://'+domain,''))
return res.text()
}
const _Accounts = Accounts(newRequest)
const initRes = await _Accounts.getAccount()
return{
domain: domain,
userId: initRes.userId,
userInfo: initRes,
newRequest,
downloadFile,
Accounts: _Accounts,
Activity: Activity(newRequest),
Calendar: Calendar(newRequest),
LearningTasks: LearningTasks(newRequest),
TaskService: TaskService(newRequest),
Users: Users(newRequest)
}
}
export default CompassClient
Source