import { AxiosResponse } from "axios"; import { useHTTP } from "hooks"; import { Scope, Team, User } from "models"; import { permissionToString } from "pbHelpers/Permission"; import { pond } from "protobuf-ts/pond"; import { useGlobalState } from "providers"; import { createContext, PropsWithChildren, useContext } from "react"; import { objectQueryParams, pondURL } from "./pond"; export interface IPermissionAPIContext { getPermissions: (user: string, scope: Scope) => Promise>; removePermissions: (user: string, scope: Scope) => Promise>; updatePermissions: (scope: Scope, users: User[] | Team[]) => Promise>; updateRelativePermissions: ( parentScope: Scope, childScope: Scope, permissions: pond.Permission[] ) => Promise>; shareObject: ( scope: Scope, email: string, permissions: pond.Permission[], useImitation?: boolean ) => Promise>; shareObjectByKey: ( scope: Scope, key: string, permissions: pond.Permission[] ) => Promise>; addShareableLink: (scope: Scope, expiration: string) => Promise>; removeShareableLink: (scope: Scope, code: string) => Promise>; listShareableLinks: (scope: Scope) => Promise>; getShareableLink: (scope: Scope, code: string) => Promise>; } export const PermissionAPIContext = createContext( {} as IPermissionAPIContext ); interface Props {} export default function PermissionProvider(props: PropsWithChildren) { const { children } = props; const { get, del, put, post } = useHTTP(); const [{ as }] = useGlobalState(); const getPermissions = (user: string, scope: Scope) => { return new Promise((resolve, reject) => { get(pondURL("/users/" + user + "/permissions" + objectQueryParams(scope))).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; const removePermissions = (user: string, scope: Scope) => { return new Promise((resolve, reject) => { del(pondURL("/users/" + user + "/permissions" + objectQueryParams(scope))).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; const updatePermissions = (scope: Scope, users: User[] | Team[]) => { interface user { id: string; permissions: string[]; } interface request { users: user[]; } let body: request = { users: [] }; users.forEach((user: User | Team) => { body.users.push({ id: user.id(), permissions: user.permissions.map(permission => permissionToString(permission)) }); }); return new Promise((resolve, reject) => { put(pondURL("/" + scope.kind + "s/" + scope.key + "/permissions"), body).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; const shareObject = ( scope: Scope, email: string, permissions: pond.Permission[], useImitation = true ) => { let sql = "/" + scope.kind + "s/" + scope.key + "/share"; if (as && useImitation) sql = sql + "?as=" + as; return new Promise((resolve, reject) => { post(pondURL(sql), { email: email, permissions: permissions.map(permission => permissionToString(permission)) }).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; const updateRelativePermissions = ( parentScope: Scope, childScope: Scope, permissions: pond.Permission[] ) => { let sql = "/updateRelativePermissions"; if (as) sql = sql + "?as=" + as; return new Promise((resolve, reject) => { put(pondURL(sql), { parent: parentScope.key, parentType: parentScope.kind, child: childScope.key, childType: childScope.kind, permissions: permissions.map(permission => permissionToString(permission)) }).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; const shareObjectByKey = (scope: Scope, key: string, permissions: pond.Permission[]) => { let url = pondURL("/" + scope.kind + "s/" + scope.key + "/shareByKey") if (as) url = pondURL(`/${scope.kind}s/${scope.key}/shareByKey?as=${as}`) return new Promise((resolve, reject) => { post(url, { key: key, permissions: permissions.map(permission => permissionToString(permission)) }).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; const addShareableLink = (scope: Scope, expiration: string) => { let shareBody: pond.ShareableLinkSettings = pond.ShareableLinkSettings.create({ expiration: expiration }); return new Promise((resolve, reject) => { return post(pondURL("/" + scope.kind + "s/" + scope.key + "/links"), shareBody).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; const removeShareableLink = (scope: Scope, code: string) => { return new Promise((resolve, reject) => { del(pondURL("/" + scope.kind + "s/" + scope.key + "/links/" + code)).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; const listShareableLinks = (scope: Scope) => { return new Promise((resolve, reject) => { get(pondURL("/" + scope.kind + "s/" + scope.key + "/links")).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; const getShareableLink = (scope: Scope, code: string) => { return new Promise((resolve, reject) => { get(pondURL("/" + scope.kind + "s/" + scope.key + "/links/" + code)).then(resp => { return resolve(resp) }).catch(err => { return reject(err) }) }) }; return ( {children} ); } export const usePermissionAPI = () => useContext(PermissionAPIContext);