@etsoo/appscript
Version:
Applications shared TypeScript framework
244 lines (243 loc) • 7.14 kB
JavaScript
import { BaseApi } from "./BaseApi";
import { ActionResult } from "@etsoo/shared";
/**
* Authentication API
*/
export class AuthApi extends BaseApi {
/**
* Admin support
* @param rq Request data
* @param payload Payload
* @returns Result
*/
adminSupport(rq, payload) {
return this.api.post("Auth/AdminSupport", rq, payload);
}
/**
* API refresh token
* @param rq Request data
* @param payload Payload
* @returns Result
*/
apiRefreshToken(rq, payload) {
const data = { ...rq, timeZone: this.app.getTimeZone() };
return this.api.put("Auth/ApiRefreshToken", data, payload);
}
/**
* Authorization request
* @param auth Authorization request data
* @param payload Payload
*/
authRequest(auth, payload) {
return this.api.post("Auth/AuthRequest", auth, payload);
}
/**
* Change password
* @param oldPassword Ole password
* @param password New password
* @param payload Payload
* @returns Result
*/
changePassword(oldPassword, password, payload) {
const rq = {
appId: this.app.settings.appId,
deviceId: this.app.deviceId,
oldPassword: this.app.encrypt(this.app.hash(oldPassword)),
password: this.app.encrypt(this.app.hash(password))
};
return this.api.put("Auth/ChangePassword", rq, payload);
}
/**
* Check user identifier
* @param type User identifier type
* @param openid Open ID
* @param payload Payload
* @returns Result
*/
checkUserIdentifier(type, openid, payload) {
const rq = {
type,
openid: this.app.encrypt(openid),
deviceId: this.app.deviceId,
region: this.app.region
};
return this.api.post("Auth/CheckUserIdentifier", rq, payload);
}
/**
* Exchange token
* @param rq Request data
* @param payload Payload
* @returns Result
*/
exchangeToken(rq, payload) {
const data = { ...rq, timeZone: this.app.getTimeZone() };
return this.api.put("Auth/ExchangeToken", data, payload);
}
/**
* Get auth request
* @param deviceId Device ID
* @param payload Payload
* @param apiHost API host
* @returns Result
*/
getAuthRequest(deviceId, payload, apiHost) {
const rq = {
region: this.app.region,
device: deviceId ?? this.app.deviceId
};
return this.api.post(`${apiHost ?? ""}Auth/GetAuthRequest`, rq, payload);
}
/**
* Get log in url
* @param deviceId Device ID
* @param payload Payload
* @param apiHost API host
* @returns Result
*/
getLogInUrl(deviceId, payload, apiHost) {
const rq = {
region: this.app.region,
device: deviceId ?? this.app.deviceId
};
return this.api.get(`${apiHost ?? ""}Auth/GetLogInUrl`, rq, payload);
}
/**
* Login
* @param rq Request data
* @param payload Payload
* @param tokenKey Refresh token key
* @returns Result
*/
async login(rq, payload, tokenKey) {
// Default values
payload ?? (payload = {});
tokenKey ?? (tokenKey = AuthApi.HeaderTokenField);
const data = {
...rq,
deviceId: this.app.deviceId,
region: this.app.region,
timeZone: this.app.getTimeZone()
};
// Call the API
const result = await this.api.post("Auth/Login", data, payload);
// Get the refresh token
const refreshToken = result?.ok
? this.app.getResponseToken(payload.response, tokenKey)
: null;
// Return the result
return [result, refreshToken];
}
/**
* Login id check
* @param id Check id
* @param payload Payload
* @returns Result
*/
loginId(id, payload) {
const { deviceId, region } = this.app;
id = this.app.encrypt(id);
const rq = {
id,
deviceId,
region,
timeZone: this.app.getTimeZone()
};
return this.api.post("Auth/LoginId", rq, payload);
}
/**
* Refresh token
* @param props Props
* @returns Result
*/
async refreshToken(props) {
// Destruct
const { api = "Auth/RefreshToken", showLoading = false, token, tokenField = AuthApi.HeaderTokenField } = props ?? {};
// Check the token
if (!token) {
return {
ok: false,
type: "noData",
field: "token",
title: this.app.get("noData")
};
}
// Reqest data
const rq = {
deviceId: this.app.deviceId,
timeZone: this.app.getTimeZone()
};
// Payload
const payload = {
// No loading bar needed to avoid screen flicks
showLoading,
config: { headers: { [tokenField]: token } },
onError: () => {
// Prevent further processing
return false;
}
};
// Call API
const result = await this.api.put(api, rq, payload);
if (result == null) {
return this.api.lastError
? ActionResult.create(this.api.lastError)
: {
ok: false,
type: "unknownError",
field: "result",
title: this.app.get("unknownError")
};
}
// Token
const refreshToken = this.app.getResponseToken(payload.response, tokenField);
// Success
return [refreshToken, result];
}
/**
* Reset password
* @param rq Request data
* @param payload Payload
* @returns Result
*/
resetPassword(rq, payload) {
const data = {
...rq,
deviceId: this.app.deviceId,
region: this.app.region,
timezone: this.app.getTimeZone()
};
return this.api.put("Auth/ResetPassword", data, payload);
}
/**
* Signout
* @param rq Request data
* @param payload Payload
* @returns Result
*/
signout(rq, payload) {
return this.api.put("Auth/Signout", rq, payload);
}
/**
* Switch organization
* @param rq Request data
* @param tokenKey Refresh token key
* @param payload Payload
*/
async switchOrg(rq, payload, tokenKey) {
// Default values
payload ?? (payload = {});
tokenKey ?? (tokenKey = AuthApi.HeaderTokenField);
// Call the API
const result = await this.api.put("Auth/SwitchOrg", rq, payload);
// Get the refresh token
const refreshToken = result?.ok
? this.app.getResponseToken(payload.response, tokenKey)
: null;
// Return the result
return [result, refreshToken];
}
}
/**
* Header token field name
*/
AuthApi.HeaderTokenField = "Etsoo-Refresh-Token";