All files backendAbstract.ts

83.91% Statements 73/87
100% Branches 3/3
33.33% Functions 2/6
83.91% Lines 73/87

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 881x 1x 1x 1x 1x 1x 1x 1x 1x 1x           1x 1x   1x 1x               1x 1x 1x   1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 30x 30x 30x 30x 30x 1x 1x 12x 12x 12x 12x 12x  
import {
  ContractType,
  ManageableFields,
  AuthInput,
  AuthenticationDefinition,
  Implementation,
  HandleResult
} from './globalTypes.js'
 
export const authorizedByPermission = (
  auth: AuthenticationDefinition,
  authInput: AuthInput
) =>
  typeof auth === 'boolean' ||
  auth.some(x => (authInput.permissions || []).some(y => x === y))
 
export const getUserIdFields = (fields: ManageableFields): string[] =>
  Object.entries(fields).filter(x => x[1]).map(x => x[0])
 
export const filterToAccess = (
  input: any[],
  auth: AuthenticationDefinition,
  authInput: AuthInput,
  fields: ManageableFields
): any[] =>
  authorizedByPermission(auth, authInput) ? input : input.filter((x: any) =>
    getUserIdFields(fields).some(y => x[y] === authInput.sub)
  )
 
export const keyId = (index: string, id: string): string =>
  `${index}:records:${id}`
 
export type Get<IMPL extends Implementation> = <IN, OUT>(
  contract: ContractType<'GET', IMPL, IN, OUT>,
  auth: AuthInput,
  id: string | string[] | undefined,
  body?: IN
) => Promise<HandleResult<OUT>>
 
export type Post<IMPL extends Implementation> = <IN, OUT>(
  contract: ContractType<'POST', IMPL, IN, OUT>,
  auth: AuthInput,
  id: string | undefined,
  body: IN
) => Promise<HandleResult<OUT>>
 
export type Delete<IMPL extends Implementation> = <IN, OUT>(
  contract: ContractType<'DELETE', IMPL, IN, OUT>,
  auth: AuthInput,
  id: string | string[]
) => Promise<HandleResult<OUT>>
 
export type Patch<IMPL extends Implementation> = <IN, OUT>(
  contract: ContractType<'PATCH', IMPL, IN, OUT>,
  auth: AuthInput,
  id: string,
  body: IN
) => Promise<HandleResult<OUT>>
 
export type Put<IMPL extends Implementation> = <IN, OUT>(
  contract: ContractType<'PUT', IMPL, IN, OUT>,
  auth: AuthInput,
  id: string,
  body: IN
) => Promise<HandleResult<OUT>>
 
export type AbstractBackend<K extends Implementation> = {
  get: Get<K>
  post: Post<K>
  delete: Delete<K>
  patch: Patch<K>
  put: Put<K>
}
 
export const forbidden = (data: any, errors: string[] = ['forbidden']) => ({
  errorType: 'forbidden',
  data,
  status: 403,
  errors
})
 
export const notFound = (data: any, errors: string[] = ['not found']) => ({
  errorType: 'notFound',
  data,
  status: 404,
  errors
})