You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
import{Document}from"mongoose";import{FernsRouterOptions}from"./api";import{User}from"./auth";import{logger}from"./logger";exportinterfaceFernsTransformer<T>{// Runs before create or update operations. Allows throwing out fields that the user should be// able to write to, modify data, check permissions, etc.transform?: (obj: Partial<T>,method: "create"|"update",user?: User)=>Partial<T>|undefined;// Runs after create/update operations but before data is returned from the API. Serialize fetched// data, dropping fields based on user, changing data, etc.serialize?: (obj: T,user?: User)=>Partial<T>|undefined;}functiongetUserType(user?: User,obj?: any): "anon"|"auth"|"owner"|"admin"{if(user?.admin){return"admin";}if(obj&&user&&String(obj?.ownerId)===String(user?.id)){return"owner";}if(user?.id){return"auth";}return"anon";}exportfunctionAdminOwnerTransformer<T>(options: {// TODO: do something with KeyOf here.anonReadFields?: string[];authReadFields?: string[];ownerReadFields?: string[];adminReadFields?: string[];anonWriteFields?: string[];authWriteFields?: string[];ownerWriteFields?: string[];adminWriteFields?: string[];}): FernsTransformer<T>{functionpickFields(obj: Partial<T>,fields: any[]): Partial<T>{constnewData: Partial<T>={};for(constfieldoffields){if(obj[field]!==undefined){newData[field]=obj[field];}}returnnewData;}return{// TODO: Migrate AdminOwnerTransform to use pre-hooks.transform: (obj: Partial<T>,method: "create"|"update",user?: User)=>{constuserType=getUserType(user,obj);letallowedFields: any;if(userType==="admin"){allowedFields=options.adminWriteFields??[];}elseif(userType==="owner"){allowedFields=options.ownerWriteFields??[];}elseif(userType==="auth"){allowedFields=options.authWriteFields??[];}else{allowedFields=options.anonWriteFields??[];}constunallowedFields=Object.keys(obj).filter((k)=>!allowedFields.includes(k));if(unallowedFields.length){thrownewError(`User of type ${userType} cannot write fields: ${unallowedFields.join(", ")}`);}returnobj;},serialize: (obj: T,user?: User)=>{constuserType=getUserType(user,obj);if(userType==="admin"){returnpickFields(obj,[...(options.adminReadFields??[]),"id"]);}elseif(userType==="owner"){returnpickFields(obj,[...(options.ownerReadFields??[]),"id"]);}elseif(userType==="auth"){returnpickFields(obj,[...(options.authReadFields??[]),"id"]);}else{returnpickFields(obj,[...(options.anonReadFields??[]),"id"]);}},};}exportfunctiontransform<T>(options: FernsRouterOptions<T>,data: Partial<T>|Partial<T>[],method: "create"|"update",user?: User){if(!options.transformer?.transform){returndata;}logger.warn("transform functions are deprecated, use preCreate/preUpdate/preDelete hooks instead");// TS doesn't realize this is defined otherwise...consttransformFn=options.transformer?.transform;if(!Array.isArray(data)){returntransformFn(data,method,user);}else{returndata.map((d)=>transformFn(d,method,user));}}exportfunctionserialize<T>(options: FernsRouterOptions<T>,data: Document<T,{},{}>|Document<T,{},{}>[],user?: User){constserializeFn=(serializeData: Document<T,{},{}>,seralizeUser?: User)=>{constdataObject=serializeData.toObject()asT;(dataObjectasany).id=serializeData._id;if(options.transformer?.serialize){returnoptions.transformer?.serialize(dataObject,seralizeUser);}else{returndataObject;}};if(!Array.isArray(data)){returnserializeFn(data,user);}else{returndata.map((d)=>serializeFn(d,user));}}
dc17f814cb58f6a6b601f13280beb41398c747e6
The text was updated successfully, but these errors were encountered:
do something with KeyOf here.
ferns-api/src/transformers.ts
Line 30 in ed93382
dc17f814cb58f6a6b601f13280beb41398c747e6
The text was updated successfully, but these errors were encountered: