createUserLoader
Function: createUserLoader()
createUserLoader(
db,cache):DataLoader<string, {addressLine1:string|null;addressLine2:string|null;avatarMimeType:"image/avif"|"image/jpeg"|"image/png"|"image/webp"|null;avatarName:string|null;birthDate:Date|null;city:string|null;countryCode:"ad"|"ae"|"af"|"ag"|"ai"|"al"|"am"|"ao"|"aq"|"ar"|"as"|"at"|"au"|"aw"|"ax"|"az"|"ba"|"bb"|"bd"|"be"|"bf"|"bg"|"bh"|"bi"|"bj"|"bl"|"bm"|"bn"|"bo"|"bq"|"br"|"bs"|"bt"|"bv"|"bw"|"by"|"bz"|"ca"|"cc"|"cd"|"cf"|"cg"|"ch"|"ci"|"ck"|"cl"|"cm"|"cn"|"co"|"cr"|"cu"|"cv"|"cw"|"cx"|"cy"|"cz"|"de"|"dj"|"dk"|"dm"|"do"|"dz"|"ec"|"ee"|"eg"|"eh"|"er"|"es"|"et"|"fi"|"fj"|"fk"|"fm"|"fo"|"fr"|"ga"|"gb"|"gd"|"ge"|"gf"|"gg"|"gh"|"gi"|"gl"|"gm"|"gn"|"gp"|"gq"|"gr"|"gs"|"gt"|"gu"|"gw"|"gy"|"hk"|"hm"|"hn"|"hr"|"ht"|"hu"|"id"|"ie"|"il"|"im"|"in"|"io"|"iq"|"ir"|"is"|"it"|"je"|"jm"|"jo"|"jp"|"ke"|"kg"|"kh"|"ki"|"km"|"kn"|"kp"|"kr"|"kw"|"ky"|"kz"|"la"|"lb"|"lc"|"li"|"lk"|"lr"|"ls"|"lt"|"lu"|"lv"|"ly"|"ma"|"mc"|"md"|"me"|"mf"|"mg"|"mh"|"mk"|"ml"|"mm"|"mn"|"mo"|"mp"|"mq"|"mr"|"ms"|"mt"|"mu"|"mv"|"mw"|"mx"|"my"|"mz"|"na"|"nc"|"ne"|"nf"|"ng"|"ni"|"nl"|"no"|"np"|"nr"|"nu"|"nz"|"om"|"pa"|"pe"|"pf"|"pg"|"ph"|"pk"|"pl"|"pm"|"pn"|"pr"|"ps"|"pt"|"pw"|"py"|"qa"|"re"|"ro"|"rs"|"ru"|"rw"|"sa"|"sb"|"sc"|"sd"|"se"|"sg"|"sh"|"si"|"sj"|"sk"|"sl"|"sm"|"sn"|"so"|"sr"|"ss"|"st"|"sv"|"sx"|"sy"|"sz"|"tc"|"td"|"tf"|"tg"|"th"|"tj"|"tk"|"tl"|"tm"|"tn"|"to"|"tr"|"tt"|"tv"|"tw"|"tz"|"ua"|"ug"|"um"|"us"|"uy"|"uz"|"va"|"vc"|"ve"|"vg"|"vi"|"vn"|"vu"|"wf"|"ws"|"ye"|"yt"|"za"|"zm"|"zw"|null;createdAt:Date;creatorId:string|null;description:string|null;educationGrade:"kg"|"grade_1"|"grade_2"|"grade_3"|"grade_4"|"grade_5"|"grade_6"|"grade_7"|"grade_8"|"grade_9"|"grade_10"|"grade_11"|"grade_12"|"graduate"|"no_grade"|"pre_kg"|null;emailAddress:string;employmentStatus:"full_time"|"part_time"|"unemployed"|null;failedLoginAttempts:number;homePhoneNumber:string|null;id:string;isEmailAddressVerified:boolean;lastFailedLoginAt:Date|null;lockedUntil:Date|null;maritalStatus:"divorced"|"engaged"|"married"|"seperated"|"single"|"widowed"|null;mobilePhoneNumber:string|null;name:string;natalSex:"female"|"intersex"|"male"|null;naturalLanguageCode:"ae"|"af"|"am"|"ar"|"as"|"az"|"ba"|"be"|"bg"|"bi"|"bm"|"bn"|"bo"|"br"|"bs"|"ca"|"ch"|"co"|"cr"|"cu"|"cv"|"cy"|"de"|"dz"|"ee"|"es"|"et"|"fi"|"fj"|"fo"|"fr"|"ga"|"gd"|"gl"|"gn"|"gu"|"hr"|"ht"|"hu"|"id"|"ie"|"io"|"is"|"it"|"kg"|"ki"|"km"|"kn"|"kr"|"kw"|"ky"|"la"|"lb"|"li"|"lt"|"lu"|"lv"|"mg"|"mh"|"mk"|"ml"|"mn"|"mr"|"ms"|"mt"|"my"|"na"|"ne"|"ng"|"nl"|"no"|"nr"|"om"|"pa"|"pl"|"ps"|"pt"|"ro"|"ru"|"rw"|"sa"|"sc"|"sd"|"se"|"sg"|"si"|"sk"|"sl"|"sm"|"sn"|"so"|"sr"|"ss"|"st"|"sv"|"tg"|"th"|"tk"|"tl"|"tn"|"to"|"tr"|"tt"|"tw"|"ug"|"uz"|"ve"|"vi"|"za"|"aa"|"ab"|"ak"|"an"|"av"|"ay"|"ce"|"cs"|"da"|"dv"|"el"|"en"|"eo"|"eu"|"fa"|"ff"|"fy"|"gv"|"ha"|"he"|"hi"|"ho"|"hy"|"hz"|"ia"|"ig"|"ii"|"ik"|"iu"|"ja"|"jv"|"ka"|"kj"|"kk"|"kl"|"ko"|"ks"|"ku"|"kv"|"lg"|"ln"|"lo"|"mi"|"nb"|"nd"|"nn"|"nv"|"ny"|"oc"|"oj"|"or"|"os"|"pi"|"qu"|"rm"|"rn"|"sq"|"su"|"sw"|"ta"|"te"|"ti"|"ts"|"ty"|"uk"|"ur"|"vo"|"wa"|"wo"|"xh"|"yi"|"yo"|"zh"|"zu"|null;passwordHash:string;postalCode:string|null;role:"administrator"|"regular";state:string|null;updatedAt:Date|null;updaterId:string|null;workPhoneNumber:string|null; } |null,string>
Defined in: src/utilities/dataloaders/userLoader.ts:30
Creates a DataLoader for batching user lookups by ID. When a cache service is provided, wraps the batch function with cache-first logic.
Parameters
db
The Drizzle client instance for database operations.
cache
Optional cache service for cache-first lookups. Pass null to disable caching.
CacheService | null
Returns
DataLoader<string, { addressLine1: string | null; addressLine2: string | null; avatarMimeType: "image/avif" | "image/jpeg" | "image/png" | "image/webp" | null; avatarName: string | null; birthDate: Date | null; city: string | null; countryCode: "ad" | "ae" | "af" | "ag" | "ai" | "al" | "am" | "ao" | "aq" | "ar" | "as" | "at" | "au" | "aw" | "ax" | "az" | "ba" | "bb" | "bd" | "be" | "bf" | "bg" | "bh" | "bi" | "bj" | "bl" | "bm" | "bn" | "bo" | "bq" | "br" | "bs" | "bt" | "bv" | "bw" | "by" | "bz" | "ca" | "cc" | "cd" | "cf" | "cg" | "ch" | "ci" | "ck" | "cl" | "cm" | "cn" | "co" | "cr" | "cu" | "cv" | "cw" | "cx" | "cy" | "cz" | "de" | "dj" | "dk" | "dm" | "do" | "dz" | "ec" | "ee" | "eg" | "eh" | "er" | "es" | "et" | "fi" | "fj" | "fk" | "fm" | "fo" | "fr" | "ga" | "gb" | "gd" | "ge" | "gf" | "gg" | "gh" | "gi" | "gl" | "gm" | "gn" | "gp" | "gq" | "gr" | "gs" | "gt" | "gu" | "gw" | "gy" | "hk" | "hm" | "hn" | "hr" | "ht" | "hu" | "id" | "ie" | "il" | "im" | "in" | "io" | "iq" | "ir" | "is" | "it" | "je" | "jm" | "jo" | "jp" | "ke" | "kg" | "kh" | "ki" | "km" | "kn" | "kp" | "kr" | "kw" | "ky" | "kz" | "la" | "lb" | "lc" | "li" | "lk" | "lr" | "ls" | "lt" | "lu" | "lv" | "ly" | "ma" | "mc" | "md" | "me" | "mf" | "mg" | "mh" | "mk" | "ml" | "mm" | "mn" | "mo" | "mp" | "mq" | "mr" | "ms" | "mt" | "mu" | "mv" | "mw" | "mx" | "my" | "mz" | "na" | "nc" | "ne" | "nf" | "ng" | "ni" | "nl" | "no" | "np" | "nr" | "nu" | "nz" | "om" | "pa" | "pe" | "pf" | "pg" | "ph" | "pk" | "pl" | "pm" | "pn" | "pr" | "ps" | "pt" | "pw" | "py" | "qa" | "re" | "ro" | "rs" | "ru" | "rw" | "sa" | "sb" | "sc" | "sd" | "se" | "sg" | "sh" | "si" | "sj" | "sk" | "sl" | "sm" | "sn" | "so" | "sr" | "ss" | "st" | "sv" | "sx" | "sy" | "sz" | "tc" | "td" | "tf" | "tg" | "th" | "tj" | "tk" | "tl" | "tm" | "tn" | "to" | "tr" | "tt" | "tv" | "tw" | "tz" | "ua" | "ug" | "um" | "us" | "uy" | "uz" | "va" | "vc" | "ve" | "vg" | "vi" | "vn" | "vu" | "wf" | "ws" | "ye" | "yt" | "za" | "zm" | "zw" | null; createdAt: Date; creatorId: string | null; description: string | null; educationGrade: "kg" | "grade_1" | "grade_2" | "grade_3" | "grade_4" | "grade_5" | "grade_6" | "grade_7" | "grade_8" | "grade_9" | "grade_10" | "grade_11" | "grade_12" | "graduate" | "no_grade" | "pre_kg" | null; emailAddress: string; employmentStatus: "full_time" | "part_time" | "unemployed" | null; failedLoginAttempts: number; homePhoneNumber: string | null; id: string; isEmailAddressVerified: boolean; lastFailedLoginAt: Date | null; lockedUntil: Date | null; maritalStatus: "divorced" | "engaged" | "married" | "seperated" | "single" | "widowed" | null; mobilePhoneNumber: string | null; name: string; natalSex: "female" | "intersex" | "male" | null; naturalLanguageCode: "ae" | "af" | "am" | "ar" | "as" | "az" | "ba" | "be" | "bg" | "bi" | "bm" | "bn" | "bo" | "br" | "bs" | "ca" | "ch" | "co" | "cr" | "cu" | "cv" | "cy" | "de" | "dz" | "ee" | "es" | "et" | "fi" | "fj" | "fo" | "fr" | "ga" | "gd" | "gl" | "gn" | "gu" | "hr" | "ht" | "hu" | "id" | "ie" | "io" | "is" | "it" | "kg" | "ki" | "km" | "kn" | "kr" | "kw" | "ky" | "la" | "lb" | "li" | "lt" | "lu" | "lv" | "mg" | "mh" | "mk" | "ml" | "mn" | "mr" | "ms" | "mt" | "my" | "na" | "ne" | "ng" | "nl" | "no" | "nr" | "om" | "pa" | "pl" | "ps" | "pt" | "ro" | "ru" | "rw" | "sa" | "sc" | "sd" | "se" | "sg" | "si" | "sk" | "sl" | "sm" | "sn" | "so" | "sr" | "ss" | "st" | "sv" | "tg" | "th" | "tk" | "tl" | "tn" | "to" | "tr" | "tt" | "tw" | "ug" | "uz" | "ve" | "vi" | "za" | "aa" | "ab" | "ak" | "an" | "av" | "ay" | "ce" | "cs" | "da" | "dv" | "el" | "en" | "eo" | "eu" | "fa" | "ff" | "fy" | "gv" | "ha" | "he" | "hi" | "ho" | "hy" | "hz" | "ia" | "ig" | "ii" | "ik" | "iu" | "ja" | "jv" | "ka" | "kj" | "kk" | "kl" | "ko" | "ks" | "ku" | "kv" | "lg" | "ln" | "lo" | "mi" | "nb" | "nd" | "nn" | "nv" | "ny" | "oc" | "oj" | "or" | "os" | "pi" | "qu" | "rm" | "rn" | "sq" | "su" | "sw" | "ta" | "te" | "ti" | "ts" | "ty" | "uk" | "ur" | "vo" | "wa" | "wo" | "xh" | "yi" | "yo" | "zh" | "zu" | null; passwordHash: string; postalCode: string | null; role: "administrator" | "regular"; state: string | null; updatedAt: Date | null; updaterId: string | null; workPhoneNumber: string | null; } | null, string>
A DataLoader that batches and caches user lookups within a single request.
Example
const userLoader = createUserLoader(drizzleClient, cacheService);
const user = await userLoader.load(userId);