frontend/src/providers/pond/permissionAPI.tsx
2025-02-24 15:41:06 -06:00

213 lines
6.5 KiB
TypeScript

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<AxiosResponse<any>>;
removePermissions: (user: string, scope: Scope) => Promise<AxiosResponse<any>>;
updatePermissions: (scope: Scope, users: User[] | Team[]) => Promise<AxiosResponse<any>>;
updateRelativePermissions: (
parentScope: Scope,
childScope: Scope,
permissions: pond.Permission[]
) => Promise<AxiosResponse<any>>;
shareObject: (
scope: Scope,
email: string,
permissions: pond.Permission[],
useImitation?: boolean
) => Promise<AxiosResponse<any>>;
shareObjectByKey: (
scope: Scope,
key: string,
permissions: pond.Permission[]
) => Promise<AxiosResponse<any>>;
addShareableLink: (scope: Scope, expiration: string) => Promise<AxiosResponse<any>>;
removeShareableLink: (scope: Scope, code: string) => Promise<AxiosResponse<any>>;
listShareableLinks: (scope: Scope) => Promise<AxiosResponse<any>>;
getShareableLink: (scope: Scope, code: string) => Promise<AxiosResponse<any>>;
}
export const PermissionAPIContext = createContext<IPermissionAPIContext>(
{} as IPermissionAPIContext
);
interface Props {}
export default function PermissionProvider(props: PropsWithChildren<Props>) {
const { children } = props;
const { get, del, put, post } = useHTTP();
const [{ as }] = useGlobalState();
const getPermissions = (user: string, scope: Scope) => {
return new Promise<AxiosResponse>((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<AxiosResponse>((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<AxiosResponse>((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<AxiosResponse>((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<AxiosResponse>((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<AxiosResponse>((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<AxiosResponse>((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<AxiosResponse>((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<AxiosResponse>((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<AxiosResponse>((resolve, reject) => {
get(pondURL("/" + scope.kind + "s/" + scope.key + "/links/" + code)).then(resp => {
return resolve(resp)
}).catch(err => {
return reject(err)
})
})
};
return (
<PermissionAPIContext.Provider
value={{
getPermissions,
removePermissions,
updatePermissions,
updateRelativePermissions,
shareObject,
shareObjectByKey,
addShareableLink,
removeShareableLink,
listShareableLinks,
getShareableLink
}}>
{children}
</PermissionAPIContext.Provider>
);
}
export const usePermissionAPI = () => useContext(PermissionAPIContext);