Files
fnx_web/svelte/src/lib/PixeldrainAPI.ts

144 lines
3.3 KiB
TypeScript
Raw Normal View History

2025-03-21 12:57:53 +01:00
// Response types
// ==============
export type GenericResponse = {
value: string,
message: string,
2025-03-25 17:58:26 +01:00
errors?: GenericResponse[],
extra?: { [index: string]: Object },
2025-03-21 12:57:53 +01:00
}
export type User = {
username: string,
email: string,
2025-03-25 17:58:26 +01:00
otp_enabled: boolean,
2025-03-21 12:57:53 +01:00
subscription: Subscription,
storage_space_used: number,
filesystem_storage_used: number,
is_admin: boolean,
balance_micro_eur: number,
hotlinking_enabled: boolean,
monthly_transfer_cap: number,
monthly_transfer_used: number,
file_viewer_branding: Map<string, string>,
file_embed_domains: string,
skip_file_viewer: boolean,
affiliate_user_name: string,
checkout_country: string,
checkout_name: string,
checkout_provider: string,
2025-03-21 12:57:53 +01:00
}
export type Subscription = {
id: string,
name: string,
type: string,
file_size_limit: number,
file_expiry_days: number,
storage_space: number,
price_per_tb_storage: number,
price_per_tb_bandwidth: number,
monthly_transfer_cap: number,
file_viewer_branding: boolean,
filesystem_access: boolean,
filesystem_storage_limit: number,
}
// Utility funcs
// =============
export const get_endpoint = () => {
if ((window as any).api_endpoint !== undefined) {
return (window as any).api_endpoint as string
}
console.warn("api_endpoint property is not defined on window")
return "/api"
}
export const get_hostname = () => {
if ((window as any).server_hostname !== undefined) {
return (window as any).server_hostname as string
}
console.warn("server_hostname property is not defined on window")
return "undefined"
}
2025-03-21 12:57:53 +01:00
export const check_response = async (resp: Response) => {
let text = await resp.text()
if (resp.status >= 400) {
let error: any
try {
error = JSON.parse(text) as GenericResponse
} catch (err) {
error = text
}
throw error
}
return JSON.parse(text)
}
export const dict_to_form = (dict: Object) => {
let form = new FormData()
for (let key of Object.keys(dict)) {
if (dict[key] === undefined) {
continue
} else if (dict[key] instanceof Date) {
form.append(key, new Date(dict[key]).toISOString())
} else if (typeof dict[key] === "object") {
form.append(key, JSON.stringify(dict[key]))
} else {
form.append(key, dict[key])
}
}
return form
}
// API methods
// ===========
export type UserSession = {
auth_key: string,
creation_ip_address: string,
user_agent: string,
app_name: string,
creation_time: string,
last_used_time: string,
valid_domains: string[],
}
2025-10-09 15:48:23 +02:00
let cached_user: User = null
export const get_user = async (): Promise<User> => {
2025-03-21 12:57:53 +01:00
if ((window as any).user !== undefined) {
return (window as any).user as User
2025-10-09 15:48:23 +02:00
} else if (cached_user !== null) {
return cached_user
2025-03-21 12:57:53 +01:00
}
console.warn("user property is not defined on window")
2025-10-09 15:48:23 +02:00
cached_user = await check_response(await fetch(get_endpoint() + "/user")) as User
return cached_user
2025-03-21 12:57:53 +01:00
}
export const put_user = async (data: Object) => {
check_response(await fetch(
get_endpoint() + "/user",
{ method: "PUT", body: dict_to_form(data) },
))
// Update the window.user variable
for (let key of Object.keys(data)) {
((window as any).user as User)[key] = data[key]
}
}
export type VATRate = {
name: string,
vat: number,
alpha2: string,
alpha3: string,
}
export const get_misc_vat_rate = async (country_code: string) => {
return await check_response(await fetch(get_endpoint() + "/misc/vat_rate/" + country_code)) as VATRate
}